50 lines
1.6 KiB
C#
50 lines
1.6 KiB
C#
using System;
|
|
using System.Windows;
|
|
using System.Windows.Media;
|
|
using HandyControl.Expression.Drawing;
|
|
|
|
namespace HandyControl.Tools.Extension
|
|
{
|
|
public static class GeometryExtension
|
|
{
|
|
/// <summary>
|
|
/// 获取路径总长度
|
|
/// </summary>
|
|
/// <param name="geometry"></param>
|
|
/// <returns></returns>
|
|
public static double GetTotalLength(this Geometry geometry)
|
|
{
|
|
if (geometry == null) return 0;
|
|
|
|
var pathGeometry = PathGeometry.CreateFromGeometry(geometry);
|
|
pathGeometry.GetPointAtFractionLength(1e-4, out var point, out _);
|
|
var length = (pathGeometry.Figures[0].StartPoint - point).Length * 1e+4;
|
|
|
|
return length;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取路径总长度
|
|
/// </summary>
|
|
/// <param name="geometry"></param>
|
|
/// <param name="size"></param>
|
|
/// <param name="strokeThickness"></param>
|
|
/// <returns></returns>
|
|
public static double GetTotalLength(this Geometry geometry, Size size, double strokeThickness = 1)
|
|
{
|
|
if (geometry == null) return 0;
|
|
|
|
if (MathHelper.IsVerySmall(size.Width) || MathHelper.IsVerySmall(size.Height)) return 0;
|
|
|
|
var length = GetTotalLength(geometry);
|
|
var sw = geometry.Bounds.Width / size.Width;
|
|
var sh = geometry.Bounds.Height / size.Height;
|
|
var min = Math.Min(sw, sh);
|
|
|
|
if (MathHelper.IsVerySmall(min) || MathHelper.IsVerySmall(strokeThickness)) return 0;
|
|
|
|
length /= min;
|
|
return length / strokeThickness;
|
|
}
|
|
}
|
|
} |