private List <PerimeterLineSegment> GetRotatedSegments(List <PerimeterLineSegment> adjustedSegments, double thetaRad)
        {
            List <PerimeterLineSegment> RotatedSegments = new List <PerimeterLineSegment>();


            if (ColumnType == PunchingPerimeterConfiguration.CornerLeftBottom ||
                ColumnType == PunchingPerimeterConfiguration.CornerLeftTop ||
                ColumnType == PunchingPerimeterConfiguration.CornerRightBottom ||
                ColumnType == PunchingPerimeterConfiguration.CornerRightTop)
            {
                List <PerimeterLineSegment> RotatedSegmentsInLocalAxis = new List <PerimeterLineSegment>();

                foreach (var seg in adjustedSegments)
                {
                    Point2D pi = GetRotatedPoint(seg.PointI, thetaRad);
                    Point2D pj = GetRotatedPoint(seg.PointJ, thetaRad);
                    PerimeterLineSegment newSeg = new PerimeterLineSegment(pi, pj);
                    RotatedSegments.Add(newSeg); //flip X and Y coordinates
                }
            }
            else
            {
                RotatedSegments = adjustedSegments;
            }

            return(RotatedSegments);
        }
        private List <PerimeterLineSegment> AdjustSegments(Point2D cen)
        {
            List <PerimeterLineSegment> movedSegments = new List <PerimeterLineSegment>();

            foreach (var s in Segments)
            {
                PerimeterLineSegment adjustedSeg = new PerimeterLineSegment(
                    new Point2D(s.PointI.X - cen.X, s.PointI.Y - cen.Y),
                    new Point2D(s.PointJ.X - cen.X, s.PointJ.Y - cen.Y)
                    );
                movedSegments.Add(adjustedSeg);
            }


            if (this.ColumnType == PunchingPerimeterConfiguration.CornerLeftBottom ||
                this.ColumnType == PunchingPerimeterConfiguration.CornerLeftTop ||
                this.ColumnType == PunchingPerimeterConfiguration.CornerRightBottom ||
                this.ColumnType == PunchingPerimeterConfiguration.CornerRightTop
                )
            {
                double J_x_bar  = GetJx(movedSegments);
                double J_y_bar  = GetJy(movedSegments);
                double J_xy_bar = GetJxy(movedSegments);

                //421.1R-13 Equation (B-10)
                double theta = Math.Atan(-2.0 * J_xy_bar / (J_x_bar - J_y_bar));

                //Calculate rotated coordinates per B-12 and B-13
                List <PerimeterLineSegment> rotatedSegments = new List <PerimeterLineSegment>();
                foreach (var s in movedSegments)
                {
                    PerimeterLineSegment rotatedSeg = new PerimeterLineSegment(
                        new Point2D(s.PointI.X * Math.Cos(theta) + s.PointI.Y * Math.Sin(theta), -s.PointI.X * Math.Sin(theta) + s.PointI.Y * Math.Cos(theta)),
                        new Point2D(s.PointJ.X * Math.Cos(theta) + s.PointJ.Y * Math.Sin(theta), -s.PointJ.X * Math.Sin(theta) + s.PointJ.Y * Math.Cos(theta))
                        );
                    rotatedSegments.Add(rotatedSeg);
                }

                return(rotatedSegments);
            }
            else
            {
                return(movedSegments);
            }
        }