Een prakties voorbeeld van deze formule

Wiskunde is niet alleen een vak op school. Kom je ergens in de praktijk (bijvoorbeeld tijdens je werk) een wiskundig probleem tegen dan kun je hier om hulp vragen.
Plaats reactie
heli
Nieuw lid
Nieuw lid
Berichten: 5
Lid geworden op: 04 mar 2022, 20:09

Een prakties voorbeeld van deze formule

Bericht door heli » 04 mar 2022, 22:09

Hallo, ik wil graag het snijpunt van 2 lijnen berekenen.
Ik zat even te zoeken en ik kwam uit bij iets wat ik graag wil hebben, alleen begrijp ik dit niet :

https://www.slimleren.nl/onderwerpen/wi ... D2%2C%2D6).

Ik begrijp niet hoe ze dat schrijven, mijn lijnen hebben 2 coordinaten ( het begin X en Y , het eind X en Y )
Zou iemand mij kunnen uitleggen hoe ik deze formule gebruik met coordinaten ( 2D vectors ) ?
Ik programmeer een game in C++, dat wiskunde schrift begrijp ik niet, wel code.

b.v.d.

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Een prakties voorbeeld van deze formule

Bericht door arie » 05 mar 2022, 00:33

Hieronder in code-vorm.
Je eerste lijn = lijn L heeft beginpunt A en eindpunt B
Die schrijven we eerst in de vorm y = a*x + b zoals in je web-link
Je tweede lijn = lijn M heeft beginpunt C en eindpunt D
Die schrijven we in de vorm y = c*x + d
Tenslotte berekenen we punt S = het snijpunt van L en M.

In dit voorbeeld is A=(1, 2), B=(13, 8 ), C=(2, 6) en D=(11, 0).
Hierdoor wordt:
lijn L: y = 0.5*x + 1.5
lijn M: y = -0.6666*x + 7.3333
en is het snijpunt S=(5, 4);

Probleemgevallen als de noemers van de breuken nul worden:
Bx = Ax: lijn L loopt verticaal
Dx = Cx: lijn M loop verticaal
a = c: lijn L en M lopen parallel of overlappen
Wil je deze problemen ook aanpakken, dan moeten we onderstaande code nog wat uitbreiden.

Kom je hiermee verder?

Code: Selecteer alles

{
// definieer de punten A en B:
double Ax=1;
double Ay=2;
double Bx=13;
double By=8;

// bepaal de lijn L door A en B:
// y = a*x + b
double a=(By-Ay)/(Bx-Ax);  // 0.5000
double b=Ay-a*Ax;          // 1.5000

// definieer de punten C en D:
double Cx=2;
double Cy=6;
double Dx=11;
double Dy=0;

// bepaal de lijn M door C en D:
// y = c*x + d
double c=(Dy-Cy)/(Dx-Cx);  // -0.6666...
double d=Cy-c*Cx;          //  7.3333...

// bereken het snijpunt S van de 2 lijnen:
double Sx = (d-b)/(a-c);   // 5.0000
double Sy = a*Sx + b;      // 4.0000
}

heli
Nieuw lid
Nieuw lid
Berichten: 5
Lid geworden op: 04 mar 2022, 20:09

Re: Een prakties voorbeeld van deze formule

Bericht door heli » 05 mar 2022, 13:01

Hallo Arie, bedankt voor de reactie.

Ik zag verder niets in dat algoritme op die website waar delen door stond.
Tog zag ik in jouw code zag ik delen door staan ?, is dat alleen voor de rechte lijnen ?

Ja de rechte lijnen word nog een probleem voor later, eerst wil ik deze oplossen om daarna te kijken hoe ik er goedkoop een pleister op kan plakken, zonder delen door ( delen door kost te veel instructie-cycles en gebruik ik het liefst niet )
En dan komt er nog een probleem : de lijnen zijn dik ook nog, eerst maar eens het snijpunt vinden.

Ok dit gaat mij te snel en snap ik niet :
In dit voorbeeld is A=(1, 2), B=(13, 8 ), C=(2, 6) en D=(11, 0).
Hierdoor wordt:
lijn L: y = 0.5*x + 1.5
lijn M: y = -0.6666*x + 7.3333
en is het snijpunt S=(5, 4);

Wat moet ik presies doen met de waardes van de lijnen om dit te krijgen ?
En wat is de waarde X ?

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Een prakties voorbeeld van deze formule

Bericht door arie » 05 mar 2022, 15:32

De algemene vergelijking van een lijn in 2D is:
y = a*x + b
waarbij constanten a en b gegeven zijn.

In het voorbeeld van jouw site (Slimleren) hebben ze:
rode lijn A: y = 4*x + 2
blauwe lijn B: y = 2*x + 3

In het snijpunt van deze 2 lijnen moeten de y-coordinaten van deze 2 lijnen gelijk zijn, dus moet gelden:
4*x + 2 = 2*x + 3
breng de termen met x naar links, de termen zonder x naar rechts:
4*x - 2*x = 3 - 2
(4-2)*x = (3-2)
x = (3-2)/(4-2) = 1 / 2 = 0.5
Dit is de laatste deling in mijn code, die door Slimleren ietwat verborgen is.

Ik volg de algemene formule voor het snijpunt van 2 lijnen y=a*x+b en y=c*x+d:
a*x + b = c*x + d
a*x - c*x = d - b
(a-c)*x = (d-b)
x = (d-b)/(a-c)
Noot: de waarden van a t/m d moeten bekend zijn (ofwel gegeven, ofwel berekend).

In stap 2 van Slimleren bepalen ze de y-coordinaat van het snijpunt:
Als x=0.5 en y=4*x+2, dan is
y = 4*0.5 + 2 = 2 + 2 = 4
Dus snijpunt S = (0,5; 4)


De eerste 2 delingen in mijn code zijn het gevolg van het feit dat jij niet uitgaat van de vergelijking van de lijnen, maar deze nog moet berekenen vanuit de gegeven begin- en eindpunten.

Afbeelding

Hierboven het plaatje van Slimleren, maar nu
- is de rode lijn gegeven door beginpunt A=(-1; -2) en eindpunt B = (1; 6)
- is de blauwe lijn gegeven door beginpunt C=(-3; -3) en eindpunt D = (2; 7)

Als we voor de rode lijn vanuit begin- en eindpunt (punt A resp. B) de lijnvergelijking y = a*x + b willen bepalen,
dan is a de richtingscoefficient van de lijn = (verandering in y) / (verandering in x) = (By-Ay)/(Bx-Ax).
In dit voorbeeld levert dit:
a = (6 - (-2)) / (1 - (-1)) = 8 / 2 = 4
We weten nu dus al: y = 4*x + b

Omdat punt A = (Ax; Ay) op de lijn ligt, kunnen we dit invullen:
Ay = a*Ax + b
dus
b = Ay - a*Ax
waarbij we Ay, a en Ax kennen.
In dit voorbeeld:
b = -2 - 4*(-1) = -2+4 = 2

De vergelijking van de rode lijn wordt dus
y = 4*x + 2
en dit komt overeen met de getallen van Slimleren.

Evenzo voor de blauwe lijn.

heli
Nieuw lid
Nieuw lid
Berichten: 5
Lid geworden op: 04 mar 2022, 20:09

Re: Een prakties voorbeeld van deze formule

Bericht door heli » 05 mar 2022, 16:52

Bedankt Arie, dat is presies wat ik wil ontcijferen.

Om alles even op een rijtje te krijgen, er word gepraat over x en y wat ik niet snap.
Ik haal alles door elkaar omdat de benaming niet klopt.

Elke lijn heeft 2 punten, die hebben allebei een X waarde en een Y waarde,
Lijn1X1
Lijn1Y1
Lijn1X2
Lijn1Y2
Lijn2X1
Lijn2Y1
Lijn2X2
Lijn2Y2

Die kunnen vanalles zijn dus de waardes maken even niets uit.
Hoe bereken ik deze waardes in die formule ?
Even geen formule waarvan je iets niet hebt,
zoals waarde x. wat ik dus niet begrijp.
y = slaat dat op de y as ?,
als dat zo is maak ik dat lieven uitkomstY.

Ik hoop dat je mij begrijpt waarom ik dat niet snap.

arie
Moderator
Moderator
Berichten: 3911
Lid geworden op: 09 mei 2008, 09:19

Re: Een prakties voorbeeld van deze formule

Bericht door arie » 06 mar 2022, 14:39

Code: Selecteer alles

{
// waarden die je vrij mag kiezen:
// rode lijn:
double Lijn1X1 = -1;
double Lijn1Y1 = -2;
double Lijn1X2 = 1;
double Lijn1Y2 = 6;

// waarden die je vrij mag kiezen:
// blauwe lijn:
double Lijn2X1 = -3;
double Lijn2Y1 = -3;
double Lijn2X2 = 2;
double Lijn2Y2 = 7;

// hulpwaarden die we uit bovenstaande gegevens berekenen voor Lijn1:
double Lijn1a = (Lijn1Y2 - Lijn1Y1) / (Lijn1X2 - Lijn1X1);
double Lijn1b = Lijn1Y1 - Lijn1a*Lijn1X1; 

// hulpwaarden die we uit bovenstaande gegevens berekenen voor Lijn2:
double Lijn2c = (Lijn2Y2 - Lijn2Y1) / (Lijn2X2 - Lijn2X1);
double Lijn2d = Lijn2Y1 - Lijn2c*Lijn2X1; 

// nu bereken we het snijpunt S = het punt (uitkomstX; uitkomstY) :
double uitkomstX = (Lijn2d - Lijn1b) / (Lijn1a - Lijn2c);
double uitkomstY = Lijn1a*uitkomstX + Lijn1b;

// werk hier verder met het snijpunt of
//   print de coordinaten ervan op het scherm:
// ...
// ...
}
Hierboven de C-code die je waarschijnlijk direct kan copy/pasten naar je programma.
De begin- en eindpunten (Lijn1X1, Lijn1Y1, Lijn1X2, Lijn1Y2, Lijn2X1, Lijn2Y1, Lijn2X2 en Lijn2Y2) heb ik de waarden uit bovenstaand plaatje gegeven (= de punten A, B, C en D daarin). Van deze variabelen zal je waarschijnlijk liever input variabelen (parameters / argumenten) maken van een functie die het snijpunt van 2 lijnen berekent.
Na afloop is in dit voorbeeld
uitkomstX = 0,5
uitkomstY = 4
Het snijpunt is dus S = (0.5; 4)

heli
Nieuw lid
Nieuw lid
Berichten: 5
Lid geworden op: 04 mar 2022, 20:09

Re: Een prakties voorbeeld van deze formule

Bericht door heli » 06 mar 2022, 16:33

Super, ik ga deze code morgen proberen, en laat weten of het werkt.

heli
Nieuw lid
Nieuw lid
Berichten: 5
Lid geworden op: 04 mar 2022, 20:09

Re: Een prakties voorbeeld van deze formule

Bericht door heli » 08 mar 2022, 14:59

Hallo Arie, deze code werkt, bedankt.
Nu geeft die ook een waarde als die geen lijn raakt, daar moet ik nog een keer mee verder gaan.
Uiteindelijk wil ik hiermee een 4 speler asteroid spel maken waarbij de lasers tegen elkaar opbotsen voor alle spelers.

Nu zal ik te denken mischien is zoveel delen door niet nodig, ik heb al een paar dingen berekend :
Ik heb al de uitkomt sinus en cosinus van de rotatie, en de lengte van de lijn.
Mischien dat er nog een delen door vanaf kan ?

Plaats reactie