private CommonGeometry[] GetShapeGeometry(IConvexHullEngine convexHullEngine)
        {
            AABB region = AABB.GetGeometryAABB(Geometry.VerticesPosition, this);

            Vertex3Index[] verticesIndex = new Vertex3Index[Geometry.VerticesPosition.Length];

            for (int i = 0; i < Geometry.VerticesPosition.Length; i++)
            {
                verticesIndex[i] = new Vertex3Index(Geometry.VerticesPosition[i], Geometry.VerticesIdx[i].GetGlobalAdjacencyList(), i);
            }

            ConvexDecompositionEngine convexDecomposition = new ConvexDecompositionEngine(region, verticesIndex, 0.2);
            var convexShapes         = convexDecomposition.Execute().GetConvexShapeList(true);
            var ConvexShapesGeometry = new CommonGeometry[convexShapes.Count];

            for (int i = 0; i < convexShapes.Count; i++)
            {
                ConvexHullData convexHullData = convexHullEngine.GetConvexHull(convexShapes[i].Vertex3Idx.ToArray());

                var verticesIdx = Array.ConvertAll(convexHullData.Vertices, x => x.ID);
                ConvexShapesGeometry[i] = new CommonGeometry(null, convexHullData.TriangleMeshes, verticesIdx);
            }

            return(ConvexShapesGeometry);
        }
Esempio n. 2
0
        public static void lanch(IConvexHullEngine chEngine, List <IPositionSet> psList)
        {
            ConvexHullCompare CHCompare;

            report = new CHTestAndReport();
            bool allPass = true;

            for (int i = 0; i < psList.Count; i++)
            {
                IPositionSet ps      = psList[i];
                IPositionSet cps     = chEngine.ConvexHull(ps);
                IPositionSet cps_ref = (new QuickHull()).ConvexHull(ps);

                CHCompare = new ConvexHullCompare(ps, cps, cps_ref);
                if (!CHCompare.Compare())
                {
                    allPass = false;
                }
                report.content += CHCompare.GetReport();
            }

            if (allPass)
            {
                report.content += "测试全部通过!";
            }
            report.Show();
        }
        private void GenerateConvexShapes(IConvexHullEngine convexHullEngine)
        {
            AABB box = AABB.GetGeometryAABB(positions, this);

            var vertex3Idx = SetVertexAdjacency(positions, triangleMeshes);
            ConvexDecompositionEngine convexDecomposition = new ConvexDecompositionEngine(box, vertex3Idx, 0.7);

            convexShapes = convexDecomposition.Execute().GetConvexShapeList(true);
        }
Esempio n. 4
0
        public static void lanch(IConvexHullEngine chEngine, IPositionSet ps)
        {
            PainterDialog painterDialog = new PainterDialog();

            //求解凸包并作图
            IPositionSet cps = chEngine.ConvexHull(ps);

            painterDialog.FillPolygon = true;
            painterDialog.Clear();
            painterDialog.DrawPositionSet(ps);
            painterDialog.DrawConvexHull(cps);
            painterDialog.Show();

            //测试凸包正确性
            report = new CHTestAndReport();
            ConvexHullCompare CHCompare = new ConvexHullCompare(ps, cps, (new QuickHull()).ConvexHull(ps));

            CHCompare.Compare();
            report.content = CHCompare.GetReport();
            report.Show();
        }
        //private readonly int[] indicesArr;

        #endregion

        #region Constructor

        public HeightMapMesh(
            String heightMapFile,
            IConvexHullEngine convexHullEngine,
            double minY,
            double maxY,
            int textInc,
            double scale)
        {
            this.minY  = minY;
            this.maxY  = maxY;
            this.scale = scale;

            var bufferStream = LoadBitmap(heightMapFile);

            textureCoords = new Vector2d[Height][];
            positions     = new Vector3d[Height * Width];
            Init(bufferStream, textInc);
            //indicesArr = indices.ToArray();
            normalsArr = CalcNormals(positions);
            GenerateConvexShapes(convexHullEngine);
        }
        public static void lanch(IConvexHullEngine chEngine, int pointCount, float min, float max)
        {
            //求解凸包并作图
            //IPositionSet ps = testData();
            IPositionSet ps = new RandomPositionSet(pointCount, min, max);

            //System.Console.Out.WriteLine("position set:");
            //printPositionSet(ps);
            IPositionSet cps = chEngine.ConvexHull(ps);

            //System.Console.Out.WriteLine("Jarvis Match:");
            //printPositionSet(cps);
            PainterDialog.Clear();
            PainterDialog.DrawPositionSet(ps);
            PainterDialog.DrawConvexHull(cps);
            PainterDialog.Show();


            AnalyzeReport report = new AnalyzeReport();

            //测试点集引用
            cps.InitToTraverseSet();
            ps.InitToTraverseSet();
            bool correct = true;

            while (correct && cps.NextPosition())
            {
                IPosition cp   = cps.GetPosition();
                bool      find = false;
                ps.InitToTraverseSet();
                while (!find && ps.NextPosition())
                {
                    IPosition p = ps.GetPosition();
                    if (cp == p)
                    {
                        find = true;
                    }
                }
                if (!find)
                {
                    correct = false;
                }
            }
            report.content += "引用测试:" + (correct ? "正确" : "错误") + "\n";

            //测试凸包
            if (correct)
            {
                report.content += "凸包正确性测试:\n";
                IPositionSet cps_ref = (new QuickHull()).ConvexHull(ps);
                //    System.Console.Out.WriteLine("Quick Hull:");
                //    printPositionSet(cps_ref);
                IPosition[] cpa     = (IPosition[])(cps.ToArray());
                IPosition[] cpa_ref = (IPosition[])(cps_ref.ToArray());
                if (cpa.Length != cpa_ref.Length)
                {
                    report.content += "数目不等";
                    correct         = false;
                }
                if (correct)
                {
                    int n = cpa.Length;
                    int m = 0;
                    int p = 0;
                    for (; p < n; p++)
                    {
                        if (cpa[0] == cpa_ref[p])
                        {
                            break;
                        }
                    }
                    if (p == n)
                    {
                        correct         = false;
                        report.content += "发生错误!";
                    }
                    if (correct)
                    {
                        for (int i = 0; i < n; i++)
                        {
                            if (cpa[i] == cpa_ref[(p + i + n) % n])
                            {
                                m++;
                            }
                        }
                        int tm = 0;
                        for (int i = 0; i < n; i++)
                        {
                            if (cpa[i] == cpa_ref[(p - i + n) % n])
                            {
                                tm++;
                            }
                        }
                        if (tm > m)
                        {
                            m = tm;
                        }
                        report.content += "正确率:" + m.ToString() + "/" + n.ToString();
                        if (m == n)
                        {
                            report.content += "正确!";
                        }
                        else
                        {
                            report.content += "不正确!";
                        }
                    }
                }
            }
            report.Show();
        }