Помогите, пожалуйста, с решением данной задачи!
рис1
Из рисунка1 следует, что изображение треугольника на экране – это набор горизонтальных отрезков оси абсцисс, при чем каждой строке экрана соответствует один отрезок, проведенный между точками пересечения отрезков со сторонами треугольника AB и AC, затем BC и AC.
Составим математическую модель. Координаты точек пересечения отрезков со сторонами треугольника будут рассчитываться по следующим формулам:
X = Ax + (Bx – Ax) / (By – Ay) * (By – Ay)
X2 (1) = Ay + (Sy – Ay) / (Bx – Ax) / (By – Ay)
X1 = Ax + (Sy – Ay) * (Cx – Ax) / (By – Ay)
X2 (2) = Bx + (Sy – By) * (Cx – Bx) / (Cy – By)
Далее приведем словесное описание алгоритма будущей программы.
рис2
После проведения сортировки координат вершин данного треугольника необходимо организовать цикл, обеспечивающий рисование линий для ординаты Y, которая изменяется от Ymin до Ymax. В теле цикла необходимо определить координаты точек X1 и X2 и затем провести между ними линию заданного цвета.
Помогите пожалуйста! на вас одна надежда! Заранее огромное спасибо!
Добилась того, что программа рисует треугольник, а вот с закраской возникли проблемы и еще не совсем понимаю, как использовать формулы
Координаты точек пересечения отрезков со сторонами треугольника будут рассчитываться по следующим формулам:
X = Ax + (Bx – Ax) / (By – Ay) * (By – Ay)
X2 (1) = Ay + (Sy – Ay) / (Bx – Ax) / (By – Ay)
X1 = Ax + (Sy – Ay) * (Cx – Ax) / (By – Ay)
X2 (2) = Bx + (Sy – By) * (Cx – Bx) / (Cy – By)
Помогите, пожалуйста советом!
Прикрепленные файлы
TREYG.PAS ( 452 байт )
Кол-во скачиваний: 246
Какая графическая библиотека?
Графический модуль graph.bgi
УДАЛИТЕ МОЮ ТЕМУ!!!!!!!!!!!!!!! РАЗ НИКТО НЕ МОЖЕТ ПОМОЧЬ МНЕ!!!!!!!!!!!!
Lapp , спасибо огромное! все-таки мир не без добрых людей! :-)
Я, если честно, сама до конца не понимаю для чего даны эти формулы..
У меня вот какие соображения..
Посмотри, пожалуйста, как на твой взгляд - правильно это или нет..
ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!!
Pautina, так если ваша цель просто закрасить треугольник, то почему бы не воспользоваться floodfill при условии, что мы знаем одну из точек внутри него и цвет границы? Или всё, что описано в 1м посте это строго задание ? Просто мне показалось, что это личные размышления
Итак, по делу..
Ты извини, но мне было проще привести свое решение с нуля. Попробуй с ним разобраться - ладно? Спрашивай, если что неясно.
Сначала рассмотрим рисунок:
Принципиально различных случая я вижу два (возможную параллельность сторон осям координат пока не рассматриваем): синий и зеленый. Процесс заполнения также делится на две стадии: красную (от А до первой встреченной по У вершины) и рыжий (остальное).
1. Сначала находим вершину с минимальным Y и называем ее А.
2. Затем две оставшиеся упорядочиваем по Х: В и С, Вх<Cx.
3. Находим минимум и максимум из чисел Ву и Су и запоминаем их соответственно в переменных d и е.
4. Проходим по Y от Ау до d, вычисляя х1 и х2 исходя из пересечения линии на уровне у, параллельной оси Х, и соответствующего отрезка.
5. То же самое, что и 4, но для других отрезков, от d до е.
Формулы будут такие..
Дано: y.
Найти х1 и х2.
Синий случай:
Красная фаза:
x1 = Ax+(Bx-Ax)*(y-Ay)/(By-Ay)
Рыжая фаза:
x1 = Bx+(Cx-Bx)*(y-By)/(Cy-By)
х2 в обеих фазах одинаковый:
x2 = Ax+(Cx-Ax)*(y-Ay)/(Cy-Ay)
Зеленый случай:
х1 в обеих фазах одинаковый:
x1 = Ax+(Bx-Ax)*(y-Ay)/(By-Ay)
Красная фаза:
x2 = Ax+(Сx-Ax)*(y-Ay)/(Сy-Ay)
Рыжая фаза:
x2 = Cx+(Bx-Cx)*(y-Cy)/(By-Cy)
Эти формулы выведены из простых соотношений пропорции, исходя из подобия треугольников. Они однотипны, и при кодировании можно достичь немалой экономии, если использовать функции.
Теперь достаточно сделать два цикла: один от Ах до d, второй от d до е (или один цикл от Ах до е с проверкой условия), где собственно и отрисовываем отрезки.
Случаи, когда равны нулю знаменатели в формулах (стороны параллельны оси Х), нужно рассмотреть отдельно. Фактически это означает выпадение красной или рыжей фазы (или обеих).
Вроде, все..
Lapp, спасибо огромное за помощь. Скажи, а как мне после нахождения вершины с минимальным y
a1:=random(640);
b1:=random(480);
a2:=random(640);
b2:=random(480);
a3:=random(640);
b3:=random(480);
PutPixel(a1,b1,4);
PutPixel(a2,b2,4);
PutPixel(a3,b3,4);
if (b1>b2) and (b1>b3) then A:=b1 else
begin
if (b2>b1) and (b2>b3) then A:=b2 else A:=b3;
end;
Во-первых, не забывай, что ты ищешь минимальный Y, а не максимальный. Так что знаки неравенств надо поменять.
При упорядочивании нужно перекладывать координаты (и X, и Y) через буфер:
if a3<a2 then begin
d:=a2;
a2:=a3;
a3:=d;
d:=b2;
b2:=b3;
b3:=d;
end;
type
tPoint = record
x,y : integer; {координаты}
I : string {название точки};
end;
tTriangle = array [1..3] of tPoint;
if T[3].x<T[2].x then begin
d:=T[2];
T[2]:=T[3];
T[3]:=d;
end;
procedure Swap(T:tTriangle; i,j:integer);
var
d:tPoint;
begin
if T[3].x<T[2].x then begin
d:=T[2];
T[2]:=T[3];
T[3]:=d;
end
end;
{...}
if T[3].x<T[2].x then Swap(T,2,3);
if T[2].x<T[1].x then Swap(T,1,2);
if T[3].x<T[2].x then Swap(T,2,3);