1

svg arc 的格式(xaml 中的 arc 具有相同的参数):

(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 上编写代码。

4

1 回答 1

3

Bresenham 算法是为逐点绘图而发明的。

为旋转椭圆找到了一些代码(回路机

补充:如何将零中心椭圆转换为所需的隐式形式(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: 在此处输入图像描述

更进一步: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;
于 2011-11-20T15:48:57.577 回答