Forum: Mikrocontroller und Digitale Elektronik kürzeste Entfernung berechnen


von Josef (Gast)


Lesenswert?

Hallo,

ich stehe vor einer Aufgabe um die kürzeste Strecke zwischen Punkt 1 und 
Punkt 10 zu berechnen.

Gegeben eine Startkoordinate x,y.
Weitere 10 Koordinaten.
Da die Punkte mit einer Toleranz von nur z.B. 4 cm genau getroffen 
werden müssen suche ich eine Berechnung der kürzesten Strecke.
Also ist um jeden Punkt ein Kreis mit 8cm Durchmesser und gesucht wird 
jeweils die Koordinate die am Kreis tangiert.

Hat jemand Tipps bzw. Quellen so einer Berechnung?

Viele Grüße

von Karl H. (kbuchegg)


Lesenswert?

Josef schrieb:

> Da die Punkte mit einer Toleranz von nur z.B. 4 cm genau getroffen
> werden müssen suche ich eine Berechnung der kürzesten Strecke.
> Also ist um jeden Punkt ein Kreis mit 8cm Durchmesser und gesucht wird
> jeweils die Koordinate die am Kreis tangiert.


wieso tangiert.

Die kürzeste Strecke zwischen 2 Punkten ist eine Gerade.
Und wenn du um die Punkte einen Kreis hast, dann ändert das nicht viel. 
Denn die Gerade ist innerhalb des Kreises ja ein Radiusvektor und der 
steht immer senkrecht zum Umfang. D.h. die Distanz zu diesem Punkt kann 
maximal um +- Radius von der rechnerischen Distanz zu diesem Punkt 
abweichen, wenn der korrekte Punkt innerhalb eines Fehlerkreises rund um 
den idealen Punkt liegt.

Einfach mal aufzeichnen, dann wirds klarer.


Ausser natürlich, ich habe deine Aufgabe missverstanden.

von Walleby (Gast)


Lesenswert?

Hey,

da würde ich mit Vektoren rechnen. Der Abstand von Punkten ist ja 
relativ simpel. Um die Toleranz zu berücksichtigen kannst du mit 9.3.2 
auf der Seite
http://www.dieter-heidorn.de/Mathematik/RP_LA_AG2/Kap09_Kreis_und_Kugel/Kreis_und_Kugel.html
berechnen.

MfG Walleby

von Magelan (Gast)


Lesenswert?

Das Problem klingt irgendwie sehr KOMPLEX.

Wenn ich das richig verstanden habe sind es ja neun Wegstrecken. Ist die 
Reihenfolge zwischen den Punkten festgelegt oder soll diese auch in 
Hinblick auf die kürzeste Strecke optimiert werden? Könntest Du mal eine 
kleine Graphik beifügen, die Dein Problem etwas näher verdeutlicht.

Derzeit würde es meiner Meinung nach auf das Problem des 
Handlungsreisenden (gerne mal den Wiki-Artikel lesen) hinauslaufen. Wenn 
Du da wirklich die kürzeste Entfernung berechnen willst, wirst Du nicht 
um das berechnen fast aller Möglichkeiten herumkommen.

Gruß Magelan

von Bernd (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ausser natürlich, ich habe deine Aufgabe missverstanden.

das hast Du, er will die Punkte nicht exakt anfahren, es reicht wenn er 
in 4cm Abstand vorbeifährt

von Karl H. (kbuchegg)


Lesenswert?

Bernd schrieb:
> Karl Heinz Buchegger schrieb:
>> Ausser natürlich, ich habe deine Aufgabe missverstanden.
>
> das hast Du, er will die Punkte nicht exakt anfahren, es reicht wenn er
> in 4cm Abstand vorbeifährt


Ah.
Jetzt hab ichs.

Er will eine Sequenz von 10 Punkten nacheinander abfahren und sucht die 
Distanz, wenn er nicht genau den Punkt anfahrten muss sondern auch zb 4 
cm vorher schon umdrehen und zum nächsten Punkt fahren kann.

Jau. Das ist wirklich komplex.

von Bernd (Gast)


Lesenswert?

Walleby schrieb:
> da würde ich mit Vektoren rechnen. Der Abstand von Punkten ist ja
> relativ simpel.

das schon, aber das klingt nach verschärftem Travelling salesman Problem

von Harald W. (wilhelms)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Die kürzeste Strecke zwischen 2 Punkten ist eine Gerade.

...aber ich kenn da ne Abkürzung... :-)
SCNR
Harald

von MaWin (Gast)


Lesenswert?

Hausaufgabe Handlungsreisender ?

Hat man eine exakte Route, kann man ja nochmal eine 4cm am Innenknick 
liegende Route ausrechnen.

von Martin S. (sirnails)


Lesenswert?

Bernd schrieb:
> Karl Heinz Buchegger schrieb:
>> Ausser natürlich, ich habe deine Aufgabe missverstanden.
>
> das hast Du, er will die Punkte nicht exakt anfahren, es reicht wenn er
> in 4cm Abstand vorbeifährt

Er sucht also im Grunde genommen folgenden Algorithmus:

1) Die Kreismittelpunkte werden miteinander verbunden und zwar so, dass 
die Verbindung der Mittelpunkte Kreis1->Kreis2, Kreis2->Kreis3, 
Kreis3->Kreis4... die optimale kürzeste Distanz bilden. Unter dem 
Begriff des "Handelsreisenden" wird das Problem über den 
Ameisenalgorithmus (MMAS = Min Max Ant System) gelöst.

2) Nun ist die Reihenfolge der Kreise bekannt. Es werden die Geraden 
zwischen den Mittelpunkten gebildet.

3) Es werden die Schnittpunkte der Sekanten gebildet.

4) Die Reihenfolge der Kreise bestimmt die Reihenfolge, mit welcher die 
Sekantenschnittpunkte abgefahren werden müssen.

Et voilàt: Du hast die kürzeste Strecke.

von Gästle (Gast)


Lesenswert?

Martin Schwaikert schrieb:
> Er sucht also im Grunde genommen folgenden Algorithmus:
>
> 2) Nun ist die Reihenfolge der Kreise bekannt. Es werden die Geraden
> zwischen den Mittelpunkten gebildet.


Nur dass sich durch die Möglichkeit auf nur 4cm genau treffen zu müssen 
unter umständen eine andere Route als die beim klassischen TSP als ideal 
erweisen kann. Damit ist dein Algorithmus maximal zum Auffinden einer 
Startlösung für irgendeine Heuristik zu gebrauchen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin Schwaikert schrieb:
> 1) ... 4)
Das funktioniert natürlich bestenfalls, wenn alle Kreise jeweils 
mindestens 8cm voneinander entfernt liegen.

von Josef (Gast)


Lesenswert?

Ergänzung:

die Kreise schneiden sich nicht und die Reihenfolge ist bekannt.

von Josef (Gast)


Angehängte Dateien:

Lesenswert?

anbei eine Skizze, gesucht die rote Strecke.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Josef schrieb:
> anbei eine Skizze, gesucht die rote Strecke.

Die Strecken durch Punkt 6 (hin und wieder weg) sind hier definitiv 
falsch. Das geht kürzer, wenn man nicht durch den Mittelpunkt fährt, 
sondern eine Gerade zieht, die dann irgendwo durch den Kreis des Punktes 
6 führt.

von STK500-Besitzer (Gast)


Lesenswert?

Klingt irgendwie nach Bezier 
http://de.wikipedia.org/wiki/B%C3%A9zierkurve

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Wenn ich mir die Zeichnung ansehe, glaube ich, dass auch schon die 
ersten beiden Geraden vom Startpunkt aus suboptimal sind.

Ich würde folgenden Algorithmus verwenden:

1. Ziehe Geraden von Mittelpunkt zu Mittelpunkt
2. Berechne die Winkelhalbierenden der Geraden

Der Punkt für die minimale Wegstrecke liegt dann auf dieser 
Winkelhalbierenden. Im allgemeinen ist das der Schnittpunkt der 
Winkelhalbierenden mit dem Kreis. Aber nicht immer, wie man an Punkt 6 
sieht. Hier liegt der gesuchte Punkt irgendwo auf der 
Winkelhalbierenden, da der Öffnungswinkel der beiden Geraden sehr groß 
ist. Aber das ist nur noch ein simples Minimax-Problem und leicht mit 
Trigonometrie zu lösen.

Wie ich auf Winkelhalbierende komme? Einfach aus Symmetrieüberlegungen. 
Die gezeichnete rote Linie ist garantiert nicht optimal. Da sind viel zu 
viele Asymmetrien drin.

von robin (Gast)


Lesenswert?

Ich würde es so lösen:

- Gerade von P1 zu P3
- Abstand der Geraden zu P2 ermitteln (Senkrechte auf der Geraden durch 
P2)
- Wenn der Abstand <4cm, dann diesen Punkt als neuen P2 speichern
- Wenn der Abstand >4cm ist, dann ist P2 der Schnittpunkt vom Kreis (P2) 
und der Senkrechten.

Und dann das selbe mit P2 zu P4 usw.

Ist zwar noch nicht perfekt, aber nahe am Maximum.
Gerade wenn mehr als 3 Punkte in reihe sitzen (wie bei P6 im Beispiel) 
kann es zu Abweichungen kommen.

von Christoph (Gast)


Lesenswert?

@Josef

Ist die Skizze, die Du hier eingestellt hast nur ein Beispiel? Ändern 
sich die Positionen der Punkte von Lauf zu Lauf oder sind diese im 
Vorfeld festgelegt? Wie auch immer... die kürzeste Strecke zu berechnen 
ist ein NP-vollständiges Problem (Stichwort "Problem des 
Handlungsreisenden" o. englisch "Traveling Salesman Problem"). D. h. die 
Laufzeit des Algorithums ist min. exponentiell, wenn Du die optimale 
Strecke mit Sicherheit finden willst.

Das gilt bereits schon dafür in welcher Reihenfolge Du die Puntke 
anfahren sollst um am Ende die kürzeste Strecke zu erhalten. Die Sache 
mit dem Radius um alle Punkte macht die Sache dann noch ein Stück 
komplexer.

Gruß
Christoph

von Christoph (Gast)


Lesenswert?

@Josef

Sehe gerade, dass Du geschrieben hast, dass die Reihenfolge bekannt ist. 
Dann sieht das Problem schon etwas anders aus... sehr interessant :)

Gruß
Christoph

von MaWin (Gast)


Lesenswert?

> die Reihenfolge ist bekannt

Lösung also kindereinfach und schon beschrieben.

> Wie ich auf Winkelhalbierende komme

Aus völlig richtigen Überlegungen.

> dass auch schon die ersten beiden Geraden vom Startpunkt
> aus suboptimal sind.

Unsauber gezeichnet.

Insgesamt klingt das aber sehr nach primitiver Hausaufgabe,
bei der er seine eigenen Gehirnwindungen aktivieren soll,
wenn er welche hat.

von Christoph (Gast)


Lesenswert?

Meine Idee um den optimalen Weg zu finden:

Gedanklich steckt in jedem Kreis ein Pinn, der innerhalb des Kreises 
ohne Widerstand bewegt werden kann. Start und Ziel erhalten auch je 
einen Pinn, die aber fest sind. Die Pinne werden in der vorgegebenen 
Reihenfolge mit einem "Gummi" (unter Spannung) miteinander verbunden. 
Das Gummi zieht sich nun zusammen und die Pinne sollten dann innerhalb 
der Kreise die Position einnehmen, die optimal für die kürzeste Strecke 
ist. Das Gummi zeigt unter der geringsten Spannung die kürzeste Strecke 
an.

Jetzt muss man das nur in Code giessen ;)

Gruß
Christoph

von Troll (Gast)


Lesenswert?

Der Kreis kann durch eine Funktion beschrieben werden... wenn man jetzt 
davon ausgeht dass man jeden Punkt im Kreis durch eine Funktion 
berechnen kann mit 2 Variablen(Winkel+Länge) kann man die gesamt Strecke 
mit 10*2 also 20 Variablen ausdrücken, und diese Funktion muss man dann 
einfach möglichst klein kriegen

von Achim M. (minifloat)


Lesenswert?

MaWin schrieb:
> Handlungsreisender
Travelling actor's problem ;) Was tu ich nur, wo fahr ich hin!

Die Idee mit den Pins ist schon mal nicht schlecht und entspricht doch 
Franks Idee...

Frank M. schrieb:
> Ich würde folgenden Algorithmus verwenden:
>
> 1. Ziehe Geraden von Mittelpunkt zu Mittelpunkt
> 2. Berechne die Winkelhalbierenden der Geraden

...wobei der 5. Kreis entfernt werden muss, da der Weg über die 
Mittelpunkte der Kreise den Kreis 5 derart schneidet, dass die gesamte 
Entfernung größer würde, würde man ihn nur am Rand anfahren.
mfg mf

von Mängel (Gast)


Lesenswert?

Hat das irgendwas mit Mikrocontrollern zu tun? Warum wird sowas nicht 
unter "Offtopic" gepostet?

von Arc N. (arc)


Lesenswert?

ICFP Programming Contest 2003 (da sollten sich noch einige Ansätze 
finden lassen)

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> 1. Ziehe Geraden von Mittelpunkt zu Mittelpunkt
> 2. Berechne die Winkelhalbierenden der Geraden

> Wie ich auf Winkelhalbierende komme? Einfach aus Symmetrieüberlegungen.
> Die gezeichnete rote Linie ist garantiert nicht optimal.

Die Überlegung mit den Winkelhalbierenden und den Symmetrien ist prinzi-
piell richtig. Allerdings darfst du dabei nicht die Winkelhalbierenden
der Verbindungslinien zwischen den Kreismittelpunkten betrachten, son-
dern diejenigen der Liniensegemente des Lösungwegs. Das macht die Sache
komplizierter, weil man die Winkelhalbierenden erst dann bestimmen kann,
wenn man die Lösung bereits kennt.

Der optimale Weg ist also ein Polygonzug, bei dem für jeden der zu
passierenden Kreise bis auf den letzten eine der beiden folgenden
beiden Aussagen gilt:

1. Er geht geradlinig durch den Kreis hindurch.

2. Er führt auf einer Geraden a zu einem Punkt P auf dem Kreisumfang
   und biegt dort in eine Gerade b ab, so dass der Kreisradius durch
   P den Winkel zwischen a und b halbiert.

Der letzte Kreis wird in Richtung seines Mittelpunkts angefahren, wobei
der Weg an seinem Umfang endet.

Ich habe mal mit Kig ein Beispiel konstruiert (s. Anhang), dabei aller-
dings ein wenig geschummelt, da ich den letzten Kreis so platziert habe,
dass sein Mittelpunkt auf dem zuvor konstruierten Weg liegt und nicht
umgekehrt, wie es eigentlich der Aufgabenstellung entspricht (Hätte ich
es ohne Schummeln geschafft, wäre aus der Konstruktion ein direktes
Lösungscerfahren abgefallen).

Mit den genannten Kriterien kann zwar ein gegebener Weg auf Optimalität
geprüft werden, sie liefern aber leider kein Verfahren, diesen Weg di-
rekt zu berechnen oder zu konstruieren (zumindest ist mir diesbezüglich
nichts eingefallen). Ich vermute, dass es bei zwei oder mehr Knicken im
Weg keine geschlossene Lösungsformel für das Problem gibt.

Es führt also wohl kein Weg an einer numerischen Lösung mittels eines
Iterationsverfahrens vorbei. Man könnte bspw. die Startrichtung des Wegs
so lange variieren, bis nacheinander alle Kreise in der richtigen Rei-
henfolge getroffen werden. Dabei wird vom Startpunkt aus immer so viel
des Wegs berechnet, bis er einen der Kreise verfehlt. Je nachdem, ob der
Weg links oder rechts an dem Kreis vorbeiläuft, und ob die Anzahl der
bisherigen Richtungsänderungen gerade oder ungerade ist, muss der Start-
winkel für die nächste Berechnung um einen geeigneten Betrag vergrößert
oder verkleinert werden. Wenn der Weg schließlich auch den letzten Kreis
passiert, wird noch so lange weiteroptimiert, bis der Weg exakt durch
seinen Mittelpunkt verläuft.

Von dem so gefundenen Weg wird dann noch der Radius des letzten Kreises
weggelassen, weil es ja genügt, dessen Umfang zu erreichen.

Der gefundene Weg entspricht übrigens dem eines Lichtstrahls, der vom
Startpunkt ausgesandt wird, an mehreren halbdurchlässig verspiegelten
Zylindern (die Kreise) reflektiert wird oder diese brechungsfrei durch-
dringt und schließlich durch den Mittelpunkt des letzten Kreises ver-
läuft.

Man könnte also das oben beschriebene rechnerische Verfahren auch physi-
kalisch realisieren, in dem man am Startpunkt einen Laserpointer drehbar
moniert, alle Kreise bis auf den letzten durch halbdurchlässig verspie-
gelte Zylinder ersetzt und den Laserpointer so lange dreht, bis der
Strahl genau ins Ziel fällt. Der gesuchte Weg ist dann der Weg des
Strahls, den man mit etwas Nebel oder Rauch sichtbar machen kann.

Alternativ könnte man statt des Laserpointers eine punktförmige, aber
nicht bündelnde Lichtquelle (kleine LED o.ä.) nehmen und am Zielpunkt
eine kleine Kamera platzieren. Der Punkt, an dem die Lichtquelle im
letzten Zylinder erscheint, wird auf diesem markiert und die Kamera
anschließend an diese Position gestellt. Dann wird der Punkt markiert,
an dem die Lichtquelle im vorletzten Zylinder erscheint. So wird fort-
gefahren, bis alle Zylinder markiert sind. Der gesuchte Weg führt dann
vom Startpunkt über die markierten Punkte zum Ziel.

Es muss allerdings in beiden Varianten dafür gesorgt werden, dass der
Strahl die einzelnen Zylinder tatsächlich nur in der vorgesehenen Rei-
henfolge durchläuft, sonst gelangt das Licht u.U. auf mehreren Wegen zum
Ziel. Da man den optimalen Weg aber ungefähr vorhersehen kann, hilft es
evtl., zwischen den Zylindern geeignete Blenden aufzustellen, die die
Reflexion in "falsche" Richtungen unterbinden.


Nur aus Interesse noch ein paar Fragen an Josef:

- Wozu dient das Ganze überhaupt?

- Soll die Berechnung tatsächlich auf einem Mikrocontroller stattfinden?

- Wie sind die zeitlichen Anforderungen?


MaWin schrieb:
> Lösung also kindereinfach und schon beschrieben.

Ich habe doch schon immer gewusst, dass du als Wunderkind geboren bist
;-)

von Elektroniker (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> wieso tangiert.
Weil er die Punkte nicht reffen muss, sondern nur, ihnen nahekommen 
muss.

WelchenPunkt er dabei durchfahren muss ist aber nicht direkt 
berechenbar, sondern muss aus der Umgebung abgeleitet werden.

Die Lösung ist einfach:

Man bestimmt die Gerade der Nachbarpunkte allgemein, hat daraus die 
Steigung und somit die Tangente für den Fall verschiederer Kreispunkte. 
Diese Distanz muss so ermittelt werden, dass sie minimal ist (Ableitung 
= null).

> Die kürzeste Strecke zwischen 2 Punkten ist eine Gerade.
Dies gilt dann, wenn diese Gerade den Kreis von oben schneidet.

Man muss davon ausgehen, dass das zuminstes in jedem zweiten Punkt der 
Fall sein muss, da sich sonst keine Geradenstäcke finden lassen, die bei 
allen Zwischenpunkten zu einer Lösung führen.

von Achim M. (minifloat)


Lesenswert?

Yalu X. schrieb:
> Man könnte also das oben beschriebene rechnerische Verfahren auch physi-
> kalisch realisieren

Wow, ich hab bis jetzt an einen amerikanischen Zeitungsjungen auf einem 
Fahrrad gedacht, der nur begrenzt weit werfen kann, aber möglichst 
schnell seine Runde durch den noch nicht/nicht mehr so dicht besiedelten 
Trailerpark nehmen will. :) mfg mf

von Christoph (Gast)


Lesenswert?

Joachim минифлоть schrieb:
> Die Idee mit den Pins ist schon mal nicht schlecht und entspricht doch
> Franks Idee...

Ich fürchte, dass die beiden Ideen sich nicht entsprechen. Die Idee mit 
den Winkelhalbierenden funktioniert eigentlich nur für drei Punkte. 
Jeder weitere Punkt bzw. dessen Position hat nämlich nicht nur eine 
direkte Auswirkung auf die Winkelhalbierenden, an denen er beteiligt 
ist, sondern indirekt auch auf alle Winkelgeraden im System. D. h. bei 
Verschiebung des sechsten Punktes/Kreises in der Skizze gebe es eine 
direkt Auswirkungen auf die Winkelhalbierende zw. den Punkten [4, 5, 6], 
[5, 6, 7] und [6, 7, 8]. Aber auch indirekte Auswirkungen zw. den 
Punkten [3, 4, 5], [7, 8, 9] usw. Wobei der Effekt (die Größe der 
notwendigen Korrektur von bestimmten Geraden) mit zunehmender Entfernung 
abnimmt.

Die Folge ist, dass wir hier bei einem iterativen Vorgehen landen, bei 
dem nach Zunahme eines neuen Punktes (bzw. der Verschiebung eines 
Punktes) alle bisherigen Geraden neu berechnet werden müssen. Und zwar 
solange iterativ bis eine vorher festgelegte Genauigkeit erreicht ist. 
D. h. die Längenverbesserung der gesamten Strecke bei zwei 
aufeinanderfolgenden Iterationen liegt unterhalb eines festgelegten 
Schwellwertes. Damit kriegt man eine Annährung an die optimale Strecke 
hin.

Ist auf jeden Fall eine schöne Aufgabe und ich hoffe, dass meine 
Erklärung verständlich ist;)

PS.: Der Thread gehört wirklich nicht in diesen Bereich.

von der mechatroniker (Gast)


Lesenswert?

> Man bestimmt die Gerade der Nachbarpunkte allgemein, hat daraus die
> Steigung und somit die Tangente für den Fall verschiederer Kreispunkte.
> Diese Distanz muss so ermittelt werden, dass sie minimal ist (Ableitung
> = null).

Wobei die Knickpunkte (x_i, y_i) ja alle jeweils innerhalb einer der 
abgeschlossenen Kreisscheiben liegen.

Wenn Punkt i jetzt um weniger als den doppelten Kreisradius von der 
Verbidungsgerade zwischen Punkt i-1 und Punkt i+1 entfernt liegt, kommen 
sowohl Punkte im Innern als auch Punkte auf der Kreislinie in Frage. 
Mathematisch gesehen lässt sich das nicht in einen Ausdruck pressen, der 
mittels Ableitung minimiert wird, es geht also nicht ohne 
Fallunterscheidung. Und zwar für jeden einzelnen Punkt.

Damit haben wir bei n Punkten, wobei Punkt 1 und Punkt n genau getroffen 
werden sollte, 2^(n-2) Fälle zu unterscheiden (wir reden noch von einer 
festgelegten Reihenfolge!) Wenn n nicht ganz klein ist, geht es damit 
also schon mal nicht "ganz einfach", zumindest nicht wenn eine endliche 
;-) Laufzeit des Programms gewünscht wird. Evtl. kann man aber einige 
Fälle von vornherein eliminieren (wo es mit dem lotrechten Abstand nicht 
hinhaut).

Mein Ansatz wäre folgender, der zu einer Näherungslösung führt:
1. Linie als Knickgerade initialisieren, die alle Punkte genau trifft
2. Nacheinander für jeden Punkt von 2. bis zum n-1-ten den Eckpunkt 
innerhalb des Spielraums so versetzen, dass die Länge der beiden 
angrenzenden Abschnitte minimiert wird.
3. Nachdem in (2) über alle Eckpunkte iteriert wurde, selbiges noch 
k-mal wiederholen. Je höher k, desto besser die Lösung.

von Elektroniker (Gast)


Angehängte Dateien:

Lesenswert?

Ich früchte man muss da alle Punkte gleichzeitg reinnehmen. Es ist ein 
nterschied, ob es mit einem nächsten Punkt in die eine, oder andere 
Richtung knickt.

Am Besten man versucht zunächst, durch alle Punkte mit einer Gerade 
durchzugehen und bricht diese Kette dort, wo der grösste Abstand ist. 
Von dort aus untersucht man das in zwei Teilproblemen, u.s.w

Es wird jeweils der Punkt neu bestimmt, der das grösste Problem 
darstellt.

von Elektroniker (Gast)


Angehängte Dateien:

Lesenswert?

Orange ist die erste lösung
türkis die beiden zweiten
und gruen die letzte

es kann natürlich sein, das es bei komplexeren Aufrüchen mehrere 
Lösungswege gibt, die dann zu unterschiedlichen Teillösungen führen.
dann müsste man am Ende die kürzeste suchen

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Josef schrieb:
> anbei eine Skizze, gesucht die rote Strecke.

Lässt sich die Strecke folgendermassen charakterisieren?

- Der jeilige Kreisradius ist Winkelhalbierende den an diesen
  Kreis ankommenden / wegführenden beiden Teilstrecken.

Oder ist meine mathematische Ituition falsch...?

Lässt sich zB anhand eines optimalen Weges zeigen, daß obige Bedingung 
nicht erfüllt ist?

von Josef (Gast)


Lesenswert?

Hallo,

die optimierten Punkte habe ich über Winkelhalbierende berechnet.
Der Sonderfall dass eine Linie durch einen Kreis geht wie bei Punkt6 vom 
Beispiel soll durch die Prüfung geht die Gerade durch Kreis geprüft 
werden.
1
U8 circleLineIntersect(float x1, float y1, float x2, float y2, float cx, float cy, float cr )
2
{
3
  float dx = x2 - x1;
4
  float dy = y2 - y1;
5
  float a = (dx * dx) + (dy * dy);
6
  float b = 2 * ((dx * (x1 - cx) + dy * (y1 - cy)));
7
  float c = (cx * cx) + (cy * cy);
8
  c += (x1 * x1) + (y1 * y1);
9
  c -= 2 * ((cx * x1) + (cy * y1));
10
  c -= cr * cr;
11
  float bb4ac = (b * b) - (4 * a * c);
12
13
  if (bb4ac < 0)
14
  {
15
    return FALSE;// Not intersecting
16
  }
17
  else
18
  {
19
    return TRUE;//intersecting
20
  }
21
}
das Ergebnis stimmt aus dieser Funktion nicht immer.
Habe ich da einen Denkfehler?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.