Алгоритм толщины эллипса - PullRequest
1 голос
/ 10 января 2011

Кто-нибудь знает алгоритм рисования эллипса с толщиной? Я погуглил, но нашел только алгоритмы, которые рисуют эллипс шириной в 1 пиксель, например: http://homepage.smc.edu/kennedy_john/belipse.pdf

Спасибо.

Ответы [ 3 ]

0 голосов
/ 10 января 2011

Пусть E1 - эллипс радиуса r + толщина / 2, а E2 - эллипс радиуса r - толщина / 2.

Адаптируйте Алгоритм заполнения Scanline для заполнения E1 без заполнения E2.

0 голосов
/ 11 января 2011

Под эллипсом с толщиной вы подразумеваете разницу между двумя эллипсами: один, где две оси были удлинены на 1/2 толщины, а другой - где он был укорочен на 1/2 толщины?

Если это так, то вы можете адаптировать связанный алгоритм в алгоритм заполнения линии сканирования. Одна вещь, которую вы хотите сделать, это работать только вдоль более короткой оси. (работа вдоль более длинной оси тоже работает, но требует избыточных вычислений).

Скажем, он шире, чем высокий. (Если наоборот, просто переворачивайте оси при рисовании.) В этом случае вы будете рисовать один или два горизонтальных отрезка для каждой позиции y.

  • Для каждого значения y от вершины внешнего эллипса до центра эллипсов:
    • Если у выше внутреннего эллипса:
      • Нарисуйте один горизонтальный отрезок прямой от верхней левой точки квадранта на внешнем эллипсе до верхней правой точки квадранта на внешнем эллипсе.
    • Остальное (у не выше внутреннего эллипса):
      • Нарисуйте два горизонтальных отрезка:
        • Один от верхней левой квадрантной точки внешнего эллипса до верхней левой квадрантной точки внутреннего эллипса.
        • Еще одна точка от верхнего правого квадранта внутреннего эллипса до верхнего правого квадранта внешнего эллипса.
    • В любом случае, зеркально отразите весь рисунок по оси X эллипсов, чтобы визуализировать два нижних квадранта.
0 голосов
/ 10 января 2011

насколько точно вы должны быть?

Вы хотите, чтобы реальная точка эллипса находилась в приблизительном центре границы ширины пикселя 'x'? реальная точка эллипса должна быть внутренним краем? внешний край?

Я спрашиваю, б / к алгоритм, который вы нашли, старается придерживаться целочисленной математики, где это возможно, поэтому я добавлю к его алгоритму целочисленную работу.

  • Внутренний край: измените подпрограмму Plot4EllipsePoints, чтобы рисовать x пикселей вместо одного, где новые x пикселей находятся дальше от центра эллипса. 2 пикселя, например:

    процедура Plot4EllipsePoints (X, Y: longint);

    begin
       PutPixel(CX+X, CY+Y);          {point in quadrant 1}
       PutPixel(CX+X+1, CY+Y+1);          {point in quadrant 1}
       PutPixel(CX-X, CY+Y);          {point in quadrant 2}
       PutPixel(CX-X-1, CY+Y+1);          {point in quadrant 2}
       PutPixel(CX-X, CY-Y);          {point in quadrant 3}
       PutPixel(CX-X-1, CY-Y-1);          {point in quadrant 3}
       PutPixel(CX+X, CY-Y)           {point in quadrant 4}
       PutPixel(CX+X+1, CY-Y-1)           {point in quadrant 4}
    end;
    

    взято из: http://homepage.smc.edu/kennedy_john/belipse.pdf

  • внешний край: такой же, как внутренний край, но ближе к центру эллипса.
  • по центру: выполнить внутренний край + внешний край оба. Это будет иметь только нечетные толщины, 1 пиксель, 3 пикселя, 5 пикселей.
...