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

Вниз

Нахождение высоты в заданной точке   Найти похожие ветки 

 
Ricks ©   (2005-09-13 23:59) [0]

У меня вот такая проблема:
Пусть функция f(x, z) задает высоту поверхности в узловых точкач (те x и z - целые, от 1 до n). Задача состоит в определении высоты поверхности в ЛЮБОЙ точке (те например т.M(X:0.76; Z:0.789) )
Помогите!


 
Кефир87 ©   (2005-09-14 00:17) [1]

Вот попробуй разберись. 8) Узлы у меня в матрице height[0..n1, 0..n2]... Вместо y можно указать z...
function TLand.GetHeight(x,y:GLfloat):GLfloat;
 function Lerp( a, b, t: Single ): Single;
 begin
   Result := ( 1 - t ) * a + t * b;
 end;

var
 sx,sy:GLfloat;
 tx,tz:GLfloat;
 ya, yb,y0,y1,y2,y3:GLfloat;
 x0,x1,x2,x3, z0,z1,z2,z3:integer;
begin
 if(x>0)and(y>0)and(x<info.mWidth)and(y<info.mHeight)then
 begin
   x0 := trunc(x);
   x1 := trunc(x)+1;
   x2 := x0;
   x3 := x1;

   z0 := trunc(y);
   z1 := z0;
   z2 := trunc(y)+1;
   z3 := z2;

   y0 := heihts[trunc(x), trunc(y)];
   y1 := heihts[trunc(x)+1, trunc(y)];
   y2 := heihts[trunc(x), trunc(y)+1];
   y3 := heihts[trunc(x)+1, trunc(y)+1];

   tx := ( x - x0 ) / ( x1 - x0 );
   ya := Lerp( y0, y1, tx );
   yb := Lerp( y2, y3, tx );

   tz := ( y - z0 ) / ( z2 - z0 );
   Result := Lerp( ya, yb, tz );

   {glMatrixMode(GL_MODELVIEW);
   glPushMatrix;
   glLoadIdentity;
   glBegin(GL_POINT_BIT);
     glvertex3f(trunc(x)*cell_width,              heihts[trunc(x),trunc(y)]+0.01,     trunc(y)*cell_width);
     glvertex3f(trunc(x)*cell_width + cell_width, heihts[trunc(x)+1,trunc(y)]+0.01,   trunc(y)*cell_width);
     glVertex3f(trunc(x)*cell_width + cell_width, heihts[trunc(x)+1,trunc(y)+1]+0.01, trunc(y)*cell_width+cell_width);
     glVertex3f(trunc(x)*cell_width,              heihts[trunc(x),trunc(y)+1]+0.01,   trunc(y)*cell_width+cell_width);
   glEnd;

   glBegin(GL_LINES);
     glVertex3f(x-cell_width/2, 0.01, y);
     glVertex3f(x+cell_width/2, 0.01, y);

     glVertex3f(x, Result+0.01, y-cell_width/2);
     glVertex3f(x, Result+0.01, y+cell_width/2);
   glEnd;

   glPopMatrix;    }
 end else Result := 0.0;
end;


 
Ricks ©   (2005-09-14 01:11) [2]

Спасибо, буду разбираться!


 
Кефир87 ©   (2005-09-14 01:54) [3]

Вообще эту функцию мне в свое время помогли создать в этой ветке. Поищи тему "Простейшая линейная интерполяция" 8)


 
Ricks ©   (2005-09-14 02:17) [4]

Спасибо огромное! Помогло!!
Только теперь возникла еще одна проблемма: наклон объекта (по x и z). Как получить соответствующие углы наклона. Я попытался, но у меня что-то не очень получилось. Вот код:


function TBasicUnit.ForwardPos;
begin
Result:=Vector( Center.X + cosex( angle.Y ) * MoveSpeed, 0, Center.Z - sinex( angle.Y ) * MoveSpeed );
Result.Y:=GetAHeight( Result.X, Result.Z )
end;

function TBasicUnit.SidePos;
begin
Result:=CrossVector( Vector( Center.X + cosex( angle.Y ) * MoveSpeed, 0, Center.Z - sinex( angle.Y ) * MoveSpeed ), Vector(0, 1, 0));
Result.Y:=GetAHeight( Result.X, Result.Z );
end;

// вот здесь!
procedure TBasicUnit.UpdateHeight;
var f : TVector;
begin
Center.Y:=GetAHeight( Center.X, Center.Z );
f:=ForwardPos; angle.z:=(f.y - center.y) / DistancePoints(f, center) * 180 / pi;
f:=SidePos;    angle.x:=(f.y - center.y) / DistancePoints(f, center) * 180 / pi;
end;


 
A22 ©   (2005-09-19 16:08) [5]

tg(alpha) = b/a, где a - длина противолежащего катета, b - прилежащего
в чем проблема-то? :)


 
XProger ©   (2005-09-19 16:34) [6]

XTropper (http://XProger.mirgames.ru)
Высчитываются углы наклона пауков и пушек на поверхности ландшафта


 
A22 ©   (2005-09-19 17:36) [7]

2 Ricks
наоборот катеты, очепятался, сорри
а XTropper принципиально не смотри - заколебал! :)


 
Ricks ©   (2005-09-19 22:53) [8]

> A22
tg(alpha) = b/a
что такое alpha???
Мне нужны 2 угла (по x и z)

> XProger
сайт, не спорю, хороший, но где там искать я не знаю...


 
XProger ©   (2005-09-20 01:17) [9]

Ricks, в разделе скачать видимо...


 
A22 ©   (2005-09-20 12:13) [10]

Ricks, alpha - угол. Тебе нужно два угла - относителньо оси X и Z? тогда придется считать 2 отношения:
delta_y/delta_x, и delta_y/delta_z

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


 
NE_Parovoz ©   (2005-09-20 16:11) [11]

Ricks, нужны именно углы?, может сразу матрицу находить, из нормали
а XTropper, всетаки посмотри(если необязательно углы);



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

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

Наверх




Память: 0.49 MB
Время: 0.043 c
2-1142950392
irishka001
2006-03-21 17:13
2006.04.02
Список файлов в архиве


15-1141827843
Новичоккк
2006-03-08 17:24
2006.04.02
Можно как-нибудь это скачать?


9-1127639612
D@rk
2005-09-25 13:13
2006.04.02
Directdraw help


4-1137190625
ma5ter
2006-01-14 01:17
2006.04.02
Создание Bitmap


15-1141920731
Nic
2006-03-09 19:12
2006.04.02
Окно ввода логина и пароля