int angle, vx[360], vy[360];
vx[0] = xc + (int)floor(r); // r==r*cos(0)
vy[0] = yc + (int)floor(0); // 0==r*sin(0)
for(angle=1; angle<360; angle++) {
vx[angle] = xc + (int)floor(r*cos(PI*angle/180.0));
vy[angle] = yc + (int)floor(r*sin(PI*angle/180.0));
}
Рисование окружностей в режиме XOR_PUT
Заранее спасибо!
Цитата: v1rusw0rm
Собственно, сабж. Для тех, кто не знает, в этом режиме возможен вывод только с помощью процедур line, linerel, lineto, rectangle и drawpoly. Требуется написать процедуру, для рисования окружностей и дуг.
Надо - пиши.
Если пиксель в этом режиме вывести нельзя, то можно воспользоваться одним из двух:
1. Рисовать окружность как ломаную (количество сегментов выбирать в зависимости от радиуса).
2. Рисовать алгоритмом Брезенхема, вместо пикселей выводя отезки прямой нулевой длины (т.е. с совпадающими навчалом и концом).
3. Читать пиксель, самому делах XOR, после чего записывать обратно.
Да, и еще на счет "Надо - пиши". Не надо думать, что все у кого тут по 2-3 сообщения - дурачки, которые ждут готового. Просто думал, что кто-то уже делал это и сможет помочь алгоритмом хотя бы. С графикой в си я не работал, потому что специализируюсь на написании серверного ПО.
---
[COLOR="Red"]Отношения выясняем в личке, пожалуйста.
Вас никто за дурачка не держит. Формулируйте вопрос
более чётко и, думаю, проблем возникать не должно.
Модератор.[/COLOR]
Не нужно пытаться сначала "посчитать" некоторую окружность с запасом, а затем "уменьшать" ее, получая наползание одних точек на другие. Рисуется сразу элипс (вне зависимости от алгоритма), учитывающий aspect ratio экрана.
Ты пишешь о неких возникающих у тебя сложностях, но не пишешь, каким образом ты на них "выходишь", т.е. какм алгоритмом пытаешься рисовать. У меня таких проблем не возникает, поэтому я не могу догадаться о причине возникновения их у тебя до тех пор, пока ты не приведешь используемый тобой алгоритм (плоды многочасового "сидения"). Тогда попытаюсь найти в нам ошибку.
PS. Правила хорошего тона предписывают оформлять сообщения в виде вопросов или просьб, но никак не "требований". ;)
Например, для окружности можно использовать 2 массива из 360 элементов, заполнив их так:
Код:
Теперь окружность можно вывести с помощью отрезков:
Код:
for(angle=1; angle<360; angle++) {
line(vx[angle-1], vy[angle-1], vx[angle], vy[angle]);
}
line(vx[angle-1], vy[angle-1], vx[angle], vy[angle]);
}
С дугой или эллипсом будет сложнее, но их тоже нужно рисовать с помощью отрезков.
А дальше нужно проверить, встречается ли одна и та же вершина в массивах vx и vy несколько раз, и сколько именно. Если она встречается четное кол-во раз, то в XOR режиме точка исчезнет, тогда просто выводим этот пиксел снова:
Код:
int i, j, c;
for(i=0; i<360; i++) {
c=1; // in point (vx, vy[j])
for(j=0; j<360; j++)
if (i!=j && vx==vx[j] && vy==vy[j]) c++;
if (c%2==0) setpixel(vx, vy[j]);
}
for(i=0; i<360; i++) {
c=1; // in point (vx, vy[j])
for(j=0; j<360; j++)
if (i!=j && vx==vx[j] && vy==vy[j]) c++;
if (c%2==0) setpixel(vx, vy[j]);
}
Если нет функции setpixel(x,y), то можно использовать line(x,y, x,y).