unit balistica;
{H+}
interface
uses grafica;
type traiettoria=object
private
angolo,velocita:double;
vettoreVelocita:pointf;
procedure setVelocita(v0:double);
function getVelocita:double;
procedure setAngolo(alfa:double);
function getAngolo:double;
public
constructor crea;
function tempoVolo:double;
function gittata:double;
function altezzaMassima:double;
procedure calcolo(out posizione:pointf; tempo:double);
property celere:double read getVelocita write setVelocita;
property alzata:double read getAngolo write setAngolo;
end;
implementation
constructor traiettoria.crea;
begin
angolo:=0;
velocita:=0;
vettoreVelocita.x:=0.0;
vettoreVelocita.y:=0.0;
end;
function traiettoria.tempoVolo:double;
begin
tempoVolo:=2.0 * vettoreVelocita.y / 9.80665;
end;
function traiettoria.gittata:double;
begin
gittata:=vettoreVelocita.x * tempoVolo;
end;
function traiettoria.altezzaMassima:double;
var vertice:pointf;
begin
calcolo(vertice, tempoVolo / 2.0);
altezzaMassima:=vertice.y;
end;
procedure traiettoria.calcolo(out posizione:pointf; tempo:double);
begin
posizione.x:=vettoreVelocita.x * tempo;
posizione.y:=vettoreVelocita.y * tempo - 4.9033 * tempo * tempo;
end;
procedure traiettoria.setVelocita(v0:double);
begin
velocita:=abs(v0);
vettoreVelocita.x:=velocita * cos(angolo);
vettoreVelocita.y:=velocita * sin(angolo);
end;
function traiettoria.getVelocita:double;
begin
getVelocita:=velocita;
end;
procedure traiettoria.setAngolo(alfa:double);
begin
angolo:=abs((PI / 180.0) * alfa);
vettoreVelocita.x:=velocita * cos(angolo);
vettoreVelocita.y:=velocita * sin(angolo);
end;
function traiettoria.getAngolo:double;
begin
getAngolo:=(180.0 / PI) * angolo;
end;
end.