Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Вниз

Волшебная точка   Найти похожие ветки 

 
.cpp   (2005-06-02 21:27) [0]

Здравствуйте

У меня очень простая проблемка.

Пример:
У меня есть отрезок длиной M, и на нём размещена точка (например на центре). Я увеличиваю длину отрезка каждый раз на одинаковую величину, например, на 10. Нужно чтобы точка при этом оставалась на центре. Т.е. точка должна смещаться пропорционально увеличению отрезка.

Нужно определить формулку для смещения этой точки.
Это что-то типа стретча при маштабировании изображений.


 
Sphinx ©   (2005-06-02 22:05) [1]

50% от длинны - универсальней формулы не бывает


 
Кефир87   (2005-06-02 22:06) [2]

x = M/2?


 
XProger ©   (2005-06-02 22:19) [3]

Кефир87, не надо было! ;)


 
Zer0 ©   (2005-06-02 22:19) [4]

[bored]
пусть отрезок задан двумя шестимерными векторами a[0..5], b[0..5], как и координата точки z[0..6] которая находится на этом отрезке.

находим длинну M отрезка как корень квадратный из суммы квадратов разностей составляющих ~a и ~b

таким же образом определяем расстояние от ~a до ~z - получается некая константа L.

затем меняем значения векторов ~a и ~b, рассчитывает новую длинну M1, затем вычитаем из ~b ~a, нормируем, умножаем на L/M*M1 и сумируем с ~a.
вот и коордианат новой точки. смещение получается простой векторной разностью.
[/bored]

btw где же ты, автомодератор? одолжи мне пожалуйста плюсомет...


 
Zer0 ©   (2005-06-02 22:38) [5]

совсем забыл, что этот аглогрим работает только в гомогенных неискривленных пространствах =(

очевидно что "волшебные точки" существуют в пространствах с искривленной метрикой, так что придется тебе изучать математику...


 
.cpp   (2005-06-03 08:50) [6]

Кефир87 x = M/2 это было бы если мне только центр каждый раз нужно было бы находить (я его только для примера написал).

Zer0 © я честно говоря ничё не понял... Зачем шестимерные векторные координаты?

Я ставлю точку на рисунке (Image1.Canvas.Pixels...), например на маленький дом. Потом как бы оттягиваю изображение за нижний угол:

Rect.Right := Rect.Right+10;
Rect.Bottom := Rect.Bottom+10);


потом изображение перерисовывается со стретчем:

Image1.Canvas.DrawStretch(Rect, Image);

Так я маштабирую изображение. Теперь дом сдвинулся в сторону. Но теперь та точка будет находиться не на этом маленьком доме... Нужно чтобы она также правильно смещалась (т.е. X := X + ???; Y := Y + ???) и оставалась на маленьком домике.


 
XProger ©   (2005-06-03 09:09) [7]

Это такой изощрённый способ создания иллюзии 3D?
А домножать текущую координату не пробовали на X/Width*NewWidth?


 
.cpp   (2005-06-04 17:29) [8]

Я делаю интерактивную карту. Приближаю изображение путём увеличения ширины и высоты изображения и отрисовки этого изображения (стретч - растягивание по ширине и высоте). И вот, если, например, сначала был выделен точкой какой-то дом, то после увеличения точка уже смещается с него, т.к. при увеличении дом смещается в сторону...

XProger я попробовал сделать так:

X = 100;                  // начальная точка
Width = 200;              // начальная ширина
NewWidth = Width + 10;    // новая ширина
X = X / (Width/NewWidth); // новое положение точки
                         // послеу величения ширины

Ничего не получается. Получается если сначала точка находилась,например, на доме, то после увеличения ширины (увеличение маштаба изображения) точка уже не входила на дом.


 
XProger ©   (2005-06-04 18:12) [9]

Ты ещё смещение самой карты не учитываешь ;)


 
Zer0 ©   (2005-06-04 18:31) [10]

Все что нужно - написать перевод из игровой системы координат в экранную, с учетом положения "камеры" и масштаба.
При этом картинку нужно будет определить двумя угловыми координатами, а точку одной.
Любое изменение масштаба камеры приведет к измеенению картинки нужным образом, при этом объекты останустя на своих местах в игровой СК.

screen_x = (obj_x - cam_x)*cam_scale+window_size_w/2;
screen_y = (obj_y - cam_y)*cam_scale+window_size_h/2;


 
Zer0 ©   (2005-06-04 18:35) [11]

картинки можно определить следующим образом:
верхний левый угол - (x,y); правый нижний угол (x,y)
точку:
центр (x,y)


 
.cpp   (2005-06-05 08:40) [12]

Zero0 можно пояснить что, где означает чтобы я попробовал...


 
П7   (2005-06-06 13:12) [13]

Блин, умеют же люди свои проблемы так театрально описывать... (:


 
XProger ©   (2005-06-06 14:38) [14]

П7, дык сипиписьник... ;)


 
Zer0 ©   (2005-06-06 20:03) [15]

хехе. данных вполне достаточно чтобы сделать все что ты хочешь.
если что-то не понятно говори - поможем. но делать за тебя и для тебя не будем.


 
keal   (2005-06-07 13:29) [16]

.cpp
X = X / (Width/NewWidth);

эта формула правильная, скорее у тебя ошибка при перерисовке.



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

Форум: "Игры";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.045 c
2-1126843465
Meine
2005-09-16 08:04
2005.10.16
DBGrid


3-1125569408
Маленький мук
2005-09-01 14:10
2005.10.16
Поле TIME в таблице PARADOX - как обратиться в запросе?


2-1127322112
quadronik
2005-09-21 21:01
2005.10.16
логотип при загрузке программы


14-1124894682
Marser
2005-08-24 18:44
2005.10.16
Опрос: Студенты и работа.


2-1126615595
календарь1
2005-09-13 16:46
2005.10.16
Вопрос по датам





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский