public Point2D GetPointByOffset(double offset, bool isFromPoint1) { Point2D from = isFromPoint1 ? Point1 : Point2; Point2D to = isFromPoint1 ? Point2 : Point1; AbscissaDirection abscissaDirection = from.X.IsLessThanOrApproximatelyEqualTo(to.X) ? AbscissaDirection.LeftToRight : AbscissaDirection.RightToLeft; OrdinateDirection ordinateDirection = from.Y.IsLessThanOrApproximatelyEqualTo(to.Y) ? OrdinateDirection.BottomToTop : OrdinateDirection.TopToBottom; var point = LineEquation.GetPointByOffset(from, offset, abscissaDirection, ordinateDirection); if (point is null) { throw new InvalidOperationException($"Cannot get point on line segment {this} by offset {offset}"); } return(point.Value); }
public Point2D GetPointByDistance(double x, double distance, AbscissaDirection direction) { if (distance.IsApproximately(0.0)) { return(new Point2D(x, CalculateY(x))); } if (distance.IsLessThanOrApproximatelyEqualTo(0.0)) { distance = Math.Abs(distance); direction = direction == AbscissaDirection.LeftToRight ? AbscissaDirection.RightToLeft : AbscissaDirection.LeftToRight; } var xDistance = Math.Sqrt(distance.Square() / (Slope.Square() + 1)); var x1 = x - xDistance; var x2 = x + xDistance; var pointX = direction == AbscissaDirection.LeftToRight ? (x1.IsGreaterThanOrApproximatelyEqualTo(x) ? x1 : x2) : (x1.IsLessThanOrApproximatelyEqualTo(x) ? x1 : x2); return(new Point2D(pointX, CalculateY(pointX))); }
private void SetAxesDirections() { dynamic xLeft = default(dynamic); dynamic yBottom = default(dynamic); dynamic xRight = default(dynamic); dynamic yTop = default(dynamic); sheet.GetDrawingArea(ref xLeft, ref yBottom, ref xRight, ref yTop); if (yTop < yBottom) ordinateDirection = OrdinateDirection.TopToBottom; else ordinateDirection = OrdinateDirection.BottomToTop; if (xLeft < xRight) abscissaDirection = AbscissaDirection.LeftToRight; else abscissaDirection = AbscissaDirection.RightToLeft; }