コード例 #1
0
ファイル: QuickHullAlgorithm.cs プロジェクト: vnmone/vvvv-sdk
        private HalfEdge addAdjoiningFace(Vertex eyeVtx, HalfEdge he)
        {
            Face face = Face.createTriangle(eyeVtx, he.tail(), he.head());

            faces.Add(face);
            face.getEdge(-1).setOpposite(he.getOpposite());
            return(face.getEdge(0));
        }
コード例 #2
0
        public HalfEdge findEdge(Vertex vt, Vertex vh)
        {
            HalfEdge he = he0;

            do
            {
                if (he.head() == vh && he.tail() == vt)
                {
                    return(he);
                }
                he = he.next;
            }while (he != he0);
            return(null);
        }
コード例 #3
0
        private double areaSquared(HalfEdge hedge0, HalfEdge hedge1)
        {
            Point3d p0 = hedge0.tail().pnt;
            Point3d p1 = hedge0.head().pnt;
            Point3d p2 = hedge1.head().pnt;

            double dx1 = p1.x - p0.x;
            double dy1 = p1.y - p0.y;
            double dz1 = p1.z - p0.z;

            double dx2 = p2.x - p0.x;
            double dy2 = p2.y - p0.y;
            double dz2 = p2.z - p0.z;

            double x = dy1 * dz2 - dz1 * dy2;
            double y = dz1 * dx2 - dx1 * dz2;
            double z = dx1 * dy2 - dy1 * dx2;

            return(x * x + y * y + z * z);
        }
コード例 #4
0
ファイル: QuickHullAlgorithm.cs プロジェクト: vnmone/vvvv-sdk
 protected void setHull(double[] coords, int nump, int[][] faceIndices, int numf)
 {
     initBuffers(nump);
     setPoints(coords, nump);
     computeMaxAndMin();
     for (int i = 0; i < numf; i++)
     {
         Face     face = Face.create(pointBuffer, faceIndices[i]);
         HalfEdge he   = face.he0;
         do
         {
             HalfEdge heOpp = findHalfEdge(he.head(), he.tail());
             if (heOpp != null)
             {
                 he.setOpposite(heOpp);
             }
             he = he.next;
         }while (he != face.he0);
         faces.Add(face);
     }
 }
コード例 #5
0
        public void computeNormal(Vector3d normal, double minArea)
        {
            computeNormal(normal);

            if (area < minArea)
            {
                Console.WriteLine("area=" + area);
                // make the normal more robust by removing
                // components parallel to the longest edge

                HalfEdge hedgeMax  = null;
                double   lenSqrMax = 0;
                HalfEdge hedge     = he0;
                do
                {
                    double lenSqr = hedge.lengthSquared();
                    if (lenSqr > lenSqrMax)
                    {
                        hedgeMax  = hedge;
                        lenSqrMax = lenSqr;
                    }
                    hedge = hedge.next;
                }while (hedge != he0);

                Point3d p2     = hedgeMax.head().pnt;
                Point3d p1     = hedgeMax.tail().pnt;
                double  lenMax = Math.Sqrt(lenSqrMax);
                double  ux     = (p2.x - p1.x) / lenMax;
                double  uy     = (p2.y - p1.y) / lenMax;
                double  uz     = (p2.z - p1.z) / lenMax;
                double  dot    = normal.x * ux + normal.y * uy + normal.z * uz;
                normal.x -= dot * ux;
                normal.y -= dot * uy;
                normal.z -= dot * uz;

                normal.normalize();
            }
        }
コード例 #6
0
        void checkConsistency()
        {
            // do a sanity check on the face
            HalfEdge hedge = he0;
            double   maxd  = 0;
            int      numv  = 0;

            if (numVerts < 3)
            {
                throw new Exception(
                          "degenerate face: " + getVertexString());
            }
            do
            {
                HalfEdge hedgeOpp = hedge.getOpposite();
                if (hedgeOpp == null)
                {
                    throw new Exception(
                              "face " + getVertexString() + ": " +
                              "unreflected half edge " + hedge.getVertexString());
                }
                else if (hedgeOpp.getOpposite() != hedge)
                {
                    throw new Exception(
                              "face " + getVertexString() + ": " +
                              "opposite half edge " + hedgeOpp.getVertexString() +
                              " has opposite " +
                              hedgeOpp.getOpposite().getVertexString());
                }
                if (hedgeOpp.head() != hedge.tail() ||
                    hedge.head() != hedgeOpp.tail())
                {
                    throw new Exception(
                              "face " + getVertexString() + ": " +
                              "half edge " + hedge.getVertexString() +
                              " reflected by " + hedgeOpp.getVertexString());
                }
                Face oppFace = hedgeOpp.face;
                if (oppFace == null)
                {
                    throw new Exception(
                              "face " + getVertexString() + ": " +
                              "no face on half edge " + hedgeOpp.getVertexString());
                }
                else if (oppFace.mark == DELETED)
                {
                    throw new Exception(
                              "face " + getVertexString() + ": " +
                              "opposite face " + oppFace.getVertexString() +
                              " not on hull");
                }
                double d = Math.Abs(distanceToPlane(hedge.head().pnt));
                if (d > maxd)
                {
                    maxd = d;
                }
                numv++;
                hedge = hedge.next;
            }while (hedge != he0);

            if (numv != numVerts)
            {
                throw new Exception(
                          "face " + getVertexString() + " numVerts=" + numVerts + " should be " + numv);
            }
        }