Algorithmus für "geschlossene" Kreise [gelöst]
Algorithmus für "geschlossene" Kreise [gelöst]
Hallo mal wieder,
ich bin auf der Suche nach einem Algorithmus, der "geschlossene" Kreise "liefert".
Ein Bild sagt mehr als tausend Worte:
Der linke Kreis ist das was ich im Moment habe (Bresenham), der rechte Kreis ist was ich gerne hätte.
Kennt jemand von Euch einen Algo. der das kann?
Viele Grüße,
heinz
ich bin auf der Suche nach einem Algorithmus, der "geschlossene" Kreise "liefert".
Ein Bild sagt mehr als tausend Worte:
Der linke Kreis ist das was ich im Moment habe (Bresenham), der rechte Kreis ist was ich gerne hätte.
Kennt jemand von Euch einen Algo. der das kann?
Viele Grüße,
heinz
Zuletzt geändert von heinz am 14.04.2018 10:49:46, insgesamt 1-mal geändert.
Re: Algorithmus für "geschlossene" Kreise
Wie wäre es denn, wenn du den Algo von Bresenham einfach an deine Bedürfnisse anpasst?
Re: Algorithmus für "geschlossene" Kreise
Du kannst mal schauen, ob du hier fündig wirst:
https://de.wikipedia.org/wiki/Rasterung_von_Kreisen
https://de.wikipedia.org/wiki/Rasterung_von_Kreisen
Re: Algorithmus für "geschlossene" Kreise
Danke für die schnelle Antwort.bluestar hat geschrieben:13.04.2018 16:57:42Wie wäre es denn, wenn du den Algo von Bresenham einfach an deine Bedürfnisse anpasst?
Bin leider nicht so der Mathe-Freak.
Habe schon überlegt bei jedem gesetzten Pixel die umliegenden auch zu setzen.
Das würde allerdings zu vielen doppelt gezeichneten Pixeln führen, was ich gerne
vermeiden würde.
Der eigentliche Zweck ist auch nicht einen Kreis zu zeichnen sondern an den betreffenden
Stellen in einer sehr großen Karte bestimmte "Dinge" zu finden.
(Hoffe man versteht einigermassen was ich meine...)
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
Erklär mal was genau das Ziel ist, ich geh mal davon aus, dass Du mit Distanzen evtl besser beraten bist...
Re: Algorithmus für "geschlossene" Kreise
Danke für den Link.
Den Grafiken auf der rechten Seite nach zu urteilen sind die Kreise dort aber auch nicht geschlossen.
Werde die Algos aber trotzdem mal testen.
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
Ich versuch es mal:
Es existiert eine große zweidimensionale Karte (Kantenlänge 65536 Felder)
Jetzt möchte ich von einem beliebigen Punkt aus mit einem wachsenden Radius
das umgebende Gebiet nach "bestimmten Dingen" absuchen um z.B. den am nächsten liegenden
Fundort zu bestimmen oä.
Mit dem bisherigen Algo. habe ich das Problem, dass bestimmte Felder nicht getestet werden.
gruß heinz
Nachtrag:
Die Karte ist auch nicht im Speicher präsent (da zu groß).
Jedes Feld wird per randomseed zur Laufzeit errechnet. Weshalb auch so wenig wie möglich doppelt
berechnet werden sollen.
Re: Algorithmus für "geschlossene" Kreise
Mit Feld ist hier offensichtlich nicht Pixel gemeint, oder? Denn dann wäre das ja z.B. nur 256x256 groß und das wäre nun wahrlich nicht riesig!? Was ist also ein Feld und aus was besteht es? Der geringste Abstand ist die Quadratwurzel der Summe der quadrierten x/y-Abstand-Deltas zu einem Mittel- oder Randpunkt dieser bestimmten Dinge. Du musst halt erklären, was das Erkennungsmerkmal dieser bestimmten Dinge ist...
EDIT: Kantenlänge 65536! Das relativiert das dann schon wieder...
EDIT: Kantenlänge 65536! Das relativiert das dann schon wieder...
Re: Algorithmus für "geschlossene" Kreise
https://de.wikipedia.org/wiki/Euklidischer_Abstand
https://de.wikipedia.org/wiki/Polarkoor ... oordinaten
Ich würd wahrscheinlich so vorgehen, erstmal den Bereich zu bestimmen, den ich nicht testen muss, d.h. alles ausserhalb eines Suchkorridors, der durch den Radius vorgegeben ist, ausschliessen und dann anhand der Formel r=sqrt(x^2 + y^2) den Abstand der Punkte zum Kreismittelpunkt berechnen, ist abs(r) größer als der Radius, liegt der Punkt ausserhalb Deines Suchkreises.
Aber garantiert gibts was effizienteres...
https://de.wikipedia.org/wiki/Polarkoor ... oordinaten
Ich würd wahrscheinlich so vorgehen, erstmal den Bereich zu bestimmen, den ich nicht testen muss, d.h. alles ausserhalb eines Suchkorridors, der durch den Radius vorgegeben ist, ausschliessen und dann anhand der Formel r=sqrt(x^2 + y^2) den Abstand der Punkte zum Kreismittelpunkt berechnen, ist abs(r) größer als der Radius, liegt der Punkt ausserhalb Deines Suchkreises.
Aber garantiert gibts was effizienteres...
Re: Algorithmus für "geschlossene" Kreise
Ob Feld oder Pixel ist meiner Meinung nach egal. Oder sehe ich das falsch?tobo hat geschrieben:13.04.2018 17:38:07Mit Feld ist hier offensichtlich nicht Pixel gemeint, oder?
Stell Dir einfach eine Bilddatei vor mit 65536 mal 65536 Pixel oder eben ein Array
mit 65536 mal 65536 Feldern.
Ja, ich weiss, mit erklären hab ich es nicht so... Sorry...
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
Diesen Bereich kenne ich aber vorher nicht.eggy hat geschrieben:13.04.2018 17:45:42...erstmal den Bereich zu bestimmen, den ich nicht testen muss, d.h. alles ausserhalb eines Suchkorridors, der durch den Radius vorgegeben ist, ausschliessen
Als Beispiel:
Ich suchen den am nächsten liegenden Fundort.
Dann beginne ich mit dem Radius von 1 und suche die umgebenden Felder ab.
Finde ich nichts, wiederhole ich die Suche mit Radius 2 usw.
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
Kennst Du Deine Fundorte schon, und sind es "wenig genug"?
Dann ist es vielleicht einfacher die Distanz all Deiner Fundstellen zu berechnen, und dann alle Ergebnisse der Größe nach sortieren und die ersten x, die einen Abstand kleiner als r haben zurückzugegeben.
(Für mich hört sich das Ganze nach OSM-Daten an... liegen die Daten evtl in nem Postgres? Dann: die Geoerweiterungen solltenTM dazu bereits Funktionen haben)
Dann ist es vielleicht einfacher die Distanz all Deiner Fundstellen zu berechnen, und dann alle Ergebnisse der Größe nach sortieren und die ersten x, die einen Abstand kleiner als r haben zurückzugegeben.
(Für mich hört sich das Ganze nach OSM-Daten an... liegen die Daten evtl in nem Postgres? Dann: die Geoerweiterungen solltenTM dazu bereits Funktionen haben)
Re: Algorithmus für "geschlossene" Kreise
Ja, mit der Größe habe ich mich verlesen. Aber was ich grundsätzlich sagen wollte: Solange du nicht genauer sagst, was du suchst, kann dir niemand sagen, wie du es findest. Da ist die Entfernung zum Nichtfund erstmal sekundär. Du weißt doch offensichtlich, was du suchst - das muss sich doch irgendwie beschreiben lassen!?
Re: Algorithmus für "geschlossene" Kreise
Der Vorschlag mit dem Anpassen ist gut. Das war auch mein erster Gedanke.
Zum Verständnis: Das Problem mit dem Original-Algorithmus ist, dass es bei ihm im Bereich von 45° (und den entsprechenden Winkeln) zu Moiree-Mustern von nicht gesetzten Pixeln kommt, wenn man den Algorithmus in „1-Pixel-Schritten“ anwendet. Wobei die nicht gesetzten Pixel in Heinz' Fall nicht durchsuchten „Sektoren“ der Originalkarte entsprechen.
Den Bresenham-Algorithmus anzupassen wäre nicht sonderlich schwer, aber das „neue“ Problem mit einem angepassten Bresenham-Kreis ist, dass es viele doppelt gezeichnete Pixel gibt – in Heinz' Fall sind das doppelt behandelte Karten-Ausschnitte.
Gruß
Gregor
Zum Verständnis: Das Problem mit dem Original-Algorithmus ist, dass es bei ihm im Bereich von 45° (und den entsprechenden Winkeln) zu Moiree-Mustern von nicht gesetzten Pixeln kommt, wenn man den Algorithmus in „1-Pixel-Schritten“ anwendet. Wobei die nicht gesetzten Pixel in Heinz' Fall nicht durchsuchten „Sektoren“ der Originalkarte entsprechen.
Den Bresenham-Algorithmus anzupassen wäre nicht sonderlich schwer, aber das „neue“ Problem mit einem angepassten Bresenham-Kreis ist, dass es viele doppelt gezeichnete Pixel gibt – in Heinz' Fall sind das doppelt behandelte Karten-Ausschnitte.
Gruß
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
Re: Algorithmus für "geschlossene" Kreise
Nein leider nicht. Wie bereits oben erwähnt, ist die gesamte Karte nicht im Speicher oder auf Platte vorhandeneggy hat geschrieben:13.04.2018 17:58:48Kennst Du Deine Fundorte schon, und sind es "wenig genug"?
und deren Inhalt unbekannt.
Wenn ich den Inhalt eines Feldes wissen möchte, muss ich ihn erst mittels rand() berechnen.
Ich habe mal testweise die gesamte Karte (4294967296 Felder) durchsuchen lassen und bin auf ca. 21000000 Fundstellen gestossen.
(Hat fast 3 Stunden gedauert...)
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
Das ganze ist eine Sternenkarte eines Spiels.tobo hat geschrieben:13.04.2018 17:59:11Solange du nicht genauer sagst, was du suchst, kann dir niemand sagen, wie du es findest.
Jedes Feld ist ein Sektor in dem es entweder nichts oder ein Sonnensystem oder sonstwas (ein Raumschiff, ein Ereignis, ...) gibt.
Was in dem jeweiligen Sektor ist, ist vor der Berechnung (rand()) unbekannt.
Deshalb suche ich einen Algo. der, ohne Felder auszulassen, einen bestimmten Radius absucht.
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
'Ne Idee: „Zeichne“ Kreise mit immer größeren Radien, wobei die Schrittweite 5, 10 oder 20 ist. Den Bereich zwischen dem neuen und dem letzten Kreis durchsuchst Du dann mit einem missbrauchten Flood-Fill-Algorithmus.
Dann hättest Du das Problem mit den nicht gesetzten Pixeln erschlagen. Und wenn es mehrere Fundstellen gibt, behandelst Du die separat.
Das wär' doch was, oder ...
Gruß
Gregor
Dann hättest Du das Problem mit den nicht gesetzten Pixeln erschlagen. Und wenn es mehrere Fundstellen gibt, behandelst Du die separat.
Das wär' doch was, oder ...
Gruß
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
Re: Algorithmus für "geschlossene" Kreise
Ich verstehe den Zusammenhang zwischen finden von "Dingen" und dem Zeichnen von Kreisen nicht.
Das Finden von "Dingen" hört sich für mich nach dem typischen CAD-Problem an, wo man von der Cursorposition den nächsten Punkt fangen (snappen) will. Das Problem löst man aber nicht durch das Zeichnen von Kreisen sondern durch suchen von "Dingen" in einer geeigneten Datenstruktur, typischerweise KD-Bäume, Quadtrees oder Octrees.
Klar, man kann seine "Dinge" auch in eine große Pixelmatrix eintragen und die linear durchsuchen, das dauert halt schlicht viel zu lange.
Wenn es wirklich um das Zeichnen von Kreisen geht, dann würde ich den Kreis in ein n-Eck zerlegen und jede Kante des n-Ecks mit einer Antialiasingmethode zeichnen. Idealwerweise läßt man das die Graphikhardware machen, dann kann man mehrere Milliarden Pixel pro Sekunden zeichnen, mit einer 4-Kern CPU kommt man kaum über 200 Millionen Punkte pro Sekunde.
Naja, und was RAM angeht, was sind schon 65536 mal 65536 Pixel zu 3 Byte, wenn man 16GB RAM im Rechner hat?
Das Finden von "Dingen" hört sich für mich nach dem typischen CAD-Problem an, wo man von der Cursorposition den nächsten Punkt fangen (snappen) will. Das Problem löst man aber nicht durch das Zeichnen von Kreisen sondern durch suchen von "Dingen" in einer geeigneten Datenstruktur, typischerweise KD-Bäume, Quadtrees oder Octrees.
Klar, man kann seine "Dinge" auch in eine große Pixelmatrix eintragen und die linear durchsuchen, das dauert halt schlicht viel zu lange.
Wenn es wirklich um das Zeichnen von Kreisen geht, dann würde ich den Kreis in ein n-Eck zerlegen und jede Kante des n-Ecks mit einer Antialiasingmethode zeichnen. Idealwerweise läßt man das die Graphikhardware machen, dann kann man mehrere Milliarden Pixel pro Sekunden zeichnen, mit einer 4-Kern CPU kommt man kaum über 200 Millionen Punkte pro Sekunde.
Naja, und was RAM angeht, was sind schon 65536 mal 65536 Pixel zu 3 Byte, wenn man 16GB RAM im Rechner hat?
Re: Algorithmus für "geschlossene" Kreise
Der Unterschied zum CAD-Problem ist, dass man beim CAD-Problem die „Fundstellen“ (Gitterpunkte o.ä.) kennt. Heinz sucht aber so etwas wie den „nächsten Planeten der M-Klasse“. Dessen Position kennt er aber nicht.MSfree hat geschrieben:13.04.2018 18:27:40Ich verstehe den Zusammenhang zwischen finden von "Dingen" und dem Zeichnen von Kreisen nicht.
Das Finden von "Dingen" hört sich für mich nach dem typischen CAD-Problem an, wo man von der Cursorposition den nächsten Punkt fangen (snappen) will. Das Problem löst man aber nicht durch das Zeichnen von Kreisen sondern durch suchen von "Dingen" in einer geeigneten Datenstruktur, typischerweise KD-Bäume, Quadtrees oder Octrees.
Das ist allerdings ein guter Punkt.MSfree hat geschrieben:13.04.2018 18:27:40Naja, und was RAM angeht, was sind schon 65536 mal 65536 Pixel zu 3 Byte, wenn man 16GB RAM im Rechner hat?
Gruß
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
Re: Algorithmus für "geschlossene" Kreise
Danke für den Vorschlag!GregorS hat geschrieben:13.04.2018 18:25:47'Ne Idee: „Zeichne“ Kreise mit immer größeren Radien, wobei die Schrittweite 5, 10 oder 20 ist. Den Bereich zwischen dem neuen und dem letzten Kreis durchsuchst Du dann mit einem missbrauchten Flood-Fill-Algorithmus.
Die Idee ist gar nicht schlecht, man hätte keine "Leerräume" mehr.
Allerdings müsste man dann erst alle Felder in diesem Zwischenraum durchsuchen (berechnen) um danach den mit dem geringsten
Abstand finden zu können.
Mit der "Kreis-Mal-Methode" wäre die Anzahl der "nutzlos" berechneten Felder minimal da man, wenn gefunden,
direkt die Suche beenden kann.
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
Da schmeiße ich Dir mit Freuden einen 17-Tonnen-Container auf die Füße. *eg*heinz hat geschrieben:13.04.2018 18:43:23...
Allerdings müsste man dann erst alle Felder in diesem Zwischenraum durchsuchen (berechnen) um danach den mit dem geringsten
Abstand finden zu können.
...
Nimm einen Container, der nach der Entfernung zum Schiff sortiert. Wenn es mehrere Fundstellen gibt, befindet sich das gesuchte Ding an der ersten Position.
Gruß
Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])
Re: Algorithmus für "geschlossene" Kreise
Das Problem ist, dass die Datenstruktur eben nicht bekannt ist.MSfree hat geschrieben:13.04.2018 18:27:40Das Finden von "Dingen" hört sich für mich nach dem typischen CAD-Problem an, wo man von der Cursorposition den nächsten Punkt fangen (snappen) will. Das Problem löst man aber nicht durch das Zeichnen von Kreisen sondern durch suchen von "Dingen" in einer geeigneten Datenstruktur, typischerweise KD-Bäume, Quadtrees oder Octrees.
Wie schon mehrmals erwähnt ist die Datenstruktur nicht vorhanden, sie wird errechnet.
Ob in einem Feld/Sektor/Pixel/Wasauchimmer etwas ist oder nicht ist vor der Berechnung nicht bekannt.
Um es wie in einem CAD-Programm zu machen, müsste ich die Position aller Sterne kennen um den nächsten zu finden.
Das ist aber nicht der Fall und bei der Größe auch nicht so einfach möglich.
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
Bei meinem Testlauf kamen in der Karte über 21 000 000 Systeme heraus.MSfree hat geschrieben:13.04.2018 18:27:40Naja, und was RAM angeht, was sind schon 65536 mal 65536 Pixel zu 3 Byte, wenn man 16GB RAM im Rechner hat?
Bei einer größe von, sagen wir mal nur 500 byte pro System (Sterne, Planeten, Schiffe, Ressourcenfundstellen auf fast jedem Planet, ...), sind das schon über 10 Gbyte...
Auch würde die Erstellung der Karte eine halbe Ewigkeit dauern.
Deshalb kam ich ja auf die Idee es mittels rand() zu machen...
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
Dazu müsste ich aber doch auch erst alle Systeme berechnen/erstellen um sie in die Container legen zu können...GregorS hat geschrieben:13.04.2018 18:51:55Nimm einen Container, der nach der Entfernung zum Schiff sortiert. Wenn es mehrere Fundstellen gibt, befindet sich das gesuchte Ding an der ersten Position.
gruß heinz
Re: Algorithmus für "geschlossene" Kreise
Oh mann, was hab ich angerichtet...
Ich suche doch "nur" einen Algo. der einen Kreis ohne "Lücken" berechnen kann...
gruß heinz
Ich suche doch "nur" einen Algo. der einen Kreis ohne "Lücken" berechnen kann...
gruß heinz