Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
<DefendeR>
 Аватар для <DefendeR>
0 / 0 / 0
Регистрация: 29.11.2009
Сообщений: 8
26.05.2011, 22:37     Рисование одноцветного треугольника #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 минуты
люди!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2011, 22:37     Рисование одноцветного треугольника
Посмотрите здесь:

Написать программу, которая считывает длины сторон треугольника, проверяет возможность построения треугольника и находит все медианы этого треуголника C++
C++ Даны три положительных числа а, b, с. Проверить, будут ли они сторонами треугольника. Если да, то вычислить площадь этого треугольника.
C++ Даны длины сторон треугольника, определить тип этого треугольника
C++ Заданы длины двух сторон треугольника и угол между ними. найти площадь треугольника?
Дана сторона равностороннего треугольника. Найти площадь этого треугольника, его высоты, радиусы вписанной и описанной окружностей. C++
матрица разделена диагоналями на 4 треугольника, элементы верхнего и нижнего треугольника нулевые C++
По длинам двух сторон некоторого треугольника и углу между ними найти длину третьей стороны и площадь этого треугольника C++
Заданы координаты вершин треугольника. Вывести их в порядке обхода треугольника по часовой стрелке C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
<DefendeR>
 Аватар для <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();
 
}
вот изменил но все равно ошибки помогите плиз)))))
Yandex
Объявления
30.05.2011, 22:23     Рисование одноцветного треугольника
Ответ Создать тему
Опции темы

Текущее время: 15:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru