Results 1 to 14 of 14

Thread: Afstand tussen lijn en punt

  1. #1

    Afstand tussen lijn en punt

    Eigenlijk 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).

  2. #2
    Gebruik daarvoor de Hypot functie uit de unit Math of bereken het zelf
    Code:
    Afstand := SQRT(SQR(x1-x2) + SQR(y1-y2)) 
    of
    Afstand := Hypot(x1-x2, y1-y2).
    DeX 3 Delphi := The ease of VB with the power of C; Zoekt en gij zult vinden

  3. #3
    Game-Programmer nschagen's Avatar
    Join Date
    Jun 2003
    Location
    Alkmaar
    Posts
    685
    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??
    When things don't go right, Turn left

  4. #4
    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.

  5. #5
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    8,493
    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.

  6. #6
    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;
    Last edited by Adriaan; 23-Apr-06 at 16:22.

  7. #7
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649
    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.

  8. #8
    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.
    Attached Images Attached Images

  9. #9
    Supports INLDelphiMember Johan Stokking's Avatar
    Join Date
    Sep 2003
    Location
    Assen
    Posts
    649
    Die edit was 1 minuut voor m'n post; had hem nog niet gezien. Snap je de formule?

  10. #10
    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?

  11. #11
    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:

    Code:
    abs ( (x1 - x0) * (y0 - yp) - (y1 - y0) * (x0 - xp) ) /  
      sqrt( sqr(x1 - x0) + sqr(y1 - y0) )
    Bedenk daarbij dat je de absolute waarde van de teller in acht neemt. De formule vindt zijn herleiding in een, zoals altijd , vectorgeorienteerde benadering.

  12. #12
    Game-Programmer nschagen's Avatar
    Join Date
    Jun 2003
    Location
    Alkmaar
    Posts
    685
    Ik heb deze code zojuist toegepast in mijn project en het werkt prima
    When things don't go right, Turn left

  13. #13
    TScriptKiddie DiGi-Ben's Avatar
    Join Date
    Oct 2004
    Location
    Beek (lb). Neth. Uses: Delphi 2005 Architect Uses: Delphi 2006 Architect
    Posts
    817
    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..
    "Some are wise, some are otherwise."

  14. #14
    Hoi Anant,

    De formule werkt inderdaad prima. Bedankt.

    Adriaan.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •