IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Рисование закрашенного треугольника
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 179
Пол: Мужской

Репутация: -  1  +


Я составлял прогу по рисованию закрашенного треугольника(процедура 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
Почему это так?


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 179
Пол: Мужской

Репутация: -  1  +


А вот, что у меня
Код

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:


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 8.09.2025 14:42
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name