2016-10-31 6 views
2

У меня есть функция в C++, которая рисует эллипс. Теперь я хочу добавить параметр заполнения к этому эллипсу. Как мне это сделать? Я пробовал использовать алгоритм заполнения заливки, но он работает неправильно, когда поверхность уже содержит картины.Как заполнить форму эллипса?

Вот мой текущий алгоритм:

const double TwoPI = (PI * 2); 
const double Step = (PI/180.0f); 

for(double i = 0; i < TwoPI; i += Step) 
{ 
    float x_offset = (radiusX * cos((float) i)); 
    float y_offset = (radiusY * sin((float) i)); 

    int x = int(a_X + x_offset); 
    int y = int(a_Y + y_offset); 

    if(prevX == -1 && prevY == -1) 
     Plot(x, y, color); 
    else 
     Line(prevX, prevY, x, y, color); 
} 
+2

В какой библиотеке вы используете? 'C++' не имеет графической библиотеки, определенной стандартом. Вы имеете в виду OpenGL и т. Д.? – CoryKramer

+0

Почему вы не заполняете, когда рисуете? – stark

+1

@CoryKramer: для вопроса с алгоритмом это довольно неуместно. Очевидно, что с реальной графической библиотекой ответ будет «использовать предоставленную функцию« DrawEllipse », но это было бы ответом уже для незаполненного эллипса. – MSalters

ответ

3

Ну, одна идея может быть просто пройти половину круга, и вместо того, чтобы вычислить точки, которые расположены симметрично вокруг т.е. оси у. Затем нарисуйте горизонтальную линию между ними, заполнив все пиксели.

+0

Так что вместо использования функции 'Line()' я бы использовал ее для вычисления всех пикселей между двумя точками на одной оси? – Z0q

+0

@ Zoq: Нет, идея состоит в том, что вы используете линию Line, но вы рисуете линию от (-X, Y) до (X, Y). Если вы будете использовать альтернативные цвета для каждой строки, вы увидите горизонтальную полосу. (Но с вашим размером шага _fixed angular_, многие из этих строк будут перекрываться. Вам лучше взять шаг с фиксированной вертикалью) – MSalters

+0

Я понимаю. Когда эллипс маленький, они перекрываются, но когда эллипс большой, они будут далеки друг от друга. – Z0q

0

Вы путешествуете в обе стороны и дроу линию от края до края Что-то вроде этого: Я не пытался запустить его. Это просто идея. Он должен рисовать заполненный круг.

const double TwoPI = (PI * 2); 
const double Step = (PI/180.0f); 
double start=0; 
for(double i = 0; i < TwoPI; i += Step) 
{ 
    float x_offset = (radiusX * cos((float)start+ i)); 
    float y_offset = (radiusY * sin((float) start+i)); 

    float x2_offset = (radiusX * cos((float)start - i)); 


    int x = int(a_X + x_offset); 
    int x2 = int(a_X + x_offset); 
    int y = int(a_Y + y_offset); 


    Line(x, y, x2, y, color); 
} 
Смежные вопросы