De drie punten van een driehoek bepalen
-
- Vast lid
- Berichten: 25
- Lid geworden op: 15 okt 2012, 23:15
De drie punten van een driehoek bepalen
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?
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?
Re: De drie punten van een driehoek bepalen
In principe te berekenen ...
Construeren zie ik niet direct ...
Construeren zie ik niet direct ...
-
- Vast lid
- Berichten: 25
- Lid geworden op: 15 okt 2012, 23:15
Re: De drie punten van een driehoek bepalen
Hoe dan?SafeX schreef:In principe te berekenen ...
Construeren zie ik niet direct ...
Ik heb uiteindelijk een stukje C-code nodig waarmee ik de punten kan berekenen.
En wat bedoel je met construeren?
Re: De drie punten van een driehoek bepalen
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
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?
[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
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?
-
- Vast lid
- Berichten: 25
- Lid geworden op: 15 okt 2012, 23:15
Re: De drie punten van een driehoek bepalen
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?
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?
-
- 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
Nee, numeriek wil zeggen dat je een benaderingsmethode toe zult moeten passen om een oplossing te vinden.mechamania schreef:Bedoel je met numeriek oplossen dat je dat in een formule kunt vatten?
"Mathematics is a gigantic intellectual construction, very difficult, if not impossible, to view in its entirety." Armand Borel
-
- Vast lid
- Berichten: 25
- Lid geworden op: 15 okt 2012, 23:15
Re: De drie punten van een driehoek bepalen
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?
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?
Re: De drie punten van een driehoek bepalen
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.mechamania schreef:Hmm, dat is misschien een probleem.
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;
}
- 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...
-
- Vast lid
- Berichten: 25
- Lid geworden op: 15 okt 2012, 23:15
Re: De drie punten van een driehoek bepalen
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.
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.