public PlanarEdge(HardEdge edge, Triangle triangle, Plane plane) { Face = triangle; OrigEdge = edge; P1 = plane.ProjectPoint(edge.P1); P2 = plane.ProjectPoint(edge.P2); OutlineDirection = plane.ProjectVector(edge.OutlineDirection); IsTriangleEdge = triangle.ContainsVertex(edge.P1) && triangle.ContainsVertex(edge.P2) && triangle.Normal.Equals(edge.FaceNormal, 0.05f); Direction = (P2 - P1).Normalized(); }
public bool GetBySharedVertex(HardEdge edge, Vector3 vertex, out HardEdge result) { result = null; if (InnerDict.TryGetValue(vertex, out List <HardEdge> sharedEdges)) { var nearEdges = sharedEdges .Where(x => x != edge && Vector3.AngleBetween(x.FaceNormal, edge.FaceNormal) <= BreakAngleRad && Vector3.AngleBetween(x.OutlineDirection, edge.OutlineDirection) <= fPI * 0.85 ) .OrderBy(x => Vector3.AngleBetween(x.FaceNormal, edge.FaceNormal)) .ThenBy(x => Vector3.AngleBetween(x.OutlineDirection, edge.OutlineDirection)); if (nearEdges.Count() > 0) { result = nearEdges.First(); return(true); } } return(false); }
static ProjectedEdge CreateClippingEdge(ProjectedEdge baseEdge, Vector3 edgeEnd, Plane facePlane) { var triangle = baseEdge.PlanarEdge.Face; var oppVert = baseEdge.PlanarEdge.GetOppositeVertex(edgeEnd); var outlineDir = (edgeEnd - oppVert).Normalized(); var interEdge = new HardEdge( edgeEnd, edgeEnd + baseEdge.PlanarEdge.OutlineDirection, facePlane.Normal, outlineDir); interEdge.CorrectOrder(); var planarEndEdge = new PlanarEdge(interEdge, triangle, facePlane); var interProjected = planarEndEdge.ProjectTriangle(triangle, edgeEnd); interProjected.NeedsToBeClipped = true; baseEdge.CombineWith = interProjected; interProjected.CombineWith = baseEdge; return(interProjected); }