![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как работать с векторами? [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;