Topic G: S6 (botsende ballen)

Jaarvak op 7 studiepunten
Forumregels
Misschien werd je vraag al vorig jaar gesteld? Gebruik dus eerst de zoekoptie!

Er zijn formularia/samenvattingen aanwezig op de volgende link: viewtopic.php?f=19&t=93
Gebruikersavatar
ssneider
Heeft dit forum graag
Heeft dit forum graag
Berichten: 124
Lid geworden op: 01 nov 2008, 14:34
Locatie: Grimbergen
Contacteer:

Topic G: S6 (botsende ballen)

Berichtdoor ssneider » 21 feb 2009, 09:49

Hey iedereen, de meesten onder jullie herinneren deze oefn wel als een "pain in the ass" en ik heb er dan ook wat hulp bij nodig. Het is mij al gelukt om de ballen te laten botsen tegen de randen en om ze te laten botsen met elkaar, hetzij deze laatste niet echt volgens natuurlijke wijze(ze wisselen gewoon van vector en in tegengestelde zin). De code die ik tot dusver heb is:

Code: Selecteer alles

MODULE MS6;

    FROM IO IMPORT WrStr, WrLn;
    FROM RealMath IMPORT sqrt;
    FROM Lib IMPORT Delay; (* wacht n miliseconden *)
    FROM Graph IMPORT Init, Disc, _clrBLACK, _clrLIGHTCYAN;
    FROM Graph IMPORT SetUpdateMode, Update , _clrWHITE;
    FROM StandardLib IMPORT Arrow;


TYPE (* type *)
Variabelen = RECORD

             x,y,g,vx,vy: INTEGER;

END; (* TYPE *)

CONST (* constanten *)

 SCREEN_SIZE = 1138;
 SIZE= 10;
 DELAY_TIME = 50;

VAR  (* variabelen *)

     i,j,s,t: INTEGER;
     d: REAL;
     a : ARRAY[1..SIZE] OF Variabelen;



PROCEDURE Distance(c1,c2:Variabelen):REAL; (* PROCEDURE start *)

VAR d1,d2,afstand : REAL;
BEGIN

d1 := sqrt( VAL(REAL, (c1.x-c2.x)*(c1.x-c2.x) + (c1.y-c2.y)*(c1.y-c2.y)) ); (* afstandsformule (afstand tussen de middelpunten) *)
d2 := VAL(REAL, c1.g + c2.g); (* lengte van beide stralen*)

afstand := d1 - d2; (* beiden aftrekken (als afstand <= 0.0 dan botsen ze) *)

RETURN afstand; (* geef variabele terug *)
END Distance; (* PROCEDURE *)



BEGIN  (* MODULE start *)

WrLn;

  IF NOT Init(1, 1 , SCREEN_SIZE+7, 720+33) THEN  (* vensterinstellingen *)
         WrStr("Sorry, graphics doesn't work");
WrLn;

  RETURN;
  END; (*IF NOT*)

SetUpdateMode(FALSE); (* vlotter beeld *)


(* gegevens *)

a[1].x := 200;  a[1].y := 300; a[1].g := 10; a[1].vx := 5 ; a[1].vy := 4 ;
a[2].x := 123;  a[2].y := 456; a[2].g := 20; a[2].vx := 2 ; a[2].vy := -2;
a[3].x := 512;  a[3].y := 500; a[3].g := 30; a[3].vx := -3; a[3].vy := -1;
a[4].x := 123;  a[4].y := 50 ; a[4].g := 25; a[4].vx := 3 ; a[4].vy := 0 ;
a[5].x := 432;  a[5].y := 300; a[5].g := 15; a[5].vx := -3; a[5].vy := 1 ;
a[6].x := 234;  a[6].y := 670; a[6].g := 12; a[6].vx := 2 ; a[6].vy := -3;

(* gegevens *)


REPEAT (* REPEAT start *)

FOR i := 1 TO 6 DO (* verplaatsen van bollen *)
Disc(a[i].x,a[i].y,a[i].g,_clrWHITE);
Arrow(a[i].x,a[i].y,(a[i].x+a[i].vx*5),(a[i].y+a[i].vy*5),10,_clrLIGHTCYAN);
END; (* FOR*)

Update();  (* vlotter beeld *)
Delay(DELAY_TIME);  (* tijd tussen het tekenen in miliseconden *)

FOR i := 1 TO 6 DO
Disc(a[i].x,a[i].y,a[i].g,_clrBLACK);
Arrow(a[i].x,a[i].y,(a[i].x+a[i].vx*5),(a[i].y+a[i].vy*5),10,_clrBLACK);
END; (* FOR*)


FOR i := 1 TO 6 DO (* veranderen richtingsvector (indien nodig) *)

IF (a[i].x + a[i].g <= 70) OR (a[i].x + a[i].g >= SCREEN_SIZE - 20) (* botsing links-rechts *)

THEN
a[i].x := a[i].x - a[i].vx;   (* verander richtingsvector (x) *)
a[i].y := a[i].y + a[i].vy;
a[i].vx := -a[i].vx;

ELSIF  (a[i].y + a[i].g <= 70) OR (a[i].y + a[i].g >= 720 - 20)  (* botsing boven-onder *)

THEN
a[i].x := a[i].x + a[i].vx;   (* verander richtingsvector (y) *)
a[i].y := a[i].y - a[i].vy;
a[i].vy := -a[i].vy;

ELSE
a[i].x := a[i].x + a[i].vx;   (* laat zelfde richting *)
a[i].y := a[i].y + a[i].vy;

END; (* IF *)


 [help] FOR j:= 1 TO 6 DO
IF  i # j THEN (* de cirkel mag niet gelijk zijn aan zichzelf *)

d := Distance(a[i],a[j]); (* vul de variabelen in *)

IF d <= 0.0 THEN

s := a[i].vx; (* veranderen tijdens proces en waarden moeten bewaard blijven, bewaard in 's' en 't' *)
t := a[i].vy;
a[i].vx := a[j].vx;
a[i].vy := a[j].vy;
a[j].vx := s;
a[j].vy := t;

END; (* IF d <=0.0 *)
END; (* IF i # j *) 
END; (* FOR j *) [help]

a[i].x := a[i].vx + a[i].x;
a[i].y := a[i].vy + a[i].y;

END; (* FOR i *)


UNTIL 1 = 0; (* REPEAT *)

END MS6. (* MODULE *)


Tussen de [help]'s zit het probleem, men zegt dat we de procedures Distance (afstand), AngleWithXAx (om de hoeken te berekenen) en RotatePoint (om de snelheidsvector te draaien) moet gebruiken. Die distance is geen probleem, maar welke punten moet men invullen bij die AngleWithXAx en bij RotatePoint?
Laatst gewijzigd door ssneider op 25 feb 2009, 19:18, 2 keer totaal gewijzigd.
"If practice makes perfect, and nobody is perfect, why practice?"
Gebruikersavatar
ssneider
Heeft dit forum graag
Heeft dit forum graag
Berichten: 124
Lid geworden op: 01 nov 2008, 14:34
Locatie: Grimbergen
Contacteer:

Topic G: S6 (botsende ballen) -> aanvulling

Berichtdoor ssneider » 21 feb 2009, 10:05

PROCEDURE RotatePoint(VAR x, y:INTEGER; x0, y0: INTEGER; angle: REAL);
(* rotate point (x, y) around (x0, y0) with clockwise angle in radians *)
VAR x_:INTEGER;
BEGIN
x_ := VAL(INTEGER, VAL(REAL, x0) + (VAL(REAL, x) - VAL(REAL, x0)) * cos(angle) - (VAL(REAL, y)-VAL(REAL, y0)) * sin(angle));
y := VAL(INTEGER, VAL(REAL, y0) + (VAL(REAL, x) - VAL(REAL, x0)) * sin(angle) + (VAL(REAL, y)-VAL(REAL, y0)) * cos(angle));
x := x_;
END RotatePoint;


PROCEDURE AngleWithXAx(x0, y0, x1, y1: INTEGER):REAL;
VAR alfa: REAL;
BEGIN
IF x1 # x0 THEN
alfa := arctan((FLOAT(y1)-FLOAT(y0))/(FLOAT(x1)-FLOAT(x0)));
IF (x0 > x1) THEN
alfa := alfa + pi;
END;
ELSE
IF y1 > y0 THEN
alfa := pi/2.0;
ELSE
alfa := -pi/2.0;
END;
END;
RETURN alfa;
END AngleWithXAx;


Zelf had ik aan de hand van de tekening geprobeerd om de hoeken te berekenen (mss niet volledig) misschien dat iemand hier wat weet mee aan te vangen?(opgelet ze staan wel in REAL!):

PROCEDURE RotateVector (vx1,vy1,x1,y1,x2,y2:Variabelen):REAL;
VAR c,v,alpha,beta:REAL;
BEGIN

alpha := arccos(vx1.vx/sqrt((vx1.vx*vx1.vx)+(vy1.vy*vy1.vy)));
beta := arccos((x2.x-x1.x)/sqrt(((x2.x-x1.x)*(x2.x-x1.x))+((y2.y-y1.y)*(y2.y-y1.y))));
c := beta - alpha;
v := pi - 2.0*c;

RETURN v;
END RotateVector;


En het snijpunt heb ik als volgt berekend, misschien dat dit ook van pas komt (niet zeker of dit correct is):

t := ((a[i].g + a[j].g)*(a[i].g + a[j].g))/(((a[j].y - a[i].y)*(a[j].y - a[i].y)) + ((a[j].x - a[i].x)*(a[j].x - a[i].x)));
x0 := a[i].x+(a[j].x - a[i].x)*t;
y0 := a[i].y+(a[j].y - a[i].y)*t;

Ik heb me gek gezocht maar ik kan de oplossing precies niet vinden, help aub! [bs_lame.gif]
"If practice makes perfect, and nobody is perfect, why practice?"
Laurens
IRW-FAN!
IRW-FAN!
Berichten: 489
Lid geworden op: 30 sep 2008, 17:41
Locatie: Wemmel
Contacteer:

Re: Topic G: S6 (botsende ballen)

Berichtdoor Laurens » 23 feb 2009, 17:47

Ik weet niet wat de fout hierin is (ik heb het dan ook niet gelezen :D), maar volgens mij hadden we daar toch een oplossing van (waarin de ballen botsten tegen elkaar in 90°)?

Willem had dat toch gevonden, die had zelf allemaal procedures geschreven. Vraag het anders is aan hem.
Gebruikersavatar
ssneider
Heeft dit forum graag
Heeft dit forum graag
Berichten: 124
Lid geworden op: 01 nov 2008, 14:34
Locatie: Grimbergen
Contacteer:

Re: Topic G: S6 (botsende ballen)

Berichtdoor ssneider » 23 feb 2009, 18:12

Laurens schreef:Willem had dat toch gevonden, die had zelf allemaal procedures geschreven. Vraag het anders is aan hem.


De oplossing bovenaan IS de oplossing van Willem, hetzij zonder al die Wimdows toestanden, als Willem zin eeft mag em ze erbij zetten [bs_nostealinganything.gif]
"If practice makes perfect, and nobody is perfect, why practice?"
Laurens
IRW-FAN!
IRW-FAN!
Berichten: 489
Lid geworden op: 30 sep 2008, 17:41
Locatie: Wemmel
Contacteer:

Re: Topic G: S6 (botsende ballen)

Berichtdoor Laurens » 24 feb 2009, 21:30

Oei, oke dan... Hebben we daar in de les nooit een echte oplossing voor gezien?

Bij de opgave stond dat er een Library was, waarin een procedure zat waarmee ge een hoek kon bepalen, of zo iets...

Hebt ge al gevraagd aan de assistenten?
Gebruikersavatar
ssneider
Heeft dit forum graag
Heeft dit forum graag
Berichten: 124
Lid geworden op: 01 nov 2008, 14:34
Locatie: Grimbergen
Contacteer:

Re: Topic G: S6 (botsende ballen)

Berichtdoor ssneider » 25 feb 2009, 16:09

Laurens schreef:Bij de opgave stond dat er een Library was, waarin een procedure zat waarmee ge een hoek kon bepalen, of zo iets...
Hebt ge al gevraagd aan de assistenten?


Die procedures heb ik erbij geschreven (AngleWithXAx en RotatePoint), heb ik gwoon letterlijk gekopiëerd uit de StandardLib. Het probleem is dak ni weet welke punten ik moet invullen [bs_lame.gif]
"If practice makes perfect, and nobody is perfect, why practice?"
Laurens
IRW-FAN!
IRW-FAN!
Berichten: 489
Lid geworden op: 30 sep 2008, 17:41
Locatie: Wemmel
Contacteer:

Re: Topic G: S6 (botsende ballen)

Berichtdoor Laurens » 25 feb 2009, 17:09

Ja, ik herinner mij dat ik daar ook mee heb zitten prutsen. Staat er in de Library geen extra uitleg bij?

Volgens mij is die Rotate-function gebruiken de beste oplossing. Maar ik weet ook niet goed hoe die werkt.
Beerend
IRW-FAN!
IRW-FAN!
Berichten: 313
Lid geworden op: 30 sep 2008, 18:15
Locatie: Mechelen
Contacteer:

Re: Topic G: S6 (botsende ballen)

Berichtdoor Beerend » 25 feb 2009, 17:31

Tenzij je het echt nodig hebt voor je eigen programmeerproject zou ik er geen tijd in steken. Download die codes van Egon's site eens en kijk of je daar aan uit kan. Er staan minstens 1 goedwerkende hoor.
Gebruikersavatar
ssneider
Heeft dit forum graag
Heeft dit forum graag
Berichten: 124
Lid geworden op: 01 nov 2008, 14:34
Locatie: Grimbergen
Contacteer:

Re: Topic G: S6 (botsende ballen)

Berichtdoor ssneider » 25 feb 2009, 17:32

Beerend schreef:Tenzij je het echt nodig hebt voor je eigen programmeerproject zou ik er geen tijd in steken. Download die codes van Egon's site eens en kijk of je daar aan uit kan. Er staan minstens 1 goedwerkende hoor.


Kzal is checken, want we zijn daar een poolspel aant programmere (wegens luiheid geen ander concept bedacht :P ) mercikes [bs_comehereyou.gif]
"If practice makes perfect, and nobody is perfect, why practice?"
Beerend
IRW-FAN!
IRW-FAN!
Berichten: 313
Lid geworden op: 30 sep 2008, 18:15
Locatie: Mechelen
Contacteer:

Re: Topic G: S6 (botsende ballen)

Berichtdoor Beerend » 25 feb 2009, 17:57

ssneider schreef:
Beerend schreef:Tenzij je het echt nodig hebt voor je eigen programmeerproject zou ik er geen tijd in steken. Download die codes van Egon's site eens en kijk of je daar aan uit kan. Er staan minstens 1 goedwerkende hoor.


Kzal is checken, want we zijn daar een poolspel aant programmere (wegens luiheid geen ander concept bedacht :P ) mercikes [bs_comehereyou.gif]


Er is al eens een poolspel gemaakt en aangezien al die codes beschikbaar zijn, kan je dus hun code bestuderen als je vast zit. Wel eerlijk zijn als je dingen exact overneemt, dat zien ze toch en als het er niet bij staat dat je bepaalde dingen niet zelf hebt gemaakt wordt dat als plagiaat gezien ;)

Terug naar “Informatica”

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 1 gast

cron