Esempio n. 1
0
        private static bool IsLineVisible(LineHL line, double nearPlaneDistance, TriangleHL[] triangles)
        {
            var rayAxis = GetRaytracingRay(line, nearPlaneDistance);

            var(success, edgeIntersection) = GetRayIntersectionWithEdge(rayAxis, line.Edge);
            if (!success)
            {
                return(true);
            }

            var rayToEdgeDirection  = (edgeIntersection - rayAxis.Offset);
            var edgeDistanceSquared = rayToEdgeDirection.SquaredLength();

            foreach (var triangle in triangles)
            {
                if (!IsTriangleNeighbourOfLine(triangle, line))
                {
                    if (!IsLineInTrianglePlane(line, triangle))
                    {
                        var(hasIntersection, triangleDistanceSquared) = IntersectionMath.GetSquaredDistanceOfIntersectionOfRayAndTriangle(rayAxis.Offset, rayToEdgeDirection, triangle.P1, triangle.P2, triangle.P3);
                        if (hasIntersection && triangleDistanceSquared < edgeDistanceSquared)
                        {
                            return(false);
                        }
                    }
                }
            }

            return(true);
        }
Esempio n. 2
0
        private static (bool, LineHL) ClippAtLeft(this LineHL line, double left)
        {
            var start = line.Start;
            var end   = line.End;

            if ((start.X < left) && (end.X < left))
            {
                return(false, null);
            }

            if ((start.X >= left) && (end.X >= left))
            {
                return(true, line);
            }
            else
            {
                if (start.X > end.X)
                {
                    var help = start;
                    start = end;
                    end   = help;
                }
                double qx           = (left - start.X) / (end.X - start.X);
                double deltay       = qx * (end.Y - start.Y);
                var    clippedStart = new PointHL(left, start.Y + deltay);
                return(true, new LineHL {
                    Start = clippedStart, End = end, Edge = line.Edge
                });
            }
        }
Esempio n. 3
0
        private static bool IsTriangleNeighbourOfLine(TriangleHL triangle, LineHL line)
        {
            var firstTriangle  = line.Edge.First;
            var secondTriangle = line.Edge.Second;
            var isNeighbour    = firstTriangle == triangle || secondTriangle == triangle;

            return(isNeighbour);
        }
Esempio n. 4
0
        private static bool IsLineInTrianglePlane(LineHL line, TriangleHL triangle)
        {
            var start     = line.Edge.Start;
            var end       = line.Edge.End;
            var distStart = start.DistancePositionToPlane(triangle.P1, triangle.Normal);
            var distEnd   = end.DistancePositionToPlane(triangle.P1, triangle.Normal);
            var isInPlane = distStart.EqualsTo(0.0) && distEnd.EqualsTo(0.0);

            return(isInPlane);
        }
Esempio n. 5
0
        private static LineHL ToLine2D(this EdgeHL edge, double nearPlaneDist)
        {
            var(x1, y1) = ViewProjection.ProjectCameraSystemToCameraPlane(edge.Start, nearPlaneDist);
            var(x2, y2) = ViewProjection.ProjectCameraSystemToCameraPlane(edge.End, nearPlaneDist);
            var line2d = new LineHL {
                Start = new PointHL(x1, y1), End = new PointHL(x2, y2), Edge = edge
            };

            return(line2d);
        }
Esempio n. 6
0
        private static Axis3D GetRaytracingRay(LineHL line, double nearPlaneDistance)
        {
            var start                 = line.Start;
            var end                   = line.End;
            var centerViewLine        = new PointHL((start.X + end.X) / 2.0, (start.Y + end.Y) / 2.0);
            var centerCameraPlaneLine = ViewProjection.ProjectCameraPlaneToCameraSystem(centerViewLine.X, centerViewLine.Y, nearPlaneDistance);
            var rayOffset             = new Position3D(0.0, 0.0, 0.0);
            var rayDirection          = centerCameraPlaneLine - rayOffset;

            return(new Axis3D(rayOffset, rayDirection));
        }
        public static IEnumerable <int> ToLineCoordinates(this LineHL line, double canvasWidth, double canvasHeight)
        {
            var(x1, y1) = ViewProjection.ProjectCameraPlaneToCanvas(line.Start.X, line.Start.Y, canvasWidth, canvasHeight);
            var(x2, y2) = ViewProjection.ProjectCameraPlaneToCanvas(line.End.X, line.End.Y, canvasWidth, canvasHeight);
            yield return(x1);

            yield return(y1);

            yield return(x2);

            yield return(y2);
        }
Esempio n. 8
0
 private static bool IsLineVisible(LineHL line) => line.Edge.First.Spin == TriangleSpin.counter_clockwise || line.Edge.Second.Spin == TriangleSpin.counter_clockwise;
Esempio n. 9
0
        public static IEnumerable <LineHL> CutLines(this IEnumerable <LineHL> lines)
        {
            var source   = new Stack <LineHL>(lines);
            var target   = new Stack <LineHL>();
            var cutLines = new Stack <LineHL>();

            while (source.Count > 0)
            {
                var first = source.Pop();

                // Testcode
                while (source.Count > 0)
                {
                    var second = source.Pop();
                    var x1     = first.Start.X;
                    var y1     = first.Start.Y;
                    var x2     = first.End.X;
                    var y2     = first.End.Y;
                    var x3     = second.Start.X;
                    var y3     = second.Start.Y;
                    var x4     = second.End.X;
                    var y4     = second.End.Y;
                    if (IntersectionMath.AreLinesBoundedBoxesOverlapped(x1, y1, x2, y2, x3, y3, x4, y4))
                    {
                        var(hasIntersection, x, y) = IntersectionMath.Check2DLineWithLine(x1, y1, x2, y2, x3, y3, x4, y4);
                        if (hasIntersection)
                        {
                            var intersection = new PointHL(x, y);
                            var first1       = new LineHL {
                                Start = first.Start, End = intersection, Edge = first.Edge
                            };
                            var first2 = new LineHL {
                                Start = intersection, End = first.End, Edge = first.Edge
                            };
                            var second1 = new LineHL {
                                Start = second.Start, End = intersection, Edge = second.Edge
                            };
                            var second2 = new LineHL {
                                Start = intersection, End = second.End, Edge = second.Edge
                            };

                            if (!first2.Length.EqualsTo(0.0))
                            {
                                if (!first1.Length.EqualsTo(0.0))
                                {
                                    target.Push(first2);
                                    first = first1;
                                }
                                else
                                {
                                    first = first2;
                                }
                            }
                            else
                            {
                                first = first1;
                            }

                            if (!second1.Length.EqualsTo(0.0))
                            {
                                target.Push(second1);
                            }
                            if (!second2.Length.EqualsTo(0.0))
                            {
                                target.Push(second2);
                            }
                        }
                        else
                        {
                            target.Push(second);
                        }
                    }
                    else
                    {
                        target.Push(second);
                    }
                }
                cutLines.Push(first);

                var help = source;
                source = target;
                target = help;
            }

            return(cutLines);
        }