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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++/CLI WinForms Вопрос с RichListBox http://www.cyberforum.ru/cpp-beginners/thread305113.html
Такой вопрос, ричлистбокс является строковой функции зависящий от lines, мне нужно найти кол-во слов в тексте введенном в ричлистбокс, помогите реализовать эту функцию. private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { int num=0; for(int i=0; i<richTextBox1->Lines->Length; i++) { String ^str=richTextBox1->Lines; ...
C++ Определить суммарный обьём в литрах 12 вложенных друг в друга шаров 1.Определить, в какую из облостей (1,2 или 3) попадает точка с заданными координатами (для простоты принять, что абсцисса точки не равна 1.5 или 5). 2.Определить суммарный обьём в литрах.12 вложенных друг в друга шаров со стенками толщеной 5 мм. Внутрений диаметр внутренго шара равен 10 см. Принять,что шары вкладываются в друг в друга без зазоров. Спасибо. http://www.cyberforum.ru/cpp-beginners/thread305105.html
C++ Нужно создать массив с случайных чисел всё остальное внутри
нужно создать массив случайных чисел и найти в этом массиве его наименьший элемент и вывести его и его индекс! плз помогите оч нужно буду оч благодарен
C++ реализация класса
Дано: класс "Фильмы" (название, жанр, главные роли). Вопрос: Возможно ли такой подход к реализации? class films { string film_name; // название фильма string film_genre; // жанр string playing_the_main_roles; // главные роли public:
C++ Манипулятор ws http://www.cyberforum.ru/cpp-beginners/thread305089.html
Собственно вопрос в следующем: может ли кто-то показать, как использовать манипулятор ws. Он, если я правильно понял, должен пробелы удалять. На простом примерчике желательно объяснить. Заранее спасибо.
C++ Массивы Ребят,нужно написать программу на Borland C++ 5.02 Не Builder!!!. Вот задание:Дано произвольные одномерный массив целых чисел М и натуральное число n. Определить, если такие есть,а также количество чисел n в массиве М и их индекс.Заранее спасибо!!!! подробнее

Показать сообщение отдельно
<DefendeR>
0 / 0 / 0
Регистрация: 29.11.2009
Сообщений: 8

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

26.05.2011, 22:37. Просмотров 805. Ответов 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 минуты
люди!!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru