Programm zur Berechnung der Schnittpunkte von zwei Kreisen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hallo
ich bin gerade dabei ein programm zu programmieren, das die Schnittpunkte von zwei Kreisen berechnen soll.
folgende werte sind gegeben:

Code: Alles auswählen

x1=1
y1=0
r1=2
x2=3
y2=1
r2=4
also x und y sind die koordinaten des kreises und r der radius.
wenn ich das so ausrechne ist das kein problem:

(x – x1)²+(y–y1)²-r1²=(x–x2)²+(y–y2)²-r2²
dann nach x oder y auflösen, einsetzen, pq-formel und so weiter.

aber wie kann ich das jetzt in python umsetzen???
hat jemand ne idee???

mfg
LP640
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Eine Klasse "Circle" mit einer Methode "intersect" erstellen. Und in der Methode steht die Formel. ;-)

Sorry, aber was erwartest Du? Das wir doch zeigen wie man das berechnet?

Gruß,
Christian
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du nimmst dir ein Blatt Papier und einen Stift, formst das Ganze so um, dass x (x-Wert eines Schnittpunktes) allein auf einer Seite steht und auf der anderen Seite der Gleichung ein Term, den du mit den Mittelpunkten und Radien der beiden Kreise füttern kannst.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

Du nimmst dir ein Blatt Papier und einen Stift, formst das Ganze so um, dass x (x-Wert eines Schnittpunktes) allein auf einer Seite steht und auf der anderen Seite der Gleichung ein Term, den du mit den Mittelpunkten und Radien der beiden Kreise füttern kannst.
genau das habe ich bereits gemacht, war mir aber nicht genau sicher, wies hier weitergeht:
(ich habe x1 und y1 durch a1 und b1 ersetzt...)

-2*x*a1-s*y*b1+2*x*a2+2*y*b2=-a1**2-b1**2+r1**2+a2**2+b2**2-r2**2

so jetzt müsste ich ja eigentlich durch -2*a1 und -2*b1 und 2*a2 und 2*b2 teilen und dann das y auf die andre seite bringen oder???

mfg
LP640
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

sympy?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:genau das habe ich bereits gemacht, war mir aber nicht genau sicher, wies hier weitergeht:
(ich habe x1 und y1 durch a1 und b1 ersetzt...)

-2*x*a1-s*y*b1+2*x*a2+2*y*b2=-a1**2-b1**2+r1**2+a2**2+b2**2-r2**2
Das ist mir zu mühselig zu entziffern ...

Im Grunde ist das kein Python-Problem, sondern ein rein mathematisches Problem: Kreisgleichungen gleichsetzen, Schnittgerade berechnen, Schnittgerade mit einem der Kreise schneiden => Schnittstellen.

Die Formel musst du entweder selbst entwickeln, im Netz suchen, ob das schon einer für dich erledigt hat oder darauf hoffen, dass es hier im Forum jemand für dich erledigt. :)
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

Du kannst es auch numerisch loesen, von beiden Kreisen die Umfangskoordinaten von z.B. 1° berechnen bezogen auf einen Absoluten Punkt. Und dann die (oder der!) Punkt(e), die sich am naechsten sind als Ergebnis hernehmen.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Gabelmensch hat geschrieben:Du kannst es auch numerisch loesen
Und wenn Dir eine Kanone für den Spatz nicht reicht, kannst Du auch weiter aufrüsten ... :roll:


Vielleicht bin ich heute etwas martialisch drauf?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

CM hat geschrieben:
Gabelmensch hat geschrieben:Du kannst es auch numerisch loesen
Und wenn Dir eine Kanone für den Spatz nicht reicht, kannst Du auch weiter aufrüsten ... :roll:
Ich hätte noch eine Idee: Erstelle eine Graphik (z.B. mit PIL) und zeichne die beiden Kreise mit roter Farbe auf einen blauen Hintergrund, wobei die Farbe der einzelnen Pixel der Kreise durch XOR-Verknüpfung von Hintergrundfarbe und roter Zeichenfarber gebildet wird. Dann erhältst du zwei violette Kreise mit zwei schwarzen Schnittpunkten. Danach liest du die Farbe aller Pixel aus und suchst die schwarzen Pixel ...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

numerix hat geschrieben:Ich hätte noch eine Idee: Erstelle eine Graphik (z.B. mit PIL) und zeichne die beiden Kreise mit roter Farbe auf einen blauen Hintergrund, wobei die Farbe der einzelnen Pixel der Kreise durch XOR-Verknüpfung von Hintergrundfarbe und roter Zeichenfarber gebildet wird. Dann erhältst du zwei violette Kreise mit zwei schwarzen Schnittpunkten. Danach liest du die Farbe aller Pixel aus und suchst die schwarzen Pixel ...
Das finde ich aber doch ein wenig kompliziert. Ich würde den Hintergrund als schwarz wählen und die Kreise in grün, bzw. rot, malen. Die Schnittpunkte sind dann wunderbar pink.
Das Leben ist wie ein Tennisball.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Auf die Frage, wie man die Formel in Python umsetzt... so könnte man sie repräsentieren:

Code: Alles auswählen

class Var:
	def __init__(self, name): self.name = name
	def __str__(self): return self.name

class Add:
	def __init__(self, left, right): self.left, self.right = left, right
	def __str__(self): return "(%s + %s)" % (self.left, self.right)

class Sub:
	def __init__(self, left, right): self.left, self.right = left, right
	def __str__(self): return "(%s - %s)" % (self.left, self.right)

class Squared:
	def __init__(self, val): self.val = val
	def __str__(self): return "(%s)**2" % self.val

class Eq:
	def __init__(self, left, right): self.left, self.right = left, right
	def __str__(self): return "%s = %s" % (self.left, self.right)

print Eq(
	Sub(
		Add(
			Squared(Sub(Var("x"), Var("x1"))),
			Squared(Sub(Var("y"), Var("y1")))),
		Squared(Var("r1"))),
	Sub(
		Add(
			Squared(Sub(Var("x"), Var("x2"))),
			Squared(Sub(Var("y"), Var("y2")))),
		Squared(Var("r2"))))
Die Darstellung ließe sich noch verbessern: Man kann Klammern unterdrücken, wenn der geklammerte Ausdruck nicht weniger stark bindet als der eigene Ausdruck. Außerdem könnte man die hochgestellte 2 benutzen, wenn man nicht `__str__` benutzen würde. Wie auch immer, nun könnte man ein Programm schreiben, was den Eq-Term systematisch umformt. Typisches Problem, was man gerne mal im Informatik-Studium als Teil einer KI-Vorlesung macht (jedenfalls war das bei uns noch so, als KI ein Thema war). Alternativ kann man eine Auswertungsfunktion schreiben und einfach verschiedene Werte ausprobieren, bis man die richtigen findet.

Stefan
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hi
so ich habs jetzt irgendwie geschafft
aber ich habe bezüglich der idee von numerix noch eine frage und zwar ob man auch bei xturtle die farbe der pixel auslesen kann???

mfg
LP640
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

the more they change the more they stay the same
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

LP640 hat geschrieben:aber ich habe bezüglich der idee von numerix noch eine frage und zwar ob man auch bei xturtle die farbe der pixel auslesen kann???
Du hast doch hoffentlich nicht numerix Lösung umgesetzt, oder? Auch wenn er es nicht explizit geschrieben hat, aber der Ansatz ist sicher nicht ernst gemeint.
Das Leben ist wie ein Tennisball.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Das glaub' ich jetzt nicht....lol!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

EyDu hat geschrieben:Du hast doch hoffentlich nicht numerix Lösung umgesetzt, oder? Auch wenn er es nicht explizit geschrieben hat, aber der Ansatz ist sicher nicht ernst gemeint.
Ich warte sehnsüchtig auf Ironie-Tags...

sma: Hmm, irgendwie hab ich schon fast erwartet, eine lispige Lösung zu sehen. Wurde nicht enttäuscht :D
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten