0

まあ言ってみれば

struct myFace
{
    3DPoint p0;
    3DPoint p1;
    3DPoint p2;
    3DPoint p3;
    3DPoint pNormal;

};

face1 と face2 は myFace のタイプの面です。

double ac = face1.pNormal * face2.pNormal;

if (!(ac<1.00000001 && ac>0.99999999) && !(ac>-1.00000001 && ac<-0.99999999))

その場合、面は平行ではありません。

しかし、それらが交差しているかどうかをどのように検出できますか?

4

1 に答える 1

1

おっと、私のコメントは無視してください。これを行う別の方法を考えました。


  • ステップ1:

F1との場合、の点を 2 つの三角形F2として取ります。たとえば、それぞれ と です。次に、のエッジ、つまり、、、およびを取り、それらのそれぞれを両方の三角形と交差させます。F2(p0, p1, p2)(p1, p2, p3)F1(p0, p1)(p1, p2)(p2, p3)(p3, p0)

これを行うコードを見つけました:( http://geomalgorithms.com/a06-_intersect-2.htmlから適応)

#define SMALL_NUM   0.00000001

/* 
   returns: 0 if no intersection 
            1 if parallel but disjoint
            2 if coplanar
*/
int intersect3D_RayTriangle(Vector P0, Vector P1, Vector V0, Vector V1, Vector V2)
{
    Vector    u, v, n;              // triangle vectors
    Vector    dir, w0, w;           // ray vectors
    float     r, a, b;              // params to calc ray-plane intersect

    // get triangle edge vectors and plane normal
    u = V1 - V0;
    v = V2 - V0;
    n = cross(u, v);

    dir = P1 - P0;             // ray direction vector
    w0 = P0 - V0;
    a = -dot(n, w0);
    b = dot(n, dir);
    if (fabs(b) < SMALL_NUM)   // ray is parallel to triangle plane
        return (fabs(a) < SMALL_NUM ? 2 : 0);

    // get intersect point of ray with triangle plane
    r = a / b;
    if (r < 0.0 || r > 1.0)
        return 0;                   // => no intersect
    Vector I = R.P0 + r * dir;      // intersect point of ray and plane

    // is I inside T?
    float uu, uv, vv, wu, wv, D;
    uu = dot(u, u);
    uv = dot(u, v);
    vv = dot(v, v);
    w = I - V0;
    wu = dot(w, u);
    wv = dot(w, v);
    D = uv * uv - uu * vv;

    // get and test parametric coords
    float s, t;
    s = (uv * wv - vv * wu) / D;
    if (s < 0.0 || s > 1.0)         // I is outside T
        return 0;
    t = (uv * wu - uu * wv) / D;
    if (t < 0.0 || (s + t) > 1.0)  // I is outside T
        return 0;

    return 1;                       // I is in T
}

P0と、 whileP1からのエッジの 1 つを形成し、の三角形の1 つを形成します。F1V0V1V2F2

  • チェックの 1 つ (8 つあるはずです) が 1 を返す場合、それらは確実に交差します (すぐにtrue を返します)。
  • それらのすべてが 0 を返す場合、それらは交差しません。
  • チェックの 1 つが 2 を返した場合 (最初のチェックはおそらくそれを行うでしょう)、別のメソッドが必要です。これらのチェックを停止し、すぐにステップ 2 に進みます。

  • ステップ2:

この部分は、ポリゴンが同一平面上にある (つまり、平行で同じ平面内にある) 場合に使用します。今回は、すべてF1の のエッジとすべての のエッジを取得しF2ます。のエッジごとに、F1のエッジのいずれかと交差するかどうかを確認しF2、1 つのペアが交差する場合は、すぐにtrue を返します。

このようなエッジ交差を行うには: ( https://gist.github.com/hanigamal/6556506から適応)

A0、、およびからA1エッジを形成します。F1B0B1F2

int intersection(Vector A0, Vector A1, Vector B0, Vector B1)
{
   Vector dA = A1 - A0;
   Vector dB = B1 - B0;
   Vector dC = B0 - A0;

   double s = dot(cross(dC, dB), cross(dA, dB)) / norm2(cross(dA, dB));
    return (s >= 0.0 && s <= 1.0);
}
于 2016-03-19T16:24:42.963 に答える