コード例 #1
0
 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;
 }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 public MyVertex(double X, double Y, typeDirection direction, bool vertical, bool inner, typeVertex type)
 {
     pMyVertex(X, Y, direction, vertical, inner, type);
 }