GeometryExtension.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Media;
  4. using HandyControl.Expression.Drawing;
  5. namespace HandyControl.Tools.Extension;
  6. public static class GeometryExtension
  7. {
  8. /// <summary>
  9. /// 获取路径总长度
  10. /// </summary>
  11. /// <param name="geometry"></param>
  12. /// <returns></returns>
  13. public static double GetTotalLength(this Geometry geometry)
  14. {
  15. if (geometry == null) return 0;
  16. var pathGeometry = PathGeometry.CreateFromGeometry(geometry);
  17. pathGeometry.GetPointAtFractionLength(1e-4, out var point, out _);
  18. var length = (pathGeometry.Figures[0].StartPoint - point).Length * 1e+4;
  19. return length;
  20. }
  21. /// <summary>
  22. /// 获取路径总长度
  23. /// </summary>
  24. /// <param name="geometry"></param>
  25. /// <param name="size"></param>
  26. /// <param name="strokeThickness"></param>
  27. /// <returns></returns>
  28. public static double GetTotalLength(this Geometry geometry, Size size, double strokeThickness = 1)
  29. {
  30. if (geometry == null) return 0;
  31. if (MathHelper.IsVerySmall(size.Width) || MathHelper.IsVerySmall(size.Height)) return 0;
  32. var length = GetTotalLength(geometry);
  33. var sw = geometry.Bounds.Width / size.Width;
  34. var sh = geometry.Bounds.Height / size.Height;
  35. var min = Math.Min(sw, sh);
  36. if (MathHelper.IsVerySmall(min) || MathHelper.IsVerySmall(strokeThickness)) return 0;
  37. length /= min;
  38. return length / strokeThickness;
  39. }
  40. }