Получить очки SVG / XAML дуги - PullRequest
1 голос
/ 20 ноября 2011

Формат svg arc (дуги в xaml имеют одинаковые аргументы):

(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 Ответ

3 голосов
/ 20 ноября 2011

Алгоритм Брезенхема изобретен для точечного рисования.Некоторый код, найденный для вращающегося эллипса: 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: = грех (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;
...