public ContourStitcher(ContourLine line1, ContourLine line2) { if (line1.GetZ() > line2.GetZ()) { lineUp = line1; lineDown = line2; } else { lineUp = line2; lineDown = line1; } lineUpProcessed = new List <FloatDouble>(lineUp.GetLinePointCount()); lineDownProcessed = new List <FloatDouble>(lineDown.GetLinePointCount()); CopyArray(lineUp.GetPointList(), lineUpProcessed); CopyArray(lineDown.GetPointList(), lineDownProcessed); boxUp = lineUp.GetBox(); boxDown = lineDown.GetBox(); Point3d cU = boxUp.GetCenter(); Point3d cD = boxDown.GetCenter(); ContourLineSurfaceGenerator.Transform(lineDownProcessed, -cD.X, -cD.Y); ContourLineSurfaceGenerator.Transform(lineUpProcessed, -cU.X, -cU.Y); int indexDown = GetNearIndex(); AdjustDownArray(indexDown); }
public Mesh DoStitching() { Mesh m = new Mesh(); int[] upMap = new int[lineUpProcessed.Count]; float dx1 = boxUp.GetCenter().X; float dy1 = boxUp.GetCenter().Y; float dx2 = boxDown.GetCenter().X; float dy2 = boxDown.GetCenter().Y; int[] downMap = new int[lineDownProcessed.Count]; for (int i = 0; i < lineDownProcessed.Count; i++) { Point3d p = new Point3d(lineDownProcessed[i].X + dx2, lineDownProcessed[i].Y + dy2, lineDown.GetZ()); downMap[i] = m.AddVertex(p); } for (int i = 0; i < lineUpProcessed.Count; i++) { Point3d p = new Point3d(lineUpProcessed[i].X + dx1, lineUpProcessed[i].Y + dy1, lineUp.GetZ()); upMap[i] = m.AddVertex(p); } int upIndex = 0; int downIndex = 0; QuadUnit quad = new QuadUnit(); quad.lineDown = lineDownProcessed; quad.lineUp = lineUpProcessed; while (true) { if (upIndex == lineUpProcessed.Count - 1 || downIndex == lineDownProcessed.Count - 1) { break; } quad.Init(upIndex, downIndex); if (quad.DiaU0D1Len < quad.DiaU1D0Len) { Triangle t = new Triangle(upMap[quad.UpIndex0], downMap[quad.DownIndex0], downMap[quad.DownIndex1]); m.AddFace(t); downIndex++; } else { Triangle t = new Triangle(upMap[quad.UpIndex0], downMap[quad.DownIndex0], upMap[quad.UpIndex1]); m.AddFace(t); upIndex++; } } if (upIndex == lineUpProcessed.Count - 1 || downIndex == lineDownProcessed.Count - 1) { if (downIndex == lineDownProcessed.Count - 1) { int last = lineDownProcessed.Count - 1; while (upIndex != lineUpProcessed.Count - 1) { Triangle t = new Triangle(downMap[last], upMap[upIndex + 1], upMap[upIndex]); m.AddFace(t); upIndex++; } } else { int last = lineUpProcessed.Count - 1; while (downIndex != lineDownProcessed.Count - 1) { Triangle t = new Triangle(upMap[last], downMap[downIndex], downMap[downIndex + 1]); m.AddFace(t); downIndex++; } } } quad.InitLast(); if (quad.DiaU0D1Len < quad.DiaU1D0Len) { Triangle t = new Triangle(upMap[quad.UpIndex0], downMap[quad.DownIndex0], downMap[quad.DownIndex1]); Triangle t2 = new Triangle(upMap[quad.UpIndex0], downMap[quad.DownIndex1], upMap[quad.UpIndex1]); m.AddFace(t); m.AddFace(t2); } else { Triangle t = new Triangle(upMap[quad.UpIndex0], downMap[quad.DownIndex0], upMap[quad.UpIndex1]); Triangle t2 = new Triangle(upMap[quad.UpIndex1], downMap[quad.DownIndex0], downMap[quad.DownIndex1]); m.AddFace(t); m.AddFace(t2); } return(m); }