private static int CompareDinosByLength(MeshSimplify_Point x, MeshSimplify_Point y) { if (x == null) { if (y == null) { return 0; } else { return -1; } } else { if (y == null) { return 1; } else { if (x.order > y.order) return 1; if (x.order == y.order) return 0; if (x.order < y.order) return -1; else return 0; } } }
public bool isDump(MeshSimplify_Point other) { return this.pos.DistanceTo(other.pos) < this.tol; }
public void lay() { Sort(); if (this.refpoints.Count < 2) { MeshSimplify_Point p = new MeshSimplify_Point(this.pos); p.refpoints.AddRange(this.refpoints); p.refpoints.Add(this); children.Add(p); children.Add(p); } for (int i = 0; i < this.refpoints.Count; i++) { MeshSimplify_Point p = new MeshSimplify_Point(this.pos); int after = i + 1; if (after > refpoints.Count - 1) after = 0; p.refpoints.Add(refpoints[i]); p.refpoints.Add(refpoints[after]); children.Add(p); } }
private List<MeshSimplify_Point> preDivide(Mesh mesh) { Rhino.Geometry.Collections.MeshTopologyEdgeList el = mesh.TopologyEdges; Rhino.Geometry.Collections.MeshTopologyVertexList vs = mesh.TopologyVertices; List<MeshSimplify_Point> PointList = new List<MeshSimplify_Point>(); for (int i = 0; i < vs.Count; i++) { MeshSimplify_Point pt = new MeshSimplify_Point(vs[i]); if (vs.MeshVertexIndices(i).Length > 0) { pt.N = mesh.Normals[vs.MeshVertexIndices(i)[0]]; } else { pt.computeNormal(mesh); } PointList.Add(pt); } for (int i = 0; i < vs.Count; i++) { int[] index = vs.ConnectedTopologyVertices(i); for (int j = 0; j < index.Length; j++) { PointList[i].refpoints.Add(PointList[index[j]]); } PointList[i].Sort(); } ///////////////////////////////////////////////////// for (int i = 0; i < vs.Count; i++) { PointList[i].order = 0; } for (int i = 0; i < el.Count; i++) { if (el.GetConnectedFaces(i).Length == 1) { PointList[el.GetTopologyVertices(i).I].order = 5; PointList[el.GetTopologyVertices(i).J].order = 5; } } for (int i = 0; i < vs.Count; i++) { if (PointList[i].order == 5) { if (PointList[i].refpoints.Count != 3) { PointList[i].order = 4; } } else { if (PointList[i].refpoints.Count != 4) PointList[i].order = 4; } } ////////////////////////////////////////////////////////// for (int k = 0; k < PointList.Count; k++) { bool sign = true; for (int i = 0; i < PointList.Count; i++) { if (PointList[i].order == 4) { sign = false; PointList[i].order++; if (PointList[i].refpoints.Count == 4) { if (PointList[i].refpoints[0].order == 5 && PointList[i].refpoints[2].order != 5) { PointList[i].refpoints[2].order = 1; } if (PointList[i].refpoints[1].order == 5 && PointList[i].refpoints[3].order != 5) { PointList[i].refpoints[3].order = 1; } if (PointList[i].refpoints[2].order == 5 && PointList[i].refpoints[0].order != 5) { PointList[i].refpoints[0].order = 1; } if (PointList[i].refpoints[3].order == 5 && PointList[i].refpoints[1].order != 5) { PointList[i].refpoints[1].order = 1; } } else { for (int j = 0; j < PointList[i].refpoints.Count; j++) { PointList[i].refpoints[j].order++; } } } } for (int i = 0; i < PointList.Count; i++) { if (PointList[i].order > 0 && PointList[i].order < 4) PointList[i].order = 4; } if (sign) { break; } } return PointList; }