Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private double GetGeometryLength(Geometry geometry)
- {
- double result = 0;
- var pathGeometry = geometry as PathGeometry;
- if (pathGeometry != null)
- {
- foreach (var figure in pathGeometry.Figures)
- {
- var currentPoint = figure.StartPoint;
- foreach (var segment in figure.Segments)
- {
- var bezier = segment as BezierSegment;
- var line = segment as LineSegment;
- if (bezier != null)
- {
- result += GetBezierLength(currentPoint, bezier.Point1, bezier.Point2, bezier.Point3);
- currentPoint = bezier.Point3;
- }
- else if (line != null)
- {
- result += GetLineLength(currentPoint, line.Point);
- currentPoint = line.Point;
- }
- }
- }
- }
- return result;
- }
- private double GetBezierLength(Point p0, Point p1, Point p2, Point p3)
- {
- double result = 0;
- Point lastPoint = p0;
- for (double t = 0.001; t <= 1; t += 0.001)
- {
- Point currentPoint;
- // Формула кубической кривой Безье
- // https://ru.wikipedia.org/wiki/Кривая_Безье
- currentPoint.X = Math.Pow(1 - t, 3) * p0.X +
- 3 * t * Math.Pow(1 - t, 2) * p1.X +
- 3 * t * t * (1 - t) * p2.X +
- Math.Pow(t, 3) * p3.X;
- currentPoint.Y = Math.Pow(1 - t, 3) * p0.Y +
- 3 * t * Math.Pow(1 - t, 2) * p1.Y +
- 3 * t * t * (1 - t) * p2.Y +
- Math.Pow(t, 3) * p3.Y;
- double dx = currentPoint.X - lastPoint.X;
- double dy = currentPoint.Y - lastPoint.Y;
- result += Math.Sqrt(dx * dx + dy * dy);
- lastPoint = currentPoint;
- }
- return result;
- }
- private double GetLineLength(Point p0, Point p1)
- {
- double dx = p0.X - p1.X;
- double dy = p0.Y - p1.Y;
- return Math.Sqrt(dx * dx + dy * dy);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement