Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2011, 01:16   #1
<DefendeR>
 
Аватар для <DefendeR>
 
Регистрация: 05.10.2009
Сообщений: 5
По умолчанию Рисование одноцветного треугольника

Так вот теория:
Рисование одноцветного треугольника методом сканирующей линии

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



Рис.1. а – закрашенный треугольник ABC, б – его построчное разложение на отрезки

Сначала отсортируем вершины так, чтобы вершина A была верхней, а C – нижней, тогда min_y = A.y, max_y = C.y, а затем пройдем по всем строкам от min_y до max_y горизонтальной сканирующей линией sy (scanline на рис. 1):

A.y ≤ sy ≤ C.y

Если sy < B.y, то она пересекает стороны AB и AC; если sy ≥ B.y – то стороны BC и AC. Поскольку нам известны координаты всех вершин, то мы можем написать уравнения сторон и найти точки пересечения нужной стороны с прямой y = sy, т.е. получим два конца отрезка. Чтобы установить, какой из них левый, а какой правый, сравним их координаты по X и обменяем значения, если надо. Теперь рисуем этот отрезок на экране. Повторяем такую процедуру для каждой строки – и треугольник нарисован.
Остановимся более подробно на нахождении точки пересечения прямой y = sy (текущей строки) и стороны треугольника, например AB. Запишем уравнение прямой AB в форме x = k•y + b:

x = A.x + (y – A.y) • (B.x – A.x) / (B.y – A.y)

Подставляем сюда известное для текущей строки значение y = sy:

x = A.x + (sy – A.y) • (B.x – A.x) / (B.y – A.y)

Для других сторон точки пересечения находят тем же способом.
Ниже приведен пример кода. Обратите внимание, что предусмотрена защита от случая, когда B.y = C.y – в этом случае произойдет попытка деления на ноль (если C.y = A.y, то треугольник пустой и рисовать его не стоит, или можно рисовать горизонтальную линию; а если B.y = A.y, то sy ≥ A.y и до деления на B.y – A.y не дойдет).

// ...
// здесь сортируем вершины (A,B,C)
// ...
for (sy = A.y; sy <= C.y; sy++)
{
x1 = A.x + (sy - A.y) * (C.x - A.x) / (C.y - A.y);
if (sy < B.y)
x2 = A.x + (sy - A.y) * (B.x - A.x) / (B.y - A.y);
else
{
if (C.y == B.y)
x2 = B.x;
else
x2 = B.x + (sy - B.y) * (C.x - B.x) / (C.y - B.y);
}
if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; }
drawHorizontalLine(sy, x1, x2);
}
// ...



Вот мои наработки:
Код C++

Код:
#include <graphics.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <iostream.h>
 
 
void main(void)
{
  int gdriver = DETECT, gmode, errorcode;
  initgraph(&gdriver, &gmode, "");
  errorcode = graphresult();
  if (errorcode != grOk)  //ошибка перехода в граф. режим
  {
    cout << "Grafics Error " << grapherrormsg(errorcode);
    return;
  }
 
  float Ay,Ax,By,Bx,Cy,Cx, x1,x2,sy, tmp;
 
   cout << " Please Enter Koordinats A (x)"<<endl;
  cin >> Ax;
     cout << " Please Enter Koordinats A (y)"<<endl;
  cin >> Ay,
    cout << " Please Enter Koordinats B (x)"<<endl;
  cin >> Bx;
      cout << " Please Enter Koordinats B (y)"<<endl;
  cin >> By;
    cout << " Please Enter Koordinats C (x)"<<endl;
  cin >> Cx;
      cout << " Please Enter Koordinats C (x)"<<endl;
  cin >> Cy;
  for (sy = Ay; sy <= Cy; sy++)
{
  x1 = Ax + (sy - Ay) * (Cx - Ax) / (Cy - Ay);
  if (sy < By)
    x2 = Ax + (sy - Ay) * (Bx - Ax) / (By - Ay);
  else
  {
    if (Cy == By)
      x2 = Bx;
    else
      x2 = Bx + (sy - By) * (Cx - Bx) / (Cy - By);
  }
  if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; }
while (x1>x2) moveto(x1,sy);
lineto(x1,sy);
 
}
getch();
closegraph();
}


Вобщем координаты вводиться но треугольник не выводиться, подскажите пожалуйста, где ошибка мне кажется что я линию не так строю, помогите пожалуйста. Через 5 часов зачет!!!!!!!!
<DefendeR> вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вершина треугольника Apophis Общие вопросы C/C++ 2 15.02.2011 21:57
рисование треугольника ArniLand Общие вопросы C/C++ 13 31.01.2011 01:53
Уголы треугольника grimm_jow Общие вопросы по Java, Java SE, Kotlin 3 13.07.2010 18:20
Делфи. Рисование треугольника Skrip Помощь студентам 3 23.12.2009 23:11
вращение треугольника в С++ bum90 Помощь студентам 3 28.04.2009 15:28