Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
<DefendeR>
0 / 0 / 0
Регистрация: 29.11.2009
Сообщений: 8
#1

Рисование одноцветного треугольника - C++

26.05.2011, 22:37. Просмотров 838. Ответов 1
Метки нет (Все метки)

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

Пусть требуется нарисовать на экране любой закрашенный треугольник (рис. 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++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#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 часов зачет!!!!!!!!

Добавлено через 21 час 22 минуты
люди!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2011, 22:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рисование одноцветного треугольника (C++):

Рисование двигающегося треугольника - C++
Помогите а то с рисованием не дружу((( Надо нарисовать треугольник, который двигается и по часовой и против часовой

Известна гипотенуза С и противолежащий угол B прямоугольного треугольника. Найти периметр треугольника - C++
Помогите написать данную программу: Известна гипотенуза С и противолежащий угол B прямоугольного треугольника. Найти периметр треугольника

матрица разделена диагоналями на 4 треугольника, элементы верхнего и нижнего треугольника нулевые - C++
Задание матрица разделена диагоналями на 4 треугольника, элементы верхнего и нижнего треугольника нулевые.Не понимаю,как сделать???помогите...

Даны длины сторон треугольника, определить тип этого треугольника - C++
Даны длины сторон треугольника, определить тип этого треугольника

Заданы координаты вершин треугольника. Вывести их в порядке обхода треугольника по часовой стрелке - C++
Заданы координаты вершин треугольника.Вывести их в порядке обхода треугольника по часовой стрелке. Вот код, но правильный ли он?! ...

С клавиатуры вводятся три числа, считая их сторонами треугольника найти углы этого треугольника - C++
с клавиатуры вводятся три числа, считая их сторонами треугольника найти углы этого треугольника, можно это как-то просто написать, без...

1
<DefendeR>
0 / 0 / 0
Регистрация: 29.11.2009
Сообщений: 8
30.05.2011, 22:23  [ТС] #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <graphics.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <iostream.h>
 
void horline(float sy, float x1, float x2)
 {
 /* Запрос автоопределения */
 int graphdriver = DETECT, gmode, errorcode;
 
 
 /* инициализация графики и локальных переменных */
 initgraph(&graphdriver,&gmode,"");
 
 /* получение результата инициализации */
 errorcode = graphresult();
 if(errorcode != grOk)  /* если ошибка */
 {
    printf("Ошибка :%s\n",grapherrormessage(errorcode)); 
    printf("Для останова нажмите любую клавишу\n");
    getch();
    exit(1);  /* завершение с кодом ошибки */
 }
 setcolor(getmaxcolor(1));
 
 
 
 line(x1,sy,x2,sy);
 
 retutn 0;
 }
 
void main(void)
{
  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; }
 
  void horline(float sy, float x1, float x2);
 
for (sy = By; sy <= Cy; sy++)
{
 
  x1 = Bx + (sy - By) * (Cx - Ax) / (Cy - Ay);
  if (sy < Ay)
    x2 = Bx + (sy - By) * (Ax - Bx) / (Ay - By);
  else
  {
    if (Cy == Ay)
      x2 = Ax;
    else
      x2 = Ax + (sy - Ay) * (Cx - Ax) / (Cy - Ay);
  }
  if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; }
 
  void horline(float sy, float x1, float x2);
 }  
for (sy = Ay; sy <= By; sy++)
{  
  x1 = Ax + (sy - Ay) * (Bx - Cx) / (By - Cy);
  if (sy < Ay)
    x2 = Ax + (sy - Ay) * (Cx - Ax) / (Cy - Ay);
  else
  {
    if (By == Cy)
      x2 = Cx;
    else
      x2 = Cx + (sy - Cy) * (Bx - Cx) / (By - Cy);
  }
  if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; }
void horline(float sy, float x1, float x2);
 
 
 
getch();
 
}
вот изменил но все равно ошибки помогите плиз)))))
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2011, 22:23
Привет! Вот еще темы с ответами:

Заданы длины двух сторон треугольника и угол между ними. найти площадь треугольника? - C++
Заданы длины двух сторон треугольника и угол между ними. найти площадь треугольника?

Зная площадь прямоугольного треугольника и угол при основании, найти все стороны треугольника - C++
Требования к программе: - Входные данные ввести с помощью стандартных процедур ввода; - На печать вывести значение входной переменной и...

Дана сторона равностороннего треугольника. Найти площадь этого треугольника, его высоты, радиусы вписанной и описанной окружностей. - C++
Дана сторона равностороннего треугольника. Найти площадь этого треугольника, его высоты, радиусы вписанной и описанной окружностей.

Даны три положительных числа а, b, с. Проверить, будут ли они сторонами треугольника. Если да, то вычислить площадь этого треугольника. - C++
Помогите, пожалуйста, исправить здесь ошибку времени... #include&lt;iostream&gt; #include&lt;cmath&gt; using namespace std; void main() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.