Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Рисование окружностей в режиме XOR_PUT

36K
24 сентября 2008 года
v1rusw0rm
6 / / 13.04.2008
Собственно, сабж. Для тех, кто не знает, в этом режиме возможен вывод только с помощью процедур line, linerel, lineto, rectangle и drawpoly. Требуется написать процедуру, для рисования окружностей и дуг.

Заранее спасибо!
1.9K
25 сентября 2008 года
andriano
474 / / 10.01.2008
Цитата: v1rusw0rm
Собственно, сабж. Для тех, кто не знает, в этом режиме возможен вывод только с помощью процедур line, linerel, lineto, rectangle и drawpoly. Требуется написать процедуру, для рисования окружностей и дуг.

Надо - пиши.
Если пиксель в этом режиме вывести нельзя, то можно воспользоваться одним из двух:
1. Рисовать окружность как ломаную (количество сегментов выбирать в зависимости от радиуса).
2. Рисовать алгоритмом Брезенхема, вместо пикселей выводя отезки прямой нулевой длины (т.е. с совпадающими навчалом и концом).
3. Читать пиксель, самому делах XOR, после чего записывать обратно.

36K
26 сентября 2008 года
v1rusw0rm
6 / / 13.04.2008
Вы меня, конечно, извините, но я просидел за этой процедурой несколько часов и не смог сделать нормальной реализации. Проблема в том, что требуется выводить фигуру в масштабе, то есть при любой разрешении экрана, окружноть должна быть окружностью, а не эллипсом. А теперь самое неприятное. При низком разрешении и учете коэффициента полуается такая проблема: надо поставить пиксели 50, 100 и 50, 101. Но из-за масштаба, координату игрек надо умножить на 0,5. В итоге после округления, обе ккординаты станут 50, 50. А из-за КсорПута эти две точки сами же себя и сотрут. Да, конечно можно проверять, а не белая ли точка по этой координате. Но тогда возникает вторая проблема: окружность надо рисовать и двигать по белой фоновой картинке. А проверить, относится ли белая точка к окружности или к фоновой картинке - невозможно.

Да, и еще на счет "Надо - пиши". Не надо думать, что все у кого тут по 2-3 сообщения - дурачки, которые ждут готового. Просто думал, что кто-то уже делал это и сможет помочь алгоритмом хотя бы. С графикой в си я не работал, потому что специализируюсь на написании серверного ПО.

---
[COLOR="Red"]Отношения выясняем в личке, пожалуйста.
Вас никто за дурачка не держит. Формулируйте вопрос
более чётко и, думаю, проблем возникать не должно.


Модератор.[/COLOR]
1.9K
26 сентября 2008 года
andriano
474 / / 10.01.2008
Под "коэффициентом", наверное, понимается aspect ratio.
Не нужно пытаться сначала "посчитать" некоторую окружность с запасом, а затем "уменьшать" ее, получая наползание одних точек на другие. Рисуется сразу элипс (вне зависимости от алгоритма), учитывающий aspect ratio экрана.
Ты пишешь о неких возникающих у тебя сложностях, но не пишешь, каким образом ты на них "выходишь", т.е. какм алгоритмом пытаешься рисовать. У меня таких проблем не возникает, поэтому я не могу догадаться о причине возникновения их у тебя до тех пор, пока ты не приведешь используемый тобой алгоритм (плоды многочасового "сидения"). Тогда попытаюсь найти в нам ошибку.

PS. Правила хорошего тона предписывают оформлять сообщения в виде вопросов или просьб, но никак не "требований". ;)
30K
15 октября 2008 года
Ден Зурин
28 / / 17.02.2008
Задача интересная. Может, использовать массивы для хранения вершин?
Например, для окружности можно использовать 2 массива из 360 элементов, заполнив их так:
 
Код:
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));
}

Теперь окружность можно вывести с помощью отрезков:
 
Код:
for(angle=1; angle<360; 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]);
}

Если нет функции setpixel(x,y), то можно использовать line(x,y, x,y).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог