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

Вниз

Замучался с углами - sin256 и просто sin....   Найти похожие ветки 

 
greenrul   (2002-10-04 13:59) [0]

Есть угол player1.ugol и объект snarad, который должен вылететь под углом player1.ugol и лететь под действием силы тяжести. Пишу в snarad.DoMove:
1 версия:
angle:=Round(ArcTan2(sin(ugol/(180/pi))+(time/5),cos(ugol/(180/pi)))*180/pi);
y:=Player1.Y+20*sin(ugol/(180/pi))*(time/5) + (((time*time)/25)/2);
x:=Player1.x+20*cos(ugol/(180/pi))*(time/5);

как я понял, просто sin/cos выдает значение в радианах, значит нужно разделить на 180/pi. Но потом нашел один пример: y:=y+sin256(Angle)*speed; почитал хелп про sin256/cos256 и скачал модифицированный DxSprite.pas. Попробовал записать так:
2 версия:
angle:=Round(ArcTan2(sin256(ugol)+time/5,cos256(ugol))*180/pi);
y:=Player1.Y+20*sin256(ugol)*(time/5) + (((time*time)/25)/2);
x:=Player1.x+20*cos256(ugol)*(time/5);


В первом случае снаряд летит с почти постоянным angle=80-90, хотя выглядит на 60-70...

Как высчитать правильный угол снаряда?
Где я ошибку допустил? time/5 - это время, просто если без деления то снаряд слишком быстро летит.


 
k   (2002-10-04 15:35) [1]

>>как я понял, просто sin/cos выдает значение в радианах
да ну! син/кос возвращают значения как и положено нормальному син и кос от -1 до 1 без размерности.
и ч-то не пойму зачем так
sin(ugol/(180/pi))+(time/5)- это здесь зачем?

чего ты не хочешь по стандартному?

то есть
var x,y,//текущие координаты
vx,vy:double;//компонента скорости
ay :double;//uskorebie svob padeniya
при броске

задать x,y, ay<0;
v - начальная скорость
vx := v*sin(ugol/(180/pi));
vy := v*cos(ugol/(180/pi));


обработка DoMove

vy := vy + ay;
x := x + vx;
y := y + vy;



 
greenrul   (2002-10-04 16:19) [2]

что-то я не понял....
DoMove-
if (isButton1 in MainForm.DXInput1.States) and not(visible) then
begin
Visible:=true;
vx := 5*sin(Player1.ugol/(180/pi));
x:=Player1.X;
y:=Player1.y;
vy := 5*cos(Player1.ugol/(180/pi));
end;
if Visible=true then
begin
vy := vy + 0.00005*y;
x := x + vx;
y := y - vy;
end;


снаряд взлетает ПРЯМО вверх и падает тудаже...

вы наверное чего-то напутали....


Снаряд бросают с земли ПОД УГЛОМ...


 
k   (2002-10-04 16:26) [3]

ну да напутал. cos i sin поменяй местами...

и еще
if Visible=true then
begin
vy := vy + 0.00005* ay{ускорение};
x := x + vx;
y := y - vy;
end;


а так снаряд взлетает? падает? с силой тяжести разобрались.
проверь угол и нач условия. все должно работать (скорее всего:))



 
greenrul   (2002-10-04 16:47) [4]

я обнаружил веселую фигню: угол в TImageSpriteEx считается НЕПРАВИЛЬНО - считайте сами, при угле в 0 он параллелен оХ, а при 180 чуть ли не диагонален, так что все мои беды от него....

Чем это лечится?


 
greenrul   (2002-10-04 16:50) [5]

опять муть - он летит совсем не в ту сторону....
короче лучше оставить мое уравнение движения. Путь оно и тупое, но рабочее. А вот что делать с разворотом снаряда?????


 
cyborg   (2002-10-05 11:25) [6]

Дело в том, что градусов в sin256 не 360, а 256, т.е. что будет 180 градусов, то в программе должно быть 128.


 
хм   (2002-10-05 22:09) [7]

>я обнаружил веселую фигню: угол в TImageSpriteEx считается >НЕПРАВИЛЬНО - считайте сами, при угле в 0 он параллелен оХ, а >при 180 чуть ли не диагонален, так что все мои беды от него....
>Чем это лечится?

дело в том, что в делфих в окружности 256 градусов, а не 180 "как везде". Поэтому и переводить sin и cos надо не с помощью sin(ugol/(180/pi)), а c помощью sin(ugol/( 256/pi)); ну или просто использовать sin256


 
greenrul   (2002-10-06 12:34) [8]

Ну хорошо, а почему тогда все равно угол кривой?
1:angle:=Round(RadToDeg(ArcTan2(cos(Player1.ugol/(256/pi)),sin(Player1.ugol/(256/pi))+(time/6))));
2:angle:=Round(RadToDeg(ArcTan2(sin(Player1.ugol/(256/pi))+(time/6)бcos(Player1.ugol/(256/pi)))));


 
Mirovodin   (2002-10-06 13:11) [9]

Не нужно использовать ни какие sin256 и т.д. если нужно, постройте таблицу cos[0..359]. А потом получайте значение cos или sin по элементу в массиве. Такой способ быстрее всего. Delphi дает значения sin и cos в радианах!

Перевод :
a(град)=(a(рад)*180)/PI и соответственно:

a(рад)=(PI*a(град))/180

вот и всё.


 
greenrul   (2002-10-07 15:43) [10]

Это-то тоже можно, но ведь по идее
Snarad.angle:=Round(RadToDeg(ArcTan2(cos(Player1.ugol/(256/pi)),sin(Player1.ugol/(256/pi))+(time/6))));

ДОЛЖЕН работать... но не работает


 
MBo   (2002-10-07 18:19) [11]

набросок, боеголовка смотрит по вектору скорости ;)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, ExtCtrls,math;

type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
Button1: TButton;
Timer1: TTimer; //100
SpinEdit1: TSpinEdit; //45
SpinEdit2: TSpinEdit; //60
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure DrawS;
private
{ Private declarations }
public
{ Public declarations }
end;

const
g=10;
var
Form1: TForm1;
an0:double;
v0:integer;
t:integer;
x,y:integer;
vx,vy,vy0,angle:double;
coeff:double=0.1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
t:=0;
doublebuffered:=true;
an0:=DegToRad(spinedit1.Value);
v0:=spinedit2.Value;
timer1.enabled:=true;
vx:=v0*cos(an0);
vy0:=v0*sin(an0);
paintbox1.canvas.Pen.mode:=pmXor;
paintbox1.canvas.Pen.color:=clAqua;
end;

procedure TForm1.DrawS;
var
y0:integer;
begin
y0:=paintbox1.height-y-1;
with paintbox1.canvas do begin
moveto(x,y0);
lineto(round(x+15*cos(pi+0.3-angle)),round(y0+15*sin(pi+0.3-angle)));
lineto(round(x+15*cos(pi-0.3-angle)),round(y0+15*sin(pi-0.3-angle)));
lineto(x,y0);
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if t=0 then
PaintBox1.Canvas.FillRect(paintbox1.clientrect)
else
DrawS;
inc(t);
vy:=vy0-g*t*coeff;
x:=trunc(vx*t*coeff);
y:=trunc(vy0*t*coeff-g*sqr(t*coeff)/2);
if y<0 then begin
timer1.enabled:=false;
exit;
end;
angle:=arctan2(vy,vx);
DrawS;
end;



 
greenrul   (2002-10-07 20:58) [12]

Спасибо, конечно что расписал, но проблема в другом - почему снаряд вертится, когда летит:
Snarad.angle:=Round(RadToDeg(ArcTan2(snarad_speed*sin256(Player1.ugol) + g*time/speed,snarad_speed*cos256(Player1.ugol))));

Нужно чтоб угол его был по касательной к траектории...

может дело в отрицательном угле/тангенсе?


 
MBo   (2002-10-07 21:20) [13]

>Нужно чтоб угол его был по касательной к траектории
Именно так я и сделал


 
greenrul   (2002-10-08 17:18) [14]

Так у меня то же самое написано почти, а снаряд через одно место летит =(


 
greenrul   (2002-10-08 17:43) [15]

НАШЕЛ ОТВЕТ!!! ВОТ ЭТО - СЧАСТЬЕ!


t:=Round(RadToDeg(ArcTan2(snarad_speed*sin(DegToRad(Player1.ugol)) + g*time/speed,snarad_speed*cos(DegToRad(Player1.ugol)))));
Snarad.angle:=Round((256*t)/360);



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

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

Наверх





Память: 0.48 MB
Время: 0.011 c
7-17419
boolean
2003-01-08 10:31
2003.03.06
Мастера, подскажите


14-17306
Tornado
2003-02-17 10:58
2003.03.06
Сколько места занимает Windows ?


8-17199
BlackSun
2002-11-22 21:45
2003.03.06
Помогите насчет DirectX


14-17348
Zn
2003-02-17 17:52
2003.03.06
Ошибка при обработке TStringList.


14-17391
iusup
2003-02-19 01:33
2003.03.06
Нужна прога руссификации InstallShield Express





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