Eigenlijk :rolleyes: is het een wiskundevraag, maar hopelijk hebben de nldelphi users dit probleem zelf al een keer opgelost.
Hoe bereken ik de afstand tussen een punt en een lijn? Van de lijn weet ik alleen twee punten (x0,y0) en (x1,y1).
Printable View
Eigenlijk :rolleyes: is het een wiskundevraag, maar hopelijk hebben de nldelphi users dit probleem zelf al een keer opgelost.
Hoe bereken ik de afstand tussen een punt en een lijn? Van de lijn weet ik alleen twee punten (x0,y0) en (x1,y1).
Gebruik daarvoor de Hypot functie uit de unit Math of bereken het zelfCode:Afstand := SQRT(SQR(x1-x2) + SQR(y1-y2))
of
Afstand := Hypot(x1-x2, y1-y2).
Ik was hier zelf laatst ook naar op zoek.:)
Een lijn is eigenlijk een puntenverzameling, dus een vaste afstand heb je eigenlijk niet. Ik neem in dit geval aan dat het om de afstand gaat tussen punt 1 en het punt op de lijn wat het dichtst bij punt 1 ligt gaat.
Klopt dat??
Ik had wat preciezer moeten zijn met de omschrijving van de afstand tussen punt en lijn. Ik bedoel namelijk de kortste afstand tussen de lijn en het punt.
(De afstand (kortste verbinding) van een punt tot een lijn is de lengte van de loodlijn neergelaten vanuit dat punt op die lijn.)
Dus alleen het bereken van de afstand tussen twee punten, zoals Henkie voorstelt, is niet voldoende.
Zelfde principe. Alleen
(1) moet je nu het punt op de lijn uit drukken in een geparameteriseerde formule. b.v. (2t+5,t+2) oid.
(2) Dan bereken je de uitdrukking voor de afstand (laat de laatste wortel er maar vanaf).
(3) Differentieer deze, en stel um gelijk aan nul. Dat is het minimum van de afstand.
(4) Krijg een uitdrukking in x,y en vul deze terug in (2), en neem de wortel, klaar.
Heb je geen voorbeeldcode van stap 1 t/m 4?
Ik heb zelf onderstaande code gecreeerd, maar als ik die ga testen klopt de uitkomst niet.
Code:function Afstand(xp, yp, x0, y0, x1, y1: Integer): Extended;
var Lambda: Extended;
begin
Lambda := ((x1*(xp-x0))+(y1*(yp-y0)))/(sqr(x1)+sqr(y1));
Result := sqrt(sqr(xp-x0-(Lambda*x1))+sqr(yp-y0-(Lambda*y1)));
end;
Daar kan ik je mee helpen maar vertel eerst even wat je zelf al geprobeerd hebt en waar je niet uit komt. Dit is wiskunde B1 op HAVO niveau dus afhankelijk van je opleiding moet je een eind kunnen komen.
Hoi Johan,
Wat ik al geprobeerd heb staat in het vorige bericht. De code daar is gebaseerd op de bijgevoegde formule. Andere benaderingswijzen ken ik niet.
Die edit was 1 minuut voor m'n post; had hem nog niet gezien. Snap je de formule?
Volgens mij heb ik de formule juist vertaalt naar de code in bericht #6. Echter de uitkomst is niet korrekt! Is de formule fout of de vertaling van de formule naar de code?
adriaan: de juiste formule voor de afstand d van een punt (xp, yp) tot een lijn die gaat door de punten (x0, y0) en (x1, y1) is:
Bedenk daarbij dat je de absolute waarde van de teller in acht neemt. De formule vindt zijn herleiding in een, zoals altijd :D, vectorgeorienteerde benadering.Code:abs ( (x1 - x0) * (y0 - yp) - (y1 - y0) * (x0 - xp) ) /
sqrt( sqr(x1 - x0) + sqr(y1 - y0) )
Ik heb deze code zojuist toegepast in mijn project en het werkt prima:D
Ik zou het zo doen:
1. bereken de lijn die loodrecht op de oorspronkelijke lijn staat
2. bereken b in y=ax+b door gebruik te maken van de eigenschap dat de lijn door het punt gaat
3. bereken het snijpunt tussen de twee lijnen
4. gebruik Pythagoras met de detla-waardes om de lengte van de schuine zijde te vinden
Ik zie dat er mensen zijn die een betere oplossing hebben, maar voor het geval dat.. ;)
Hoi Anant,
De formule werkt inderdaad prima. Bedankt.
Adriaan.