|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
26.05.2011, 01:16 | #1 |
Регистрация: 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++ Код:
Вобщем координаты вводиться но треугольник не выводиться, подскажите пожалуйста, где ошибка мне кажется что я линию не так строю, помогите пожалуйста. Через 5 часов зачет!!!!!!!! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вершина треугольника | 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 |