webForumDet fria alternativet

Matte

29 svar · 801 visningar · startad av Alpha II · sida 2 av 2

PeWMedlem sedan juni 200010 432 inlägg
#21

"Accessviolation" betyder troligen att du skriver på minne som du inte får skriva på.

Alpha IIMedlem sedan maj 20002 993 inlägg
#22

Jag vet. det konstiga är att jag får det på raden då jag skapar ett objekt!

PeWMedlem sedan juni 200010 432 inlägg
#23

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.

Alpha IIMedlem sedan maj 20002 993 inlägg
#24

Kom på felet.
Hade skrivit lite fel på ett ställe och skapade en class på fel sätt.

PeWMedlem sedan juni 200010 432 inlägg
#25

Bra att det löste sig :)

Alpha IIMedlem sedan maj 20002 993 inlägg
#26

http://home.tnv.mh.se/per-edstrom/interaktiv_matematik/2d/vinkel_mellan_vektorer.gif

Vad är det lilla tecknet mellan |u| och |v|

hypatiaMedlem sedan feb. 20016 388 inlägg
#27

Det är ett vanligt multiplikationstecken.

Alpha IIMedlem sedan maj 20002 993 inlägg
#28

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".

Sang-draxMedlem sedan juli 2002581 inlägg
#29

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.

Alpha IIMedlem sedan maj 20002 993 inlägg
#30

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;
132 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)