Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Метод Гуро

Автор: mihashark 11.05.2004 19:06

Люди,помогите закрасить пирамиду методом Гуро,а то я чё его не понимаю ни хрена!

Автор: mihashark 11.05.2004 19:18

Вот полная формулировка:закрасит усечённую пирамиду с правильным 6-тиугольником в основании,предусмотреть изменение ориентации пирамиды и двигать источник света!
Я сейчас дошёл до определения нормалей поверхностей!

Автор: BlackShadow 11.05.2004 19:25

Кхе, кхе...
А про етот метод по-подробней можно?

Автор: mihashark 11.05.2004 23:10

Если бы я знал,я бы не спрашивал!короче его суть в том, что надо расчитать интенсивность освещения в вершинах(это я почти сделал),а потом построчно расчитывать интенсивность каждого пикселя!это в принципе я смогу сделать(хотя пока не получилось),там одна математика!но чё делать дальше:вот у меня получилась интенсивность в точке,например, 3,68 и как мне закрасит этот пиксель с такой интенсивностью???

Автор: BlackShadow 11.05.2004 23:40

Установи режим на 24/32 бита, а затем используй что-нибудь типа

Код

Function Color(TvoyIntensivnost,MaxIntencivnost):TColor;
Var
 n:Integer;
Begin
 n:=Round(255*TvoyIntensivnost/MaxIntencivnost);
 Result:=RGB(n,n,n)
End;

Автор: mihashark 12.05.2004 2:15

Как установить 24/32 бита?
и что эта функция мне даст?она же не выводит на экран ничего?
и что такое maxintensivnost?
Объясни поподробней,пожалуйста!очень надо!

Автор: BlackShadow 12.05.2004 3:35

Объясняю.
Есть и под BP такие BGI-драйвера, которые умеют 24/32 бита. А под TMT Pascal, так это вообще родное.
Далее, ты сказал, что сможешь высчитать интенсивность каждого пикселя. Очень хорошо. Есть такое понятие, как градации серого. Для отображения твоей пирамидки тебе, я думаю, этого хватит. А ф-ция, которую я привёл как набросок, вычисляет именно подходящую градацию серого по простой пропорции. А maxintensivnost обозначает максимальную интенсивность, которую может принимать какая-либо точка.

Автор: Dark 12.05.2004 9:25

BlackShadow, А если не серого то тогда как : )

Автор: Dark 12.05.2004 9:31

mihashark, потом большая просьба скинуть программу.

Автор: BlackShadow 12.05.2004 12:38

Dark smile.gif
Можно сделать очень даже симпатично: со временем менять палитру. Т. е., допустим, первые 2 минуты использовать градации красного, затем синего, зелёного, жёлтого, серого... Довольно эффектно смотрится.

Автор: mihashark 12.05.2004 18:10

Т.е. RGB вычисляет яркость цвета,это я понял!а чё потом делать?
Так можно быдет:
[/RGB[n,n,n]
putpixel(x,y)]
и он этот пиксель закрасит с нужной интенсивностью???

Автор: mihashark 12.05.2004 18:18

И вообще чё за RGB?он пишет unknown identifier!!!

Автор: BlackShadow 12.05.2004 18:31

С чего бы это...
Ты, я так понял, под BP пишешь.
RGB там нету. И не интенсивность оно задаёт, а цвет формирует. Любой цвет состоит из трёх базовых: красного ( R ), зелёного ( G ) и синего ( B ). Если всего поровну, то получается, что-то серое, а вот яркость зависит от кол-во того другого и третьего.
Самому написать RGB очень легко:

Код

Function RGB(r,g,b:Byte):LongInt;Assembler;
Asm
 MOV AL,[r]
 MOV AH,[g]
 MOV DL,[b]
 XOR DH,DH
End;

либо

Function RGB(r,g,b:Byte):LonhInt;Assembler;
Asm
 MOV AL,[b]
 MOV AH,[g]
 MOV DL,[r]
 XOR DH,DH
End;

Какой из этих вариантов верен, я что-то никак сообразить не могу. Попробуй вывести пиксель очень красного цвета при помощи первого варианта. Если он будет очень синий, значит правильный второй smile.gif
А вообще PutPixel, если мне память не изменяет, требует 3 параметра: x, y и цвет. Угадай, откуда берётся третий *)

Автор: BlackShadow 12.05.2004 18:36

Прикольно, а я и не знал, что ( R ) без пробелов заменяется на ®

Автор: mihashark 12.05.2004 18:41

Оба варианта при параметрах 100,100,100 выводят красный цвет!
если парамеры одинаковые (5,5,5) и (10,10,10) он должен вывести один и тот же цвет,но с разной интенсивностью?

Автор: mihashark 12.05.2004 18:56

Слушай,BlackShadow,вруби аську так проще будет!

Автор: BlackShadow 12.05.2004 19:09

В теории да. А вот аську врубить не могу по загадочным причинам - она конектиться не хочет. Я ближе к ночи до дому доберусь, тогда можно будет и поговорить... Только я в Invisible всегда, так что пиши не стесняйся - подрублюсь, сразу отвечу.

Автор: mihashark 13.05.2004 2:32

BlackShadow,тот модуль что я скачал с http://pascal.sources.ru/graph/fastvesa.htm,я чето не могу инициализировать графический режим,не подскажешь как это сделать?

Автор: BlackShadow 13.05.2004 4:28

Надо вызвать StVESAMode с параметором
$100 - 640*400
$101 - 640*480
$103 - 800*600
$105 - 1024*768
$107 - 1280*1024
А, если держится VBE 2.0, то и $120 - 1600*1200
Только проверяй, тянется ли этот режим.

Автор: Dark 13.05.2004 10:09

погляди в задачах - вывод pcx, там изложена моя библиотечка...

Автор: BlackShadow 13.05.2004 14:22

Dark, а какой там формат палитры? По байту на R, G и B?

Автор: Dark 14.05.2004 6:54

ага, 768 байт - это 256 цветов (R,G,B )

Автор: BlackShadow 14.05.2004 14:24

-mihashark-, ну что, ещё вопросы есть?
И как там с результатом, написал?

Автор: mihashark 18.05.2004 14:27

да я чё то забил пока,других дел много!наверно в четверг-пятницу буду делать!но там ещё одна хрень в этом fastvesa-там есть процедура SetRGBColor,я её использую,но потом при выводе пикселя там требуеться указать цвет:putpixel(x,y,color),т.е. цвет надо указывать,а я его могу устанавливать только SetRGBColor,а именно задать число цветом не получаеться!посмотри как там это делаеться!я тебе на почту пришлю свою прогу,там ещё проблема в том что я не правильно вывожу пиксели(не туда куда нужно)!

Автор: virt 18.05.2004 19:35

mihashark
а ты на форуме выложи ,прикрепленным файлом.

Автор: mihashark 25.05.2004 14:20

BlackShadow, на чё,посмотрел?я смог залить пирамиду,но только если на неё сначала посмотреть,т.е. если её повернуть немного,то он по другому закрашивает!я скорее всего в delphi перекину,там RGB вроде встроенная есть,и выглядит лучше чем в паскале!
Ну чё поможешь закрасит пирамидку???