![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Дож |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 179 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я составлял прогу по рисованию закрашенного треугольника(процедура 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... ![]() Почему это так? -------------------- Доброго времени суток.
:nnn: |
![]() ![]() |
Дож |
![]()
Сообщение
#2
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 179 Пол: Мужской Репутация: ![]() ![]() ![]() |
А вот, что у меня
Код 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: |
![]() ![]() |
![]() |
Текстовая версия | 23.06.2025 15:03 |