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


Гость






Очень странно, что это у тебя происходит... Я только что попробовал распечатать значения 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? Или ты думаешь, что у тебя получится лучше, чем у Борланда? Сомневаюсь...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

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

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


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


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

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


Попробуй откомпилированную у меня:


Прикрепленные файлы
Прикрепленный файл  triangle.rar ( 9.95 килобайт ) Кол-во скачиваний: 192


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


Бывалый
***

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

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


Цитата
а так же в последствии сделать текстурирование


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


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


Бывалый
***

Группа: Пользователи
Сообщений: 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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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

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

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

Кстати, о скудных возможностях... Ты много графических программ написал? И много ли ты использовал библиотек, чтобы говорить о "скудных возможностях" той или иной библиотеки?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

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

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


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

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

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

Сообщение отредактировано: Дож -


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

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

 





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