private void pMyVertex(double X_, double Y_, typeDirection direction_, bool vertical_, bool inner_, typeVertex type_) { X = X_; Y = Y_; direction = direction_; vertical = vertical_; inner = inner_; type = type_; xBiasApplied = false; yBiasApplied = false; }
public static List <Vector3Class> IntersectTriangles(Vector3Class origin, Vector3Class direction, TriangleInfoList triangles, typeDirection directionType) { var intersectionPoints = new List <Vector3Class>(); for (var arrayIndex = 0; arrayIndex < triangles.Count; arrayIndex++) { for (var triangleIndex = 0; triangleIndex < triangles[arrayIndex].Count; triangleIndex++) { var triangle = triangles[arrayIndex][triangleIndex]; if (triangle.Center != origin) { if (direction.Z == 1 || direction.Z == -1) { if (!((triangle.Left <= origin.X && triangle.Right >= origin.X) && (triangle.Back <= origin.Y && triangle.Front >= origin.Y))) { continue; } } //do translation off vector var p1 = triangle.Vectors[0].Position; var p2 = triangle.Vectors[1].Position; var p3 = triangle.Vectors[2].Position; float nDotD = Vector3Class.Dot(triangle.Normal, direction); if (nDotD != 0) { // if (nDotD < 0)nDotD = 0 - nDotD; float d = Vector3Class.Dot(triangle.Normal, p1); float t = -(Vector3Class.Dot(triangle.Normal, origin) + d) / nDotD; Vector3Class planeIntersection = new Vector3Class(); if (nDotD < 0) { t = -(Vector3Class.Dot(-triangle.Normal, origin) + d) / -nDotD; planeIntersection = origin + (direction * t); } else if (directionType == typeDirection.TwoWay) { planeIntersection = origin + (direction * t); } for (var i = 0; i < 2; i++) { //pass 1 if (i == 0) { if (Vector3Class.Dot(Vector3Class.Cross(p1 - p3, planeIntersection - p3), direction) > 0) { continue; } if (Vector3Class.Dot(Vector3Class.Cross(p2 - p1, planeIntersection - p1), direction) > 0) { continue; } if (Vector3Class.Dot(Vector3Class.Cross(p3 - p2, planeIntersection - p2), direction) > 0) { continue; } } else { if (Vector3Class.Dot(Vector3Class.Cross(p1 - p3, planeIntersection - p3), direction) < 0) { continue; } if (Vector3Class.Dot(Vector3Class.Cross(p2 - p1, planeIntersection - p1), direction) < 0) { continue; } if (Vector3Class.Dot(Vector3Class.Cross(p3 - p2, planeIntersection - p2), direction) < 0) { continue; } } if (intersectionPoints == null) { intersectionPoints = new List <Vector3Class>(); } intersectionPoints.Add(planeIntersection); } } } } } return(intersectionPoints); }
public static bool IntersectTriangle(Vector3Class origin, Vector3Class direction, object model3d, typeDirection directionType, bool useSupportMoveTranslation, Vector3Class moveTranslation, out TriangleIntersection[] intersectedPolygons) { var intersections = 0; intersectedPolygons = null; var intersections2 = new ConcurrentBag <TriangleIntersection>(); if (model3d is STLModel3D) { var stlModel = (STLModel3D)model3d; if (stlModel.Triangles != null) { for (var arrayIndex = 0; arrayIndex < stlModel.Triangles.Count; arrayIndex++) //Parallel.For(0, stlModel.Triangles.Count, arrayIndexAsync => { // var arrayIndex = arrayIndexAsync; for (var triangleIndex = 0; triangleIndex < stlModel.Triangles[arrayIndex].Count; triangleIndex++) { var triangle = stlModel.Triangles[arrayIndex][triangleIndex]; if (triangle.Center != origin) { if (direction.Z == 1 || direction.Z == -1) { if (!((triangle.Left <= origin.X && triangle.Right >= origin.X) && (triangle.Back <= origin.Y && triangle.Front >= origin.Y))) { continue; } } //do translation off vector if (triangleIndex == 8) { } float nDotD = Vector3Class.Dot(triangle.Normal, direction); if (nDotD != 0) { if (nDotD < 0 || directionType == typeDirection.TwoWay) { var p1 = triangle.Vectors[0].Position + moveTranslation; float d = Vector3Class.Dot(triangle.Normal, p1); float t = -(Vector3Class.Dot(triangle.Normal, origin) + d) / nDotD; Vector3Class planeIntersection = new Vector3Class(); if (nDotD < 0) { t = -(Vector3Class.Dot(-triangle.Normal, origin) + d) / -nDotD; planeIntersection = origin + (direction * t); } else if (directionType == typeDirection.TwoWay) { planeIntersection = origin + (direction * t); } if (useSupportMoveTranslation) { planeIntersection = planeIntersection - stlModel.MoveTranslation - moveTranslation; } var p2 = triangle.Vectors[1].Position + moveTranslation; var p3 = triangle.Vectors[2].Position + moveTranslation; for (var i = 0; i < 2; i++) { //pass 1 if (i == 0) { if (Vector3Class.Dot(Vector3Class.Cross(p1 - p3, planeIntersection - p3), direction) > 0) { continue; } if (Vector3Class.Dot(Vector3Class.Cross(p2 - p1, planeIntersection - p1), direction) > 0) { continue; } if (Vector3Class.Dot(Vector3Class.Cross(p3 - p2, planeIntersection - p2), direction) > 0) { continue; } } else { if (Vector3Class.Dot(Vector3Class.Cross(p1 - p3, planeIntersection - p3), direction) < 0) { continue; } if (Vector3Class.Dot(Vector3Class.Cross(p2 - p1, planeIntersection - p1), direction) < 0) { continue; } if (Vector3Class.Dot(Vector3Class.Cross(p3 - p2, planeIntersection - p2), direction) < 0) { continue; } } intersections2.Add(new TriangleIntersection(triangle, planeIntersection)); intersections++; } } } } } } //); } } //Console.WriteLine("IntersectTriangle: " + stopWatch.ElapsedMilliseconds + "ms"); intersectedPolygons = intersections2.ToArray(); return(intersections > 0); }
public MyVertex(double X, double Y, typeDirection direction, bool vertical, bool inner, typeVertex type) { pMyVertex(X, Y, direction, vertical, inner, type); }