Browse Source

Merge pull request #321 from hacklex/arcto-bezier

Fixed a bug in ArcTo::GetAngle
pull/325/head
Nikita Tsukanov 11 years ago
parent
commit
9e2046d6ed
  1. 15
      src/Shared/RenderHelpers/ArcToHelper.cs

15
src/Shared/RenderHelpers/ArcToHelper.cs

@ -974,8 +974,7 @@ namespace Perspex.RenderHelpers
static double GetAngle(Vector v1, Vector v2) static double GetAngle(Vector v1, Vector v2)
{ {
var scalar = v1 * v2; var scalar = v1 * v2;
var angleSign = Math.Sign(v1.X * v2.Y - v1.Y * v2.X); return Math.Atan2(v1.X * v2.Y - v2.X * v1.Y, scalar);
return angleSign * Math.Acos(scalar / (v1.Length * v2.Length));
} }
/// <summary> /// <summary>
@ -1030,7 +1029,7 @@ namespace Perspex.RenderHelpers
double y1S2 = p1S.Y * p1S.Y; double y1S2 = p1S.Y * p1S.Y;
double x1S2 = p1S.X * p1S.X; double x1S2 = p1S.X * p1S.X;
double nominator = rx2*ry2 - rx2*y1S2 - ry2*x1S2; double numerator = rx2*ry2 - rx2*y1S2 - ry2*x1S2;
double denominator = rx2*y1S2 + ry2*x1S2; double denominator = rx2*y1S2 + ry2*x1S2;
if (Math.Abs(denominator) < 1e-8) if (Math.Abs(denominator) < 1e-8)
@ -1038,7 +1037,7 @@ namespace Perspex.RenderHelpers
path.LineTo(p2); path.LineTo(p2);
return; return;
} }
if ((nominator / denominator) < 0) if ((numerator / denominator) < 0)
{ {
double lambda = x1S2/rx2 + y1S2/ry2; double lambda = x1S2/rx2 + y1S2/ry2;
double lambdaSqrt = Math.Sqrt(lambda); double lambdaSqrt = Math.Sqrt(lambda);
@ -1048,16 +1047,16 @@ namespace Perspex.RenderHelpers
ry *= lambdaSqrt; ry *= lambdaSqrt;
rx2 = rx*rx; rx2 = rx*rx;
ry2 = ry*ry; ry2 = ry*ry;
nominator = rx2 * ry2 - rx2 * y1S2 - ry2 * x1S2; numerator = rx2 * ry2 - rx2 * y1S2 - ry2 * x1S2;
if (nominator < 0) if (numerator < 0)
nominator = 0; numerator = 0;
denominator = rx2 * y1S2 + ry2 * x1S2; denominator = rx2 * y1S2 + ry2 * x1S2;
} }
} }
double multiplier = Math.Sqrt(nominator / denominator); double multiplier = Math.Sqrt(numerator / denominator);
Point mulVec = new Point(rx * p1S.Y / ry, -ry * p1S.X / rx); Point mulVec = new Point(rx * p1S.Y / ry, -ry * p1S.X / rx);
int sign = (clockwise != isLargeArc) ? 1 : -1; int sign = (clockwise != isLargeArc) ? 1 : -1;

Loading…
Cancel
Save