internal ThinWallSegmentGroup(List <Line> Lines, double WallThickness, double ScaleFactor)
 {
     Segments = Lines.Select(l =>
     {
         Point2D nodeI     = new Point2D(l.StartPoint.X * ScaleFactor, l.StartPoint.Y * ScaleFactor);
         Point2D nodeJ     = new Point2D(l.EndPoint.X * ScaleFactor, l.EndPoint.Y * ScaleFactor);
         Line2D line       = new Line2D(nodeI, nodeJ);
         ThinWallSegment s = new ThinWallSegment(line, WallThickness);
         return(s);
     }).ToList();
 }
        private List <ThinWallSegment> GetRotatedSegments(List <ThinWallSegment> segments)
        {
            //Flip X and Y coordinates
            List <ThinWallSegment> newSegs = segments.Select(s =>
            {
                ThinWallSegment sg = new ThinWallSegment(new Line2D(new Point2D(s.Line.StartPoint.Y, s.Line.StartPoint.X), new Point2D(s.Line.EndPoint.Y, s.Line.EndPoint.X)), s.WallThickness);
                return(sg);
            }).ToList();

            return(newSegs);
        }
        private List <ThinWallSegment> GetSubdividedYSegments(List <double> YUnique, List <ThinWallSegment> Segs)
        {
            List <ThinWallSegment> segments = new List <ThinWallSegment>();

            for (int i = 0; i < YUnique.Count(); i++)
            {
                //double DeltaY = YUnique[i + 1] - YUnique[i];

                List <ThinWallSegment> crossingVericalSegments = Segs.Where(s =>
                {
                    //if this is a level line
                    if (s.Line.YMax != s.Line.YMin)
                    {
                        if (i != 0)
                        {
                            if (s.Line.YMin < YUnique[i] && s.Line.YMax >= YUnique[i])
                            {
                                return(true);
                            }
                            else
                            {
                                return(false);
                            }
                        }
                        //if this is the lowest coordinate
                        else
                        {
                            return(false);
                        }

                        //s.Line.YMin <= YUnique[i] & s.Line.YMin >= YUnique[i + 1]
                    }
                    else
                    {
                        return(false);
                    }
                }
                                                                            ).ToList();

                if (crossingVericalSegments.Count() == 0)
                {
                    //if this segment is a gap
                    if (i != 0)
                    {
                        segments.Add(new ThinWallSegment(YUnique[i - 1], YUnique[i], 0));
                    }
                }
                else
                {
                    //if this segment is NOT a gap
                    foreach (var s in crossingVericalSegments)
                    {
                        if (i != 0)
                        {
                            Line2D          subLine = s.Line.GetSubSegment(YUnique[i - 1], YUnique[i]);
                            ThinWallSegment seg     = new ThinWallSegment(subLine, s.WallThickness);
                            segments.Add(seg);
                        }
                        else
                        {
                            ThinWallSegment seg = new ThinWallSegment(s.Line, s.WallThickness);
                            segments.Add(seg);
                        }
                    }
                }

                List <ThinWallSegment> crossingHorizontalSegments = Segs.Where(s =>
                {
                    //if this is a level line
                    if (s.Line.YMax == s.Line.YMin)
                    {
                        if (s.Line.YMin == YUnique[i])
                        {
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        return(false);
                    }
                }).ToList();
                segments.AddRange(crossingHorizontalSegments);
            }
            return(segments.OrderBy(c => c.Line.StartPoint.Y).ToList());
        }