Abstand von einem Punkt zu einer Geraden
-
Schon klar, wenn die Argumente ausgehen, wird eben alles umgedreht...
-
Woah Leute, jetzt beruhigt euch doch mal wieder...
Ich habe eine Antwort bekommen, die genau die Vorgehensweise enthält, die ich mit dem Skalarprodukt angestrebt habe (Lot fällen, durch den Punkt gehen lassen, und die Länge bestimmen).
Ich habe mich über die Antwort gefreut und dass das mit dem m nicht funktioniert, ist mir erst später aufgefallen. Trotzdem ist mir eine Antwort, die vielleicht noch nicht perfekt ist, allemal lieber als keine Antwort, sondern nur ein relativ unverständlicher Kommentar wie "lass es gut sein"Ein bisschen überheblich bist du schon, TGGC, wir hatten da auch mal unseren kleinen Disput. Ich will jetzt nicht wieder anfangen, aber wenn du nicht vorhast, eine Antwort zu geben, oder eine gegebene Antwort zu verbessern, dann schreib halt einfach gar nichts dazu. Spätestens bei deinem zweiten Posting hättest du begründen können, was an rapsos Antwort nicht passt.
Ich hab mich als FOSler vielleicht auch ein bisschen dumm angestellt, dieses mathematische Problem zu lösen, aber ich glaube, es gibt in diesem Forum noch wesentlich dümmere Fragen.
-
Wenn man so unglaublich schlau wie ich bin, kann man doch auch so richtig überheblich sein. Dann wirft man den Leute einfach so'n google Link hin http://www.google.de/search?hl=de&ie=UTF-8&oe=UTF-8&q=distance+point+line+2d&meta= und hofft das sie es mit der Maus bis zum ersten Link schaffen. Kritik von prallt quasi ungelesen ab und Smilies spart man im entscheidenten Moment ein.
-
Wenn man im "entscheidenden Moment" nichts konstruktives beitragen kann/will, dann kann man auch einfach nichts sagen. Scroll nochmal ganz nach oben (evtl. musst du auch auf die erste Seite des Flame Wars wechseln) und schau dir deinen ersten und zweiten Beitrag an.
Vielleicht wirst du mit Hilfe deiner Genialität feststellen, dass diese nicht zur Lösung des Problems beigetragen haben. Aber du musst halt einfach immer deinen Senf dazu geben.
-
Durch eine der vielen meiner heldenhaftene Person innewohnenden gottgleichen Fähigkeiten ist mir der Hinweis auf google natürlich bereits ohne Benutzung des Mausrades bewusst. Und hey, ohne Senf schmeckt's ja nicht.
-
Gerade hat Richtungsvektor v und Punktvektor u.
Punkt hat Punktvektor p.
Dann ist der Abstand |w|:|w| = | u + [((p-u)*v)/(v*v)]*v-p |
Das ganze resultiert aus der Orthogonalitätsbedingung v1 ort. zu w1 ->v1*w1=0
Das Produkt zweier Vektoren ist in diesem Fall jeweils das Skalarprodukt, also eine Zahl (kein Vektor). Also bitte nicht mit Kreuzprodukt verwechseln !Gruß
E-the-Real
-
Wiederum zu umständlich! Schau mal die Seite aus google an, dort wird für 2D auch davon abgeraten.
-
Hi,
Hm, ich weiß ja nicht ob ihr schon lösungen habt oder so.
Aber ich poste einfach mal meinen Weg.Punkt: x
Gerade: p1.) Hilfeben Normalenvector des Richtungsvectors der Geraden.
2.) d(abstand zu 0 ) mit hilfe des Punktes x bestimmen.
3.) Gerade p mit Hilfsebene schneiden.
4.) Den Abstand zwischen punkt x und Schnittpunkt von hilfsebene und gerade p.So das wars
Cu
-
Oh mann...
-
// dist_Point_to_Line(): get the distance of a point to a line. // Input: a Point P and a Line L (in any dimension) // Return: the shortest distance from P to L float dist_Point_to_Line(Point P, Line L) { Vector v = L.P1 - L.P0; Vector w = P - L.P0; double c1 = dot(w,v); double c2 = dot(v,v); double b = c1 / c2; Point Pb = L.P0 + b * v; return d(P, Pb); }
-
Es kommt noch besser: Eigentlich brauch ich ja den Abstand von nem Punkt zu einer Strecke. Ich hab mir halt gedacht, des krieg ich dann auch noch hin, ich frag mal nach Gerade. Im Moment hab ich folgendes:
#define dot(u,v) ((u).x * (v).x + (u).y * (v).y) #define norm(v) sqrt(dot(v,v)) // norm = length of vector #define dis(u,v) norm(u-v) // distance = norm of difference [PointFloat::]inline double GetDistanceToSegment(const PointFloat &rStartPoint, const PointFloat &rEndPoint) { PointFloat v = rEndPoint - rStartPoint; PointFloat w = *this - rStartPoint; double c1 = dot(w,v); if (c1 <= 0) return dis(*this, rStartPoint); double c2 = dot(v,v); if (c2 <= c1) return dis(*this, rEndPoint); double b = c1 / c2; PointFloat Pb; Pb.x = rStartPoint.x + b * v.x; Pb.y = rStartPoint.y + b * v.y; return dis(*this, Pb); }
Ich müsste es eigentlich nur noch testen, aber ich bin grad zu sehr mit DirectX Graphics beschäftigt, deshalb hab ich noch nichts gesagt
Man sollte nicht immer alles gleichzeitig machen
-
Ich glaub ihr habt den (C) Hinweis vergessen.