Exemple #1
0
        protected override SLExpression VisitSideLengthAndPositionSquare(SideLengthAndPositionSquareExpression expression)
        {
            var sidePositionAxis = (TwoPointsLineExpression)Visit(expression.SidePosition);
            var axisLength       = GetDistance(
                (CoordinatesPointExpression)sidePositionAxis.Point1,
                (CoordinatesPointExpression)sidePositionAxis.Point2);

            var lines            = expression.Lines.Select(Visit).Cast <TwoPointsLineExpression>().ToArray();
            var totalLinesLength = lines.Select(l => GetDistance((CoordinatesPointExpression)l.Point1, (CoordinatesPointExpression)l.Point2)).Sum();
            var factor           = GetFactor(expression.LinesLengthToSideLengthFactor);
            var sideLength       = factor * totalLinesLength;

            var sideAxisPoint1 = (CoordinatesPointExpression)sidePositionAxis.Point1;
            var sideAxisPoint2 = (CoordinatesPointExpression)sidePositionAxis.Point2;
            var sideCenter     = GetEquidistantPoint(sideAxisPoint1, sideAxisPoint2);

            var axisPoint1RelativePositionToCenterOfSide = sideAxisPoint1 - sideCenter;
            var axisPoint2RelativePositionToCenterOfSide = sideAxisPoint2 - sideCenter;

            var squareSideToAxisLengthFactor = sideLength / axisLength;

            var squareCorner1 = axisPoint1RelativePositionToCenterOfSide * squareSideToAxisLengthFactor + sideCenter;
            var squareCorner2 = axisPoint2RelativePositionToCenterOfSide * squareSideToAxisLengthFactor + sideCenter;

            var otherSideDirection = axisPoint1RelativePositionToCenterOfSide * squareSideToAxisLengthFactor * 2;

            otherSideDirection = new CoordinatesPointExpression
            {
                X = otherSideDirection.Y,
                Y = -otherSideDirection.X,
            };

            if (expression.SideDirection == "right" || expression.SideDirection == "bottom")
            {
                otherSideDirection = otherSideDirection * -1;
            }

            var squareCorner3 = squareCorner1 + otherSideDirection;
            var squareCorner4 = squareCorner2 + otherSideDirection;

            return(new PolygonFromPointsExpression
            {
                Points = new[]
                {
                    squareCorner1,
                    squareCorner2,
                    squareCorner4,
                    squareCorner3,
                }
            });

            //return new PolygonFromLinesExpression
            //{
            //    Lines = lines//.Take(1)
            //        .Concat(new[]
            //        {
            //            sidePositionAxis,

            //        }).ToArray(),
            //};
        }
Exemple #2
0
 private double GetDistance(CoordinatesPointExpression point1, CoordinatesPointExpression point2)
 {
     return(Math.Sqrt(
                Math.Pow(point2.X - point1.X, 2) +
                Math.Pow(point2.Y - point1.Y, 2)));
 }
Exemple #3
0
 protected virtual SLExpression VisitCoordinatesPoint(CoordinatesPointExpression coordinatesPointExpression)
 {
     return(coordinatesPointExpression);
 }