Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.20;
Скачать: CL | DM;

Вниз

Ой изо-математика   Найти похожие ветки 

 
D.Z.   (2004-11-23 01:33) [0]

Спасайте!
Столько времени на ету гадость убил !
Перепробовал многие варианты, но увы ничего хорошего, а нужно лиш
две формулки перевода X,Y в изометрические-> X,Y без лишнего, всяких там смещений и тд.
Это как нетрудно догадаться для карты из изо-тайлов, размеры тайла 64x32.


 
П7   (2004-11-23 02:17) [1]

Junk Studio тебя спасёт. (:
Вместе с рамблером...

Почему-то мне кажется, что ты нифига на эту гадость не убивал... Т.к. в сети инфы валом.


 
cyborg ©   (2004-11-23 09:34) [2]

Чётные строки тайлов смещай на половину ширины вправо и выводи или наоборот, как больше нравится.


 
D.Z.   (2004-11-23 10:41) [3]

Вот кстати в рамблере,яндексе и тд. искал и много нашол да вот только ничего хорошего, например вот:
Tx:=(((X+mapX)-32)+2*(Y+mapY))div 64;
Ty:=(2*(X+mapY)-((X+mapX)-32))div 64;
недостатки вопервых,увеличить или уменьшить mapx или mapy можно
только на чётное число(карта будет прыгать), вовторых эти формулы дают в системме координат два нуля это влияет на результат при
переводе обратно в экранные. Могу привести ещё парочку "кислых"
формул но если в этом необходимость?
Ув. cyborg у меня не в этом проблемма, а в см.выше.


 
П7   (2004-11-23 11:24) [4]

А нафиг тебе непосредственно переводить координаты? Работу с палитрой никто ещё не отменял... + копай в сторону трёхмерщины. Не АПИ и принципы.
В общем поподробнее свою проблему опиши.


 
D.Z.   (2004-11-23 13:15) [5]

Так описываю.
Делаю изометрический движок,есть функция вывода ромбических тайлов, ну заполнение экрана ими, сначала чётные потом нечётные.
Предпологается что карта местности будет большая где-то
30000x30000 тайлов. Вывод естественно осуществляется не всей карты,а только то что помещается в экран вот кусок кода:

countH,countW количество тайлов по x,y экрана зависит от разрешения,
Wt,Ht размеры тайла,
vmpx<=Wt,vmpy<=Ht смещение для скроллинга карты,
sizex,sizey размер карты.

for y:=-2 to countH do
 for x:=-2 to countW do begin
  sx:=x*Wt+vmpx;
  sy:=y*Ht+vmpy;
  tx:=???? изо-координаты
  ty:=????
  if (tx>0)and(tx<=sizex)and(ty>0)and(ty<=sizey)then
  DrawTile(map[tx,ty],sx,sy, 1);
 end;

for y:=-2 to countH do
 for x:=-2 to countW do begin
  sx:=x*Wt+32+vmpx;
  sy:=y*Ht+16+vmpy;
  tx:=???? изо-координаты
  ty:=????
  if (tx>0)and(tx<=sizex)and(ty>0)and(ty<=sizey)then
  DrawTile(map[tx,ty],sx,sy, 1);
 end;
Надеюсь понятно, а проблемма вот в этих tx,ty!


 
Megabyte-ceercop ©   (2004-11-23 14:32) [6]


> D.Z.   (23.11.04 13:15) [5]

Смотри в чём ещё недостаток твоей процедуры отрисовки:
Тайлы у тебя ромбообразные, Соответственно отрисовываемая область будет большим ромбом. Если начнёш рисовать сопоставив верхнюю грань ромба с верхней гранью экрана, то внизу у тебя отрисовываемая область будет смещаться в угол.
Надо менять способ расчёта попадающих в экран тайлов.

А tx,ty - это я так понял индексы элемента карты а не координаты для вывода на экран.

Выщитывай эти ИНДЕКСЫ так:

tx:= vmpx+x;
ty:= vmpy+y;  //очень просто.

однако, как я уже сказал, основная проблема - правильный выбор области попадающей в экран.
Пробуй и пиши результат.


 
Mihey_temporary ©   (2004-11-23 20:32) [7]


> Делаю изометрический движок,есть функция вывода ромбических
> тайлов, ну заполнение экрана ими, сначала чётные потом нечётные.


Это ты на DelphiGFX прочитал? Брось, выводи по-человечески. Отсёт координат делай с левого верхнего угла квадратной карты, а не того, что на экране.


 
D.Z.   (2004-11-24 09:27) [8]

Координаты вывода на экран это sx,sy, а tx,ty это должны быть координаты тайловой карты, вот эти две формулы(сообщение[3])
нормально работают но недостатки я перечислил, всю карту я могу смещать переменными mapx,mapy и тем самым регулировать от куда начнётся отрисовка карты, и ещё нахождение tx,ty нужно для работы
мыши так же повторяю что немного переделав формулы(сообщение[3])
соответственно работает и мышь с возможностью выбора нужных
тайлов, вот видите как трудно найти реальные формулки,а приводя
примеры с различными алгоритмами ситуацию неизмениш, вот простенькая задачка для примера - перевести допустим координату
520,400 в изометрическую без всяких смещений по карте и начиная отсчет с верхнего левого угла прямоугольной карты.


 
ninja ©   (2004-11-24 12:11) [9]


> D.Z.   (24.11.04 09:27) [8]

блин, ну ты грузишь! каша какая-то.
Ты же вроде написал, что формулы в [3] работают? в чём проблема-то? Какая разница, со смещением считать, или из угла..


 
ninja ©   (2004-11-24 12:21) [10]


> D.Z.  

если хочешь, могу выслать те на мыло свой модуль. там по методу пододеяльника. работает корректно вроде, только для карт размера 1х1 что-то глючит, но это не смертельно наверно :)


 
D.Z.   (2004-11-24 14:33) [11]

ninja я негружу, а пытаюсь объяснить проблемму,а на счёт формул
так там [3] я перечислил недостатки этих формул но лудше если
хочеш проверь сам-лудше поймёш, а исходник вышли очень интересно будет посмотреть, а новых формул так и непоявилось:( может
их просто нет?


 
П7   (2004-11-25 07:19) [12]

почему все всегда делали без этого бреда, а ты вот чё-то придумал и пытаешься реализовать через задницу.
скачай десяток исходников и посмотри.



Страницы: 1 вся ветка

Текущий архив: 2005.02.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
6-1102612799
Eraszer
2004-12-09 20:19
2005.02.20
Получение списка локальных IP адресов.


14-1107167858
pasha_golub
2005-01-31 13:37
2005.02.20
Картинка


14-1107241397
wal
2005-02-01 10:03
2005.02.20
О том, как программисты обрезают строки.


3-1106054433
zunder
2005-01-18 16:20
2005.02.20
DBGrid с поддержкой перемещения записей(строк)


14-1106691207
GanibalLector
2005-01-26 01:13
2005.02.20
ищу хорошую книгу по программированию





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский