"Accessviolation" betyder troligen att du skriver på minne som du inte får skriva på.
Matte
29 svar · 801 visningar · startad av Alpha II · sida 2 av 2
Jag vet. det konstiga är att jag får det på raden då jag skapar ett objekt!
Men det är ju då du skriver på minnet ;)
Vet inte vilket språk du talar om, men i exempelvis C och C++ kan du låta en pekare peka på vad som helst (även minnesplatser som är förbjudna) utan att få ett felmeddelande. Men sen när man försöker accessa minnet blir det då fel, om pekandet är på otillåten plats, vilket i sig är bra då man antagligen missat nåt i koden. Det är vid såna fel man använder kompisen debuggern.
Kom på felet.
Hade skrivit lite fel på ett ställe och skapade en class på fel sätt.
Bra att det löste sig :)
http://home.tnv.mh.se/per-edstrom/interaktiv_matematik/2d/vinkel_mellan_vektorer.gif
Vad är det lilla tecknet mellan |u| och |v|
Det är ett vanligt multiplikationstecken.
Jag försöker räkna ut vinkeln mellan 2 vektorer enligt http://home.tnv.mh.se/per-edstrom/interaktiv_matematik/2d/vinkel_mellan_vektorer.html
koden:
g := arccos(dot(ss.v,n)/(Magnitude(ss.v)*Magnitude(n)));
ss.v är en rörelse vektor och n är.. humm en annan vektor :)
Problemet är att jag får EInvalidOp "Invalid floating operation".
Men det verkar rätt, vinklar beräknas på följande sätt:
u = (1,2,5)
v = (4,1,5)
vinkel = arccos( (u*v) / (|u|*|v|) )
print "Vinkeln är" + vinkel
Kontrollera att ingen vinkel == 0.
Så här ser hela koden ut, den kontrollerar om rymdskeppet (ss) träffar en asteroid och isf vilken ny riktining den får. Har iof en färdig kode för detta som inte fungera så här alls, men det är roligare att göra något själv, dock fungerar det ju inte :(
TAsteroid = record
dead: boolean;
x: integer;
y: integer;
r: integer;
end;
TSpaceshuttle = record
x: double; // x pos
y: double; // y pos
r: integer; // radie
a: integer; // angle (spaceship rotation)
v: Tvector2; // vellocity
m: double; // mass
end;
procedure Move();
var
i :integer;
collision:boolean;
dXSqr: double;
dySqr: double;
RadiiSqr: double;
q:double;
N: TVector2;
g: double;
u: double;
begin
for I := 0 to 9 do
begin
dXSqr := sqr(Asteroid[i].x-ss.x);
dYSqr := sqr(Asteroid[i].y-ss.y);
RadiiSqr := sqr(Asteroid[i].r+ss.r);
// Collision!
if (dXSqr+dYSqr < RadiiSqr) then
begin
q := arctan((ss.x-Asteroid[i].x)/(ss.y-Asteroid[i].y)); // vinkeln normalen ska peka åt
n.x := cos(i); // i x kordinater
n.y := sin(i); // i y kordinater
g := arccos(dot(ss.v,n)/(Magnitude(ss.v)*Magnitude(n))); // få vinkeln mellan normalen och rörelse vektorn
// FÅR FEL HÄR
u := q-g; // den nya vinkeln i grader eller radianre... vi får se...
ss.v.x := cos(u);
ss.v.y := sin(u);
end;
end;
// max speed = 25
if magnitude(ss.v) > 25 then
begin
ss.v := Normalize(ss.v);
ss.v.x := ss.v.X * 25;
ss.v.y := ss.v.y * 25;
end;
// slow down...
ss.v.x := ss.v.x * 0.99;
ss.v.y := ss.v.y * 0.99;
// move it!
ss.x := ss.x + ss.v.x;
ss.y := ss.y + ss.v.y;
end;