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); }
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); }
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(); }