private static void Segment(IList<ScreenPoint> points, ScreenPoint p0, ScreenPoint p1, ScreenPoint p2, ScreenPoint p3, double alpha,
double tolerance) {
if (Equals(p1, p2)) {
points.Add(p1);
return;
}
if (Equals(p0, p1)) {
p0 = Prev(p1, p2);
}
if (Equals(p2, p3)) {
p3 = Prev(p2, p1);
}
var t0 = 0d;
var t1 = GetT(t0, p0, p1, alpha);
var t2 = GetT(t1, p1, p2, alpha);
var t3 = GetT(t2, p2, p3, alpha);
var iterations = (int)((Math.Abs(p1.X - p2.X) + Math.Abs(p1.Y - p2.Y)) / tolerance);
for (var t = t1; t < t2; t += (t2 - t1) / iterations) {
var a1 = Sum(Mult((t1 - t) / (t1 - t0), p0), Mult((t - t0) / (t1 - t0), p1));
var a2 = Sum(Mult((t2 - t) / (t2 - t1), p1), Mult((t - t1) / (t2 - t1), p2));
var a3 = Sum(Mult((t3 - t) / (t3 - t2), p2), Mult((t - t2) / (t3 - t2), p3));
var b1 = Sum(Mult((t2 - t) / (t2 - t0), a1), Mult((t - t0) / (t2 - t0), a2));
var b2 = Sum(Mult((t3 - t) / (t3 - t1), a2), Mult((t - t1) / (t3 - t1), a3));
var c1 = Sum(Mult((t2 - t) / (t2 - t1), b1), Mult((t - t1) / (t2 - t1), b2));
points.Add(c1);
}
}