示例#1
0
 private static IEnumerable <LineHL> ClippAtBottom(this IEnumerable <LineHL> lines, double bottom)
 {
     foreach (var line in lines)
     {
         var start = line.Start;
         var end   = line.End;
         if ((start.Y >= bottom) || (end.Y >= bottom))
         {
             if ((start.Y >= bottom) && (end.Y >= bottom))
             {
                 yield return(line);
             }
             else
             {
                 if (start.Y > end.Y)
                 {
                     var help = start;
                     start = end;
                     end   = help;
                 }
                 double qy           = (bottom - start.Y) / (end.Y - start.Y);
                 double deltax       = qy * (end.X - start.X);
                 var    clippedStart = new PointHL(start.X + deltax, bottom);
                 yield return(new LineHL {
                     Start = clippedStart, End = end, Edge = line.Edge
                 });
             }
         }
     }
 }
示例#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
                });
            }
        }
示例#3
0
 private static IEnumerable <LineHL> ClippAtRight(this IEnumerable <LineHL> lines, double right)
 {
     foreach (var line in lines)
     {
         var start = line.Start;
         var end   = line.End;
         if ((start.X <= right) || (end.X <= right))
         {
             if ((start.X <= right) && (end.X <= right))
             {
                 yield return(line);
             }
             else
             {
                 if (start.X > end.X)
                 {
                     var help = start;
                     start = end;
                     end   = help;
                 }
                 double qx         = (right - start.X) / (end.X - start.X);
                 double deltay     = qx * (end.Y - start.Y);
                 var    clippedEnd = new PointHL(right, start.Y + deltay);
                 yield return(new LineHL {
                     Start = start, End = clippedEnd, Edge = line.Edge
                 });
             }
         }
     }
 }
示例#4
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));
        }
示例#5
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);
        }