Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работать с векторами? [Delphi, Windows]


Norlin ©   (2003-08-17 19:43:00) 

Подскажите, плз, как работать с векторами в Дельфи?


NailMan   (2003-08-20 09:52:00) [1]

To -> Micah"GF
Это шаг интерполяции. В принципе это можно понимать как dS или скорость учитывая что dS объект проходит за известное дискретное время.


Micah'GF   (2003-08-20 09:32:00) [2]

2NailMan
s это скорость ?

Вообщето конечная цель даже сложнее.. вот картинка (не поленитесь посмотреть.. всего 8кб) http://200mb.org/coding/path.gif

Черным показан путь, который образован вейпоинтами - красные точки.
Большим красным кругом обозначена цель, серая линия - путь ее движения, который нужно смоделировать (как видишь он должен получиться плавнее). Точка показаная стрелкой должна перемещаться равномерно во времени, но с изменяемой скоростью..


NailMan   (2003-08-19 16:44:00) [3]

Насколько я понял - у тебя есть набор вейпонтов, и тебе хоцца получить промежуточные значения в пространстве для более гладкого движения. Это можно сделать с помощью линейной интерполяции.

Вот эта функция из Direc3D
// Linear interpolation. V1 + s(V2-V1)
function D3DXVec3Lerp(out vOut : TD3DVector3; const v1, v2 : TD3DXVector; const s : Single) : TD3DXVector3;
begin
with vOut do
begin
x := v1.x + s * (v2.x - v1.x);
y := v1.y + s * (v2.y - v1.y);
z := v1.z + s * (v2.z - v1.z);
end;
Result:= vOut;
end;


ооо   (2003-08-19 15:52:00) [4]

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


Дмитрий В. Белькевич   (2003-08-19 01:42:00) [5]

>прокладываются вектора...
>Теперь нужно смоделировать движение точки по этому пути... >Может у кого уже есть готовые решения?!?!?!

Тебе нужно посчитать все точки между векторами или что? Ну так ищи рассчет положения точек на линии. В чем проблема-то?


Micah'GF   (2003-08-18 21:52:00) [6]

эээээ... у меня не совсем хорошо с геометрией+физикой :]
можно поподробнее как в коде реализовать?!?!?
а массив точек у меня потому что путь должен быть ужасно кривой...
(мысль: надо бы какнить на картинке изобразить что хочу сделать) :]


ооооооооооооооооооооо   (2003-08-18 18:43:00) [7]

что значит " прокладываются вектора"?? на уроках физики спали чтоль?

помни что координата обьекта через промежуток времени dt будет равна

в векторах одно, двух, трехмерных...

X(ч-з dt) = X(сейчас) + V(скорость сейчас)*dt
вот затем и сложение и умножение векотров на число!
если V изменяется со временем, то и для него пишем

V(ч-з dt) =V(сейчас) + A(ускорение сейчас)*dt
если и ускорение изменяется то тоже самое пишем и для него.

и все! никаких массивов!


Micah'GF   (2003-08-18 16:40:00) [8]

ээээээээ.... интересная тема, но несовсем понятно для чего сложение, вычитаение, ... IMHO это не самое важное..

Появилась надобность смоделировать путь в двухмерном пространстве... вот начал работать с векторами. Путь представляю как массив координат точек, между которыми прокладываются вектора...
Теперь нужно смоделировать движение точки по этому пути... Может у кого уже есть готовые решения?!?!?!


VitGun   (2003-08-17 20:38:00) [9]

type
TVector=record
x,y:real;
end;

function AddVector(Vector1, Vector2: TVector): TVector; //Сложение векторов
function SubVector(Vector1, Vector2: TVector): TVector;//вычитание векторов
function MultVector(Vector: TVector; Num: GLfloat): TVector;//умножение векторов
function NormalizeVector(Normal: TVector): TVector;//деление? векторов

function AddVector(Vector1, Vector2: TVector): TVector;
begin
Result.X := Vector1.X + Vector2.X;
Result.Y := Vector1.Y + Vector2.Y;
end;

function SubVector(Vector1, Vector2: TVector): TVector;
begin
Result.X := Vector1.X - Vector2.X;
Result.Y := Vector1.Y - Vector2.Y;
end;

function MultVector(Vector: TVector; Num: GLfloat): TVector;
begin
Result.X := Vector.X * Num;
Result.Y := Vector.Y * Num;
end;
function NormalizeVector(Normal: TVector): TVector;
var Magnitude: GLfloat;
begin
Result.X := Normal.X / Magnitude;
Result.Y := Normal.Y / Magnitude;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо