De drie punten van een driehoek bepalen

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
mechamania
Vast lid
Vast lid
Berichten: 25
Lid geworden op: 15 okt 2012, 23:15

De drie punten van een driehoek bepalen

Bericht door mechamania » 22 sep 2015, 14:05

Hallo,

Ik wil de drie punten (A,B en C) van een driehoek bepalen, waarbij het volgende gegeven is:

(zie tekening hieronder)

- elk punt ligt op een gegeven circel (bekend middenpunt en bekende straal)
(punt A ligt op cirkel met middenpunt Am)
(punt B ligt op cirkel met middenpunt Bm)
(punt C ligt op cirkel met middenpunt Cm)
(de drie stralen zijn overigens identiek)
- De afstanden tussen de drie punten is gegeven.
(dus afstand tussen AB is bekend)
(dus afstand tussen BC is bekend)
(dus afstand tussen CA is bekend)

Hoe bereken ik nu de posities van de 3 punten A, B en C?

Afbeelding

SafeX
Moderator
Moderator
Berichten: 14278
Lid geworden op: 29 dec 2005, 11:53

Re: De drie punten van een driehoek bepalen

Bericht door SafeX » 23 sep 2015, 13:17

In principe te berekenen ...
Construeren zie ik niet direct ...

mechamania
Vast lid
Vast lid
Berichten: 25
Lid geworden op: 15 okt 2012, 23:15

Re: De drie punten van een driehoek bepalen

Bericht door mechamania » 23 sep 2015, 16:27

SafeX schreef:In principe te berekenen ...
Construeren zie ik niet direct ...
Hoe dan?
Ik heb uiteindelijk een stukje C-code nodig waarmee ik de punten kan berekenen.
En wat bedoel je met construeren?

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

Re: De drie punten van een driehoek bepalen

Bericht door arie » 23 sep 2015, 18:52

De globale structuur van zo'n functie in C zou kunnen zijn:

[1] Ga uit van punt A als functie van een hoek alpha:
Ax = Amx + r * cos(alpha)
Ay = Amy + r * sin(alpha)
waarbij
A = (Ax, Ay)
Am = (Amx, Amy) = het middelpunt van de cirkel waar A op ligt (= gegeven)
r = de straal van de cirkel (= gegeven)

[2] Bepaal de punten B als functie van A:
snij de cirkel waar B op ligt (middelpunt (Bmx, Bmy) en straal r, alle 3 gegeven)
met de cirkel met middelpunt A en straal de lengte van AB (= gegeven)
Er kunnen 0, 1 of 2 oplossingen voor B zijn (aangenomen dat Am en Bm verschillend zijn)

[3] Nu je A en B hebt, kun je C bepalen: snij
- de cirkel met middelpunt B en straal = afstand BC
met
- de cirkel met middelpunt A en straal = afstand AC

[4] Bedenk dat we alle gegevens hebben, behalve de hoek alpha.
We zoeken nu de C, waarbij de afstand van C tot Cm precies de gegeven r is.
Omdat de afstand van C tot Cm ook alleen afhankelijk is van alpha, kunnen we dit probleem vrij eenvoudig numeriek oplossen (nulpunt vinden van een functie in 1 variabele).


Let wel op: er kunnen ook nul of meerdere oplossingen oplossingen zijn van je probleem, hier zal je zorgvuldig mee om moeten gaan.

Voorbeeld (ongeveer als in jouw plaatje):

Amx = 5.6;
Amy = 0;
ra = 4.1;

Bmx = -2.8;
Bmy = 4.8;
rb = 4.1;

Cmx = -2.8;
Cmy = -4.8;
rc = 4.1;

AB = 5.4;
BC = 6.0;
AC = 3.6;

Dan heb je in onderstaande plot:
- in geel de mogelijke punten A (met afstand <= AB tot cirkel(Bm,r) )
- in lichtgroen de mogelijke punten B (maximaal 2 per punt A)
- in donkergroen de mogelijke punten C (afhankelijk van A en B)
- in rood en blauw de 2 mogelijke driehoeken ABC

Afbeelding

Voor de blauwe driehoek vind ik:

alpha = 2.989857199635416203106972382 (in radialen)

Ax = 1.547107991079856555503812290
Ay = 0.6197308803272948979255580909

Bx = -3.848545615168704779187622189
By = 0.8363461184267763486448699420

Cx = 0.8382875218180079843966293783
Cy = -2.909797918585587295271344524


Kom je hiermee verder?

mechamania
Vast lid
Vast lid
Berichten: 25
Lid geworden op: 15 okt 2012, 23:15

Re: De drie punten van een driehoek bepalen

Bericht door mechamania » 23 sep 2015, 22:16

Bedankt Arie.
Ik snap de aanpak. Ik ga proberen hoe ver ik ermee kom.
Bedoel je met numeriek oplossen dat je dat in een formule kunt vatten?

arno
Vergevorderde
Vergevorderde
Berichten: 1923
Lid geworden op: 25 dec 2008, 16:28
Locatie: Beek en Donk, Noord-Brabant

Re: De drie punten van een driehoek bepalen

Bericht door arno » 24 sep 2015, 16:38

mechamania schreef:Bedoel je met numeriek oplossen dat je dat in een formule kunt vatten?
Nee, numeriek wil zeggen dat je een benaderingsmethode toe zult moeten passen om een oplossing te vinden.
"Mathematics is a gigantic intellectual construction, very difficult, if not impossible, to view in its entirety." Armand Borel

mechamania
Vast lid
Vast lid
Berichten: 25
Lid geworden op: 15 okt 2012, 23:15

Re: De drie punten van een driehoek bepalen

Bericht door mechamania » 24 sep 2015, 20:42

Hmm, dat is misschien een probleem.
Ik moet code maken die in een Safety PLC moet draaien. Ik weet niet of een benadering methode (iteratie?) geaccepteerd wordt.
Dus er kan geen formule voor gevonden worden?

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

Re: De drie punten van een driehoek bepalen

Bericht door arie » 24 sep 2015, 23:09

mechamania schreef:Hmm, dat is misschien een probleem.
Ik verwacht dat dat geen probleem is: die benadering waar Arno over spreekt kan net zo nauwkeurig als je zelf wil of nodig vindt. Dus ook tot de nauwkeurigheid waarmee je computer werkt.

Voor jouw oorspronkelijke probleem is de bisectie methode prima (zie bv https://en.wikipedia.org/wiki/Bisection_method).

Hier een voorbeeld zoals je deze methode in C zou kunnen toepassen:

Code: Selecteer alles

// voorbeeldfunctie: myfun(x) = x^2 - 6:
double myfun(double x)
{
return(x*x-6);
}


// los f(x)=0 op in interval [xlo, xhi]:
// f(xlo) en f(xhi) moeten verschillend teken hebben
double solve(double f(double), double xlo, double xhi)
{
double xmid, fmid, flo;
int i;

flo = f(xlo);
for(i=0;i<100;i++){ // 100 iteraties => ~30 decimalen nauwkeurig
  xmid = (xlo+xhi)/2.0;
  fmid = f(xmid);
  if((fmid<0 && flo<0) || (fmid>0 && flo>0)){
    xlo = xmid;
    flo = fmid;
    }
  else
    xhi = xmid;
  }
return((xlo+xhi)/2.0);
}


int main(int argc, char* argv[])
{
double r;

r=solve(myfun,0,4);
printf("%.12lf\n",r);

return 0;
}
Het gaat om de functie solve() die als invoerparameters heeft:
- een functie f() waarvan je het nulpunt wilt vinden
- de intervalgrenzen xlo en xhi van het interval waarin het nulpunt ligt

Elke iteratie van de hoofdlus van solve() halveert de grootte van het interval, na elke 10 halveringen is het interval dus (1/2)^10 ofwel ongeveer 1/1000 keer zo groot als het oorspronkelijke interval.
Dat wil zeggen: elke 10 iteraties leveren 3 extra significante cijfers van de oplossing.
Als xlo en xhi niet al te ver uit elkaar liggen kom je met 100 iteraties ruimschoots uit (= een oplossing met ongeveer 30 significante cijfers).

In dit voorbeeld zoek ik het nulpunt van myfun(x) = x^2 - 6 op het interval [0, 4].
De uitkomst is dus wortel(6) = 2.4494897427831...

mechamania
Vast lid
Vast lid
Berichten: 25
Lid geworden op: 15 okt 2012, 23:15

Re: De drie punten van een driehoek bepalen

Bericht door mechamania » 24 sep 2015, 23:43

Het gaat niet om de nauwkeurigheid.
Het gaat erom dat je in een Safety PLC alleen gecertificeerde code kunt gebruiken.
Dit betekend dat je kunt vermenigvuldigen/delen en optellen. En wat functies als worteltrekken, logaritme en trigonometrie kunt gebruiken.
Van alles wat je verder doet moet je aan tonen dat dat correct is. Een wiskundige afleiding die tot een formule leidt gaat denk ik nog wel lukken. Maar bewijzen dat een benadering functie goed is en een correct resultaat oplevert gaat te ver.

Dus eigenlijk zoek ik een formule die wiskundig af te leiden is.

Plaats reactie