Помощь - Поиск - Пользователи - Календарь
Полная версия: Рисование закрашенного треугольника
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Дож
Я составлял прогу по рисованию закрашенного треугольника(процедура triangleDraw). Задаются точки A,B,C и цвет col.

Алгоритм таков:
1) Сортируем точки так, что A.y<B.y и C.y>B.y;
2) От sy=A.y до C.y находим точки пересечения со сторонами и
3)рисуем горизонтальную линию в этих координатах.

Описал алгоритм ужасно, подробнее см. http://www.enlight.ru/faq3d/articles/24.htm

Код

USES CRT;

Procedure setGraph;
begin
asm
  mov ax,13h
  int 10h
end;
end;

Procedure PutPixel(x,y:integer;col:byte);
begin
If (x<321)and(x>-1)and(y<200)and(y>-1) then
Mem[$A000:x+y*320]:=col;
end;

Function  GetPixel(x,y:integer) : byte;
begin
GetPixel:=Mem[$A000:x+y*320];
end;

Type Point2D = record
    x,y : integer;
    end;

Procedure triangleDraw(A,B,C:Point2D;col:byte);
Var i,sy,x1,x2:integer;
   T : Point2D;
begin
{сортировка вершин}
If A.y>B.y then begin T:=B; B:=A; A:=T; end;
If A.y>C.y then begin T:=C; C:=A; A:=T; end;
If B.y>C.y then begin T:=B; B:=C; C:=T; end;
{завершение сортировки}
{Основной цикл подпрограммы}
sy:=A.y;
 While sy<>C.y do begin
  sy:=sy+1;
   {Поиск точек пересечения для sy}
   x1:=round(A.x+(sy-A.y)*(C.x-A.x)/(C.y-A.y));
   If sy<B.y then begin
    x2:=round(A.x+(sy-A.y)*(B.x-A.x)/(B.y-A.y));
   end else begin
    If C.y=B.y then begin
     x2:=B.x;
    end else begin
     x2:=round(B.x+(sy-B.y)*(C.x-B.x)/(C.y-B.y));
    end;
   end;
   {Точки найденны, надо отсортировать}
  If (x1>x2) then begin
  T.x:=x1; x1:=x2; x2:=T.x;
  end;
   {отсортированны, надо нарисовать}
  i:=x1;
   While i<>x2 do begin
    i:=i+1;
    PutPixel(i,sy,col);
   end;
    {Все, для sy сделали то, что хотели}
end;
end;

Const A1 : Point2D = (x : 300;y : 150);
     A2 : Point2D = (x : 150;y : 170);
     A3 : Point2D = (x : 5;y : 5);

BEGIN
setGraph;
TriangleDraw(A3,A1,A2,70);
PutPixel(250,100,67);
readln;
END.


Проблема состоит вот в чем: при sy=117 рисуется не то, что нужно. А точнее
в операторе
Код

x1:=round(A.x+(sy-A.y)*(C.x-A.x)/(C.y-A.y));

вместо ~103 x1 принимает отрицательное значение, хотя виндовый калькулятор выдает нужные 103.42424242... blink.gif
Почему это так?
volvo
Очень странно, что это у тебя происходит... Я только что попробовал распечатать значения sy и x1 вместо того чтобы их отрисовывать. Вот так:
While sy<>C.y do begin
sy:=sy+1;
x1:=round(A.x+(sy-A.y)*(C.x-A.x)/(C.y-A.y));
writeln('sy = ', sy:5, ' x1 = ', x1); { <--- Печатаем здесь }
If sy<B.y then begin
x2:=round(A.x+(sy-A.y)*(B.x-A.x)/(B.y-A.y));
...

Вот что получилось:
Цитата
sy =  113 x1 = 100
sy =  114 x1 = 101
sy =  115 x1 = 102
sy =  116 x1 = 103
sy =  117 x1 = 103 <--- Здесь проблем нет
sy =  118 x1 = 104
sy =  119 x1 = 105
sy =  120 x1 = 106


Как видишь, все нормально - никаких проблем, никаких отрицательных чисел...

P.S. А теперь, внимание, вопрос: :D
Зачем опять же изобретать свой велосипед и делать такую процедуру, когда можно воспользоваться процедурой FillPoly? Или ты думаешь, что у тебя получится лучше, чем у Борланда? Сомневаюсь...
Дож
Цитата
Зачем опять же изобретать свой велосипед и делать такую процедуру, когда можно воспользоваться процедурой FillPoly? Или ты думаешь, что у тебя получится лучше, чем у Борланда? Сомневаюсь...


Я не хочу пользоваться графом, т.к. он очень медленен... А для 3D графики нужна большая скорость, а так же в последствии сделать текстурирование... (Вообще потом я все это хочу перенести в 32-разрядный паскаль и улучшить граф. режим...)

Цитата
Очень странно, что это у тебя происходит...


Попробуй откомпилированную у меня:
Дож
Цитата
а так же в последствии сделать текстурирование


Что не позволит сделать FillPoly со своими скудными возможностями...
Дож
А вот, что у меня
Код

sy=6; x1=6; x2=7
sy=7; x1=7; x2=9
sy=8; x1=8; x2=11
sy=9; x1=9; x2=13
sy=10; x1=9; x2=15
sy=11; x1=10; x2=17
sy=12; x1=11; x2=19
sy=13; x1=12; x2=21
sy=14; x1=13; x2=23
sy=15; x1=14; x2=25
sy=16; x1=15; x2=27
sy=17; x1=16; x2=29
sy=18; x1=16; x2=31
sy=19; x1=17; x2=33
sy=20; x1=18; x2=36
sy=21; x1=19; x2=38
sy=22; x1=20; x2=40
sy=23; x1=21; x2=42
sy=24; x1=22; x2=44
sy=25; x1=23; x2=46
sy=26; x1=23; x2=48
sy=27; x1=24; x2=50
sy=28; x1=25; x2=52
sy=29; x1=26; x2=54
sy=30; x1=27; x2=56
sy=31; x1=28; x2=58
sy=32; x1=29; x2=60
sy=33; x1=30; x2=62
sy=34; x1=30; x2=64
sy=35; x1=31; x2=66
sy=36; x1=32; x2=68
sy=37; x1=33; x2=70
sy=38; x1=34; x2=72
sy=39; x1=35; x2=74
sy=40; x1=36; x2=76
sy=41; x1=37; x2=78
sy=42; x1=38; x2=80
sy=43; x1=38; x2=82
sy=44; x1=39; x2=84
sy=45; x1=40; x2=86
sy=46; x1=41; x2=88
sy=47; x1=42; x2=90
sy=48; x1=43; x2=92
sy=49; x1=44; x2=95
sy=50; x1=45; x2=97
sy=51; x1=45; x2=99
sy=52; x1=46; x2=101
sy=53; x1=47; x2=103
sy=54; x1=48; x2=105
sy=55; x1=49; x2=107
sy=56; x1=50; x2=109
sy=57; x1=51; x2=111
sy=58; x1=52; x2=113
sy=59; x1=52; x2=115
sy=60; x1=53; x2=117
sy=61; x1=54; x2=119
sy=62; x1=55; x2=121
sy=63; x1=56; x2=123
sy=64; x1=57; x2=125
sy=65; x1=58; x2=127
sy=66; x1=59; x2=129
sy=67; x1=59; x2=131
sy=68; x1=60; x2=133
sy=69; x1=61; x2=135
sy=70; x1=62; x2=137
sy=71; x1=63; x2=139
sy=72; x1=64; x2=141
sy=73; x1=65; x2=143
sy=74; x1=66; x2=145
sy=75; x1=67; x2=147
sy=76; x1=67; x2=149
sy=77; x1=68; x2=151
sy=78; x1=69; x2=154
sy=79; x1=70; x2=156
sy=80; x1=71; x2=158
sy=81; x1=72; x2=160
sy=82; x1=73; x2=162
sy=83; x1=74; x2=164
sy=84; x1=74; x2=166
sy=85; x1=75; x2=168
sy=86; x1=76; x2=170
sy=87; x1=77; x2=172
sy=88; x1=78; x2=174
sy=89; x1=79; x2=176
sy=90; x1=80; x2=178
sy=91; x1=81; x2=180
sy=92; x1=81; x2=182
sy=93; x1=82; x2=184
sy=94; x1=83; x2=186
sy=95; x1=84; x2=188
sy=96; x1=85; x2=190
sy=97; x1=86; x2=192
sy=98; x1=87; x2=194
sy=99; x1=88; x2=196
sy=100; x1=88; x2=198
sy=101; x1=89; x2=200
sy=102; x1=90; x2=202
sy=103; x1=91; x2=204
sy=104; x1=92; x2=206
sy=105; x1=93; x2=208
sy=106; x1=94; x2=210
sy=107; x1=95; x2=213
sy=108; x1=96; x2=215
sy=109; x1=96; x2=217
sy=110; x1=97; x2=219
sy=111; x1=98; x2=221
sy=112; x1=99; x2=223
sy=113; x1=100; x2=225
sy=114; x1=101; x2=227
sy=115; x1=102; x2=229
sy=116; x1=103; x2=231
sy=117; x1=-219; x2=103 {<-- x1 отрицательно, а x2 БРЕДОГО!!!}
sy=118; x1=-217; x2=104
sy=119; x1=-215; x2=105
sy=120; x1=-213; x2=106
sy=121; x1=-211; x2=107
sy=122; x1=-209; x2=108
sy=123; x1=-207; x2=109
sy=124; x1=-205; x2=110
sy=125; x1=-203; x2=110
sy=126; x1=-201; x2=111
sy=127; x1=-199; x2=112
sy=128; x1=-197; x2=113
sy=129; x1=-195; x2=114
sy=130; x1=-193; x2=115
sy=131; x1=-191; x2=116
sy=132; x1=-189; x2=117
sy=133; x1=-187; x2=117
sy=134; x1=-185; x2=118
sy=135; x1=-182; x2=119
sy=136; x1=-180; x2=120
sy=137; x1=-178; x2=121
sy=138; x1=-176; x2=122
sy=139; x1=-174; x2=123
sy=140; x1=-172; x2=124
sy=141; x1=-170; x2=125
sy=142; x1=-168; x2=125
sy=143; x1=-166; x2=126
sy=144; x1=-164; x2=127
sy=145; x1=-162; x2=128
sy=146; x1=-160; x2=129
sy=147; x1=-158; x2=130
sy=148; x1=-156; x2=131
sy=149; x1=-154; x2=132
sy=150; x1=132; x2=300  {А здесь неожиданно все нормально!}
sy=151; x1=133; x2=293
sy=152; x1=134; x2=285
sy=153; x1=135; x2=278
sy=154; x1=136; x2=270
sy=155; x1=137; x2=263
sy=156; x1=138; x2=255
sy=157; x1=139; x2=248
sy=158; x1=139; x2=240
sy=159; x1=140; x2=233
sy=160; x1=141; x2=225
sy=161; x1=142; x2=218
sy=162; x1=143; x2=210
sy=163; x1=144; x2=203
sy=164; x1=145; x2=195
sy=165; x1=146; x2=188
sy=166; x1=146; x2=180
sy=167; x1=147; x2=173
sy=168; x1=148; x2=165
sy=169; x1=149; x2=158
sy=170; x1=150; x2=150


Ни с того ни с сего начинается ерунда... :molitva:
volvo
Значит так: Кнопку "Правка" видишь? Она по-твоему, для чего?

Второе: вот аналог того, что ты здесь написал:

Я пока научусь попиксельно выводить прямоугольники, а потом свою программу перенесу в Дельфи и буду так отрисовывать формы, ибо BGI графика скудная очень...
О чем ты говоришь? Библиотеки для кого пишутся? Вот для таких изобретателей велосипедов, как ты?... Пользуйся DirectX или OpenGL, там есть возможности, которые тебе и не снились... (и текстурирование в том числе...)

Кстати, о скудных возможностях... Ты много графических программ написал? И много ли ты использовал библиотек, чтобы говорить о "скудных возможностях" той или иной библиотеки?
Дож
О каком текстурирование может идти речь, когда возможно закрашивать треугольники(фигуры) двумя цветами узором, задающимся матрицей 8x8???
Цитата
ибо BGI графика скудная очень...

Говорил я не про BGI графику в целом, а про процедуру FillPoly.
Цитата
Ты много графических программ написал?

Достаточно, что бы понять о возможностях борландского графа... И все же, volvo, я хочу решить проблему, а ты говоришь уйти от нее...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.