![]() |
Kreise die sich berühren...
Hi,
ich möchte rausfinden, ob sich 2 Kreise (mit demselben Radius r) in einem beliebigen Koordinatensystem berühren, soll heissen einen Schnittpunkt haben. Dazu hab ich mir folgendes überlegt: Sie haben genau dann einen Schnittpunkt, wenn die Gerade durch die beiden Mittelpunkte der Kreise genau 2r lang ist. Um diese Gerade (ich taufe sie g) zu berechnen, denke ich mir ein Hilfsdreieck, um mit Hilfe des Satzes des Pytagoras (a² + b² = c²) dann das c (in diesem falle g) berechnen zu können, was mich dann schließlich zu dieser gleichung bringt:
Code:
wobei Km Kreismittelpunkt heissen soll ;) also X(Km1) der X - Wert des Mittelpunktes des Kreises 1 ist.
g² = (X(Km2) - X(Km1))² + (Y(Km2) - Y(Km1))²
so, jetzt kommt das eigentliche Problem: die rechte Seite dieser Gleichung ist ja einfach zu berechnen, nur dann muss ich ja die Wurzel aus g² berechnen, um dann g mit 2r vergleichen zu können. Aber: es gibt ja bei Pixeln keine Komma-Werte, und das verwendete koordinatensystem wird definitiv Pixel als einheit verwenden. Bei Wurzel aus g² wird aber doch selten eine Ganzzahl herauskommen, d.h. wenns dumm läuft (weil ich mit gerundetem g - Wert vergleichen muss) erkennt die function nicht, dass sich die beiden Kreise berühren, obwohl sie es tun! Wie könnte cih dieses Problem beheben? *MFG* |
Re: Kreise die sich berühren...
indem du abfragst ob g<=2r wobei ich g dann nicht runden würde sondern mit einem gleitkomma wert(r) rechnen würde!!!
|
Re: Kreise die sich berühren...
Zitat:
|
Re: Kreise die sich berühren...
:shock: Hä?
Dann schlägt die Funktion aber auch zu, wenn die beiden Kreise sich überschneiden. Ich dachte, es sei nur von Berührung die Rede? |
Re: Kreise die sich berühren...
Ich würde beim Zeichnen grundsätzlich zwei Ebenen betrachten: Einmal die gedankliche Ebene, die (weitgehend) stetig ist. Dort arbeitest du mit Kommazahlen. Alle Berechnungen, die du machst, machst du hier.
Wenn dein Bild soweit berechnet ist, gehts ans Zeichnen. Dann brichst du deine stetigen Zahlen in diskrete runter, am einfachsten mittels ![]() Diese Trennung hat den Vorteil, dass du immer mit den exakten Werten (sofern mab bei Gleitkommadarstellungen von "exakt" sprechen kann; exakt heißt hier immer, der Unterschied zweier Zahlen ist nicht groß ;) ) rechnest und nicht Pixelwerte und Werte in deiner gedachten Welt mischen musst. Außerdem kann sich die Größe deiner Darstellung ändern, in diesem Fall müsstest du sonst auch die Größe deiner Welt ändern! |
Re: Kreise die sich berühren...
natürlich auch wenn sie sich überschneiden, das ist richtig!
|
Re: Kreise die sich berühren...
Zitat:
Wo er sich doch so viel Mühe gegeben hat, genauestens zu erklären, wann eine Berührung stattfindet und wieso ein Unterschied zwischen der reinen Berechnung einer Berührung und ihrer Darstellung in einem Pixel-Raster auftreten kann. Ich würde es bei der Berechnung von g (ohne Rundung) belassen und manuell eine erlaubte Abweichung von 2r festlegen, innerhalb derer man noch von Berührung ausgehen darf. |
Re: Kreise die sich berühren...
dann kann man ja gucken ob abs( g² - dasdaoben ) < 2 oder sowas....
|
Re: Kreise die sich berühren...
edit: erstmal respekt, dachte nicht dass gleich so viele ideen kommen :thumb:
Zitat:
Zitat:
allerdings scheint mir eine toleranz von 2r doch etwas zu groß !? du meinst wohl 2 pixel oder? |
Re: Kreise die sich berühren...
Zitat:
Zitat:
Also: Man berechnet g und die Summe der beiden Radien. Eine kleine Abweichung voneinander wird dem Pixel-Problem angelastet und trotzdem als Berührung erkannt. Welche Abweichung tolerierbar ist, kann ich dir jetzt so nicht sagen. Musst du notfalls ausprobieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz