76 lines
2.1 KiB
C#
76 lines
2.1 KiB
C#
using System.Collections.Generic;
|
|
using System.Windows;
|
|
|
|
namespace HandyControl.Expression.Drawing
|
|
{
|
|
internal class SimpleSegment
|
|
{
|
|
public enum SegmentType
|
|
{
|
|
Line,
|
|
|
|
CubicBeizer
|
|
}
|
|
|
|
|
|
private SimpleSegment()
|
|
{
|
|
}
|
|
|
|
public Point[] Points { get; private set; }
|
|
|
|
public SegmentType Type { get; private set; }
|
|
|
|
public static SimpleSegment Create(Point point0, Point point1)
|
|
{
|
|
var segment = new SimpleSegment
|
|
{
|
|
Type = SegmentType.Line,
|
|
Points = new[] {point0, point1}
|
|
};
|
|
return segment;
|
|
}
|
|
|
|
public static SimpleSegment Create(Point point0, Point point1, Point point2)
|
|
{
|
|
var point = GeometryHelper.Lerp(point0, point1, 0.66666666666666663);
|
|
var point3 = GeometryHelper.Lerp(point1, point2, 0.33333333333333331);
|
|
var segment = new SimpleSegment
|
|
{
|
|
Type = SegmentType.CubicBeizer,
|
|
Points = new[] {point0, point, point3, point2}
|
|
};
|
|
return segment;
|
|
}
|
|
|
|
public static SimpleSegment Create(Point point0, Point point1, Point point2, Point point3)
|
|
{
|
|
var segment = new SimpleSegment
|
|
{
|
|
Type = SegmentType.CubicBeizer,
|
|
Points = new[] {point0, point1, point2, point3}
|
|
};
|
|
return segment;
|
|
}
|
|
|
|
public void Flatten(IList<Point> resultPolyline, double tolerance, IList<double> resultParameters)
|
|
{
|
|
switch (Type)
|
|
{
|
|
case SegmentType.Line:
|
|
resultPolyline.Add(Points[1]);
|
|
if (resultParameters == null) break;
|
|
resultParameters.Add(1.0);
|
|
return;
|
|
|
|
case SegmentType.CubicBeizer:
|
|
BezierCurveFlattener.FlattenCubic(Points, tolerance, resultPolyline, true,
|
|
resultParameters);
|
|
break;
|
|
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
} |