获得svg / xaml弧的点数

时间:2011-11-20 13:34:22

标签: xaml math svg geometry geometric-arc

svg arc的格式(xaml中的弧具有相同的args):

(rx ry x-axis-rotation large-arc-flag sweep-flag x y)

描述:

  

从当前点到(x,y)绘制一个椭圆弧。椭圆的大小和方向由两个半径(rx,ry)和x轴旋转定义,其指示椭圆作为整体如何相对于当前坐标系旋转。自动计算椭圆的中心(cx,cy)以满足其他参数施加的约束。 large-arc-flag和sweep-flag有助于自动计算并帮助确定如何绘制弧。

我需要计算所有弧点(当然还有一些步骤)。我怎么能这样做?我想在C#或Java上编写代码。

1 个答案:

答案 0 :(得分:3)

Bresenham算法是为逐点绘图而发明的。 找到旋转椭圆的一些代码: http://research.microsoft.com/en-us/um/people/awf/graphics/bres-ellipse.html

添加了: 如何将零中心椭圆转换为所需的隐式形式(A,B,C,D,E,F)

A:=(Cos(fi)/ rx)^ 2 +(Sin(fi)/ ry)^ 2;

C:=(Sin(fi)/ rx)^ 2 +(Cos(fi)/ ry)^ 2;

B:= Sin(2 * fi)(1 /(ry ry) - 1 /(rx * rx));

d = E = 0;

F:= - 1

检查rx = 100,ry = 60,fi = Pi / 6: enter image description here

还有一步:Delphi函数获取任意椭圆的隐式形式。 我希望代码是可以理解的(Sqr(x)= x * x)

//calc implicit ellipse equation
//semiaxes rx, ry; rotated at fi radians; centered at (cx,cy)
//x = rx * Cos(t) * Cos(fi) - ry * Sin(t) * Sin(fi) + cx
//y = rx * Cos(t) * Sin(fi) + ry * Sin(t) * Cos(fi) + cy
//To obtain implicit equation, exclude t
//note: implicit form Ax^2+Bxy+Cy^2+Dx+Ey+F=0 (not 2B,2D,2E)

procedure CalcImplicitEllipseEquation(rx, ry, fi, cx, cy: Double;
                                      var A, B, C, D, E, F:  Double);
begin
  B := Sin(2 * Fi) * (ry * ry - rx * rx);
  A := Sqr(ry * Cos(fi)) + Sqr(rx * Sin(fi));
  C := Sqr(rx * Cos(fi)) + Sqr(ry * Sin(fi));
  D := -B * cy - 2 * A * cx;
  E := -2 * C * cy - B * cx;
  F := C * cy * cy + A * cx * cx + B * cx * cy - rx * rx * ry * ry;
end;