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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перевод кода Pascal в C++ http://www.cyberforum.ru/cpp-beginners/thread305114.html
Доброго времени суток, форумчане! Помогите переделать пару строк с pascal На c++. (Хотя бы самые основные, ибо это парсинг и почти аналогичные, отличаются искомым символом в строке) В pascale не особо сильна, поэтому для меня составляет некоторую сложность переписать следующий код unit Recognition; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,...
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. Просмотров 813. Ответов 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