Форум: "Игры";
Текущий архив: 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