SimpleSegment.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.Collections.Generic;
  2. using System.Windows;
  3. namespace HandyControl.Expression.Drawing;
  4. internal class SimpleSegment
  5. {
  6. public enum SegmentType
  7. {
  8. Line,
  9. CubicBeizer
  10. }
  11. private SimpleSegment()
  12. {
  13. }
  14. public Point[] Points { get; private set; }
  15. public SegmentType Type { get; private set; }
  16. public static SimpleSegment Create(Point point0, Point point1)
  17. {
  18. var segment = new SimpleSegment
  19. {
  20. Type = SegmentType.Line,
  21. Points = new[] { point0, point1 }
  22. };
  23. return segment;
  24. }
  25. public static SimpleSegment Create(Point point0, Point point1, Point point2)
  26. {
  27. var point = GeometryHelper.Lerp(point0, point1, 0.66666666666666663);
  28. var point3 = GeometryHelper.Lerp(point1, point2, 0.33333333333333331);
  29. var segment = new SimpleSegment
  30. {
  31. Type = SegmentType.CubicBeizer,
  32. Points = new[] { point0, point, point3, point2 }
  33. };
  34. return segment;
  35. }
  36. public static SimpleSegment Create(Point point0, Point point1, Point point2, Point point3)
  37. {
  38. var segment = new SimpleSegment
  39. {
  40. Type = SegmentType.CubicBeizer,
  41. Points = new[] { point0, point1, point2, point3 }
  42. };
  43. return segment;
  44. }
  45. public void Flatten(IList<Point> resultPolyline, double tolerance, IList<double> resultParameters)
  46. {
  47. switch (Type)
  48. {
  49. case SegmentType.Line:
  50. resultPolyline.Add(Points[1]);
  51. if (resultParameters == null) break;
  52. resultParameters.Add(1.0);
  53. return;
  54. case SegmentType.CubicBeizer:
  55. BezierCurveFlattener.FlattenCubic(Points, tolerance, resultPolyline, true,
  56. resultParameters);
  57. break;
  58. default:
  59. return;
  60. }
  61. }
  62. }