GetFlattenedPathGeometryメソッドを使って曲線のPathGeometryから直線のPathGeometryを取得
GetFlattenedPathGeometry(tolerance, ToleranceType)
Tolerance:公差、許容できる誤差をdouble型で指定
ToleranceType:Absolute絶対 or Relative相対のどちらかを指定
Toleranceの値を大きくすると雑になる
青線は曲線に見えるくらい細かい直線の集まり、丁寧で正確
ToleranceType.Relative
ToleranceType.Absolute
ベジェ曲線を少し変更、伸ばしてみた
Relative
さっきは1.2だった
Absolute
なので元になるPathGeometryの長さとか大きさで変わるみたい
でも、どれくらいの値を指定すればどれくらいの丁寧さが得られるのかの見当がつかないなあ、何を基準にした絶対や相対なのかがわからん
デザイン画面
コード
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
namespace _20180613_曲線Pathを直線Pathに変換
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
PathGeometry pathGeometry = MyPath.Data.GetFlattenedPathGeometry();
StepLine.Data = pathGeometry;
StepSlider.ValueChanged += StepSlider_ValueChanged;
StepSlider.MouseWheel += StepSlider_MouseWheel;
RadioRelative.Checked += Radio_Checked;
RadioAbsolute.Checked += Radio_Checked;
}
//RadioButtonのチェック変更時
private void Radio_Checked(object sender, RoutedEventArgs e)
{
ChangeGeometry();
}
//Sliderのマウスホイール動作時
private void StepSlider_MouseWheel(object sender, MouseWheelEventArgs e)
{
if (e.Delta > 0)
{
StepSlider.Value += StepSlider.SmallChange;
}
else
{
StepSlider.Value -= StepSlider.SmallChange;
}
}
//Sliderの値変更時
private void StepSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
ChangeGeometry();
}
//GetFlattenedPathGeometryを使って曲線のPathGeometryから直線のPathGeometryを取得して変更
private void ChangeGeometry()
{
//tolerance(公差、許容できる誤差)は0に近いほど正確だけど、そのぶん計算量が多そう
//toleranceTypeはよくわからん、Absolute絶対 or Relative相対を指定
if (RadioAbsolute.IsChecked == true)
{
StepLine.Data = MyPath.Data.GetFlattenedPathGeometry(StepSlider.Value, ToleranceType.Absolute);
}
else if (RadioRelative.IsChecked == true)
{
StepLine.Data = MyPath.Data.GetFlattenedPathGeometry(StepSlider.Value, ToleranceType.Relative);
}
}
}
}
曲線を近似の直線に変換してもあんまり嬉しくないけど、直線にすると長さを測れるとかがある
コード