1

svgアークのフォーマット(xamlのアークは同じ引数を持っています):

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

説明:

現在のポイントから(x、y)まで楕円弧を描きます。楕円のサイズと方向は、2つの半径(rx、ry)とx軸の回転によって定義されます。これは、楕円全体が現在の座標系に対してどのように回転するかを示します。楕円の中心(cx、cy)は、他のパラメーターによって課せられる制約を満たすために自動的に計算されます。large-arc-flagとsweep-flagは自動計算に貢献し、アークがどのように描画されるかを決定するのに役立ちます。

私はそれの弧のすべての点を計算する必要があります(もちろん、いくつかのステップで)。どうすればいいですか?C#またはJavaでコーディングしたいと思います。

4

1 に答える 1

3

Bresenham アルゴリズムは、点ごとの描画のために発明されました。

回転楕円のコードが見つかりました ( wayback machine )

追加: ゼロ中心の楕円を必要な暗黙の形式 (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 を確認: ここに画像の説明を入力

もう 1 つのステップ:任意の楕円の暗黙的な形式を取得する 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 に答える