示例#1
0
文件: eli.c 项目: tkoziara/solfec
/* return distance of a spatial point to the ellipsoid */
double ELLIP_Spatial_Point_Distance (void *dummy, ELLIP *eli, double *point)
{
  double q [3];

  return gjk_ellip_point (eli->cur_center, eli->cur_sca, eli->cur_rot, point, q);
}
示例#2
0
/* generate test */
static void gen ()
{
  double d [3], move [3];

  switch (mode)
  {
  case GJK_CONVEX_CONVEX:
  {
    asize = bsize = 0;

    while (asize < minim) asize = rand () % limit;

    while (bsize < minim) bsize = rand () % limit;

    SETRAND (move, 1.0);

    for (int n = 0; n < asize; n ++)
    { SETRAND (apoint [n], 0.75);
      ADD (apoint [n], move, apoint [n]); }

    for (int n = 0; n < bsize; n ++)
    { SETRAND (bpoint [n], 0.75);
      SUB (bpoint [n], move, bpoint [n]); }

    free (a);
    free (b);
    a = hull ((double*)apoint, asize, &alength);
    b = hull ((double*)bpoint, bsize, &blength);

    double *va, *vb;
    int nva, nvb;

    va = TRI_Vertices (a, alength, &nva);
    vb = TRI_Vertices (b, blength, &nvb);

    gjk (va, nva, vb, nvb, p, q);

    free (va);
    free (vb);
  }
  break;
  case GJK_CONVEX_SPHERE:
  {
    asize = bsize = 0;

    while (asize < minim) asize = rand () % limit;

    SETRAND (move, 1.0);

    for (int n = 0; n < asize; n ++)
    { SETRAND (apoint [n], 0.75);
      ADD (apoint [n], move, apoint [n]); }

    free (a);
    a = hull ((double*)apoint, asize, &alength);

    SETRAND (center, 1.0);
    SUB (center, move, center);
    radius = 0.75 * DRAND ();

    double *va;
    int nva;

    va = TRI_Vertices (a, alength, &nva);

    gjk_convex_sphere (va, nva, center, radius, p, q);

    free (va);
  }
  break;
  case GJK_CONVEX_POINT:
  {
    asize = bsize = 0;

    while (asize < minim) asize = rand () % limit;

    SETRAND (move, 1.0);

    for (int n = 0; n < asize; n ++)
    { SETRAND (apoint [n], 0.75);
      ADD (apoint [n], move, apoint [n]); }

    free (a);
    a = hull ((double*)apoint, asize, &alength);

    SETRAND (center, 1.0);
    SUB (center, move, center);
    radius = 0.0;

    double *va;
    int nva;

    va = TRI_Vertices (a, alength, &nva);

    COPY (center, p);
    gjk_convex_point (va, nva, p, q);

    free (va);
  }
  break;
  case GJK_CONVEX_ELLIP:
  {
    asize = bsize = 0;

    while (asize < minim) asize = rand () % limit;

    SETRAND (move, 1.0);

    for (int n = 0; n < asize; n ++)
    { SETRAND (apoint [n], 0.75);
      ADD (apoint [n], move, apoint [n]); }

    free (a);
    a = hull ((double*)apoint, asize, &alength);

    SETRAND (el1_center, 1.0);
    SUB (el1_center, move, el1_center);
    el1_sca [0] = 0.75 * DRAND ();
    el1_sca [1] = 0.75 * DRAND ();
    el1_sca [2] = 0.75 * DRAND ();
    EXPMAP (el1_sca, el1_rot);

    double *va;
    int nva;

    va = TRI_Vertices (a, alength, &nva);

    gjk_convex_ellip (va, nva, el1_center, el1_sca, el1_rot, p, q);

    free (va);
  }
  break;
  case GJK_SPHERE_ELLIP:
  {
    SETRAND (move, 1.0);

    SETRAND (center, 1.0);
    radius = 0.75 * DRAND ();

    SETRAND (el1_center, 1.0);
    SUB (el1_center, move, el1_center);
    el1_sca [0] = 0.75 * DRAND ();
    el1_sca [1] = 0.75 * DRAND ();
    el1_sca [2] = 0.75 * DRAND ();
    EXPMAP (el1_sca, el1_rot);

    gjk_sphere_ellip (center, radius, el1_center, el1_sca, el1_rot, p, q);
  }
  break;
  case GJK_ELLIP_ELLIP:
  {
    SETRAND (move, 1.0);

    SETRAND (el1_center, 1.0);
    el1_sca [0] = 0.75 * DRAND ();
    el1_sca [1] = 0.75 * DRAND ();
    el1_sca [2] = 0.75 * DRAND ();
    EXPMAP (el1_sca, el1_rot);

    SETRAND (el2_center, 1.0);
    SUB (el2_center, move, el2_center);
    el2_sca [0] = 0.75 * DRAND ();
    el2_sca [1] = 0.75 * DRAND ();
    el2_sca [2] = 0.75 * DRAND ();
    EXPMAP (el2_sca, el2_rot);

    gjk_ellip_ellip (el1_center, el1_sca, el1_rot, el2_center, el2_sca, el2_rot, p, q);
  }
  break;
  case GJK_ELLIP_POINT:
  {
    SETRAND (move, 1.0);

    SETRAND (el1_center, 1.0);
    el1_sca [0] = 0.75 * DRAND ();
    el1_sca [1] = 0.75 * DRAND ();
    el1_sca [2] = 0.75 * DRAND ();
    EXPMAP (el1_sca, el1_rot);

    SETRAND (center, 1.0);
    SUB (center, move, center);
    radius = 0.0;

    COPY (center, p);
    gjk_ellip_point (el1_center, el1_sca, el1_rot, p, q);
  }
  break;
  }

  SUB (p, q, d);
  printf ("|p-q|=%g\n", LEN (d));
}