Welche Pixellänge muß eine Linie haben um jedes Grad einer 360° Drehung der Linie ermitteln zu können?
-
Beispiel:
1 Linie der dicke 1 wird auf dem Bildschirm mittig dargestellt und dann in 1° Schritten gedreht und dargestellt.
Nun soll anhand der reinen darstellung ermittelt werden, bei wieviel Grad die Linie gerade steht.
Wie lange müßte die Linie dabei in Pixel mindestens sein, um alle Gradstellen genau ermitteln zu können?Bsp. wenn die Linie 2 Pixel lang ist, dann kann man folgende Winkel ermitteln:
0°, 45° und 90° sowie der spiegelkonforme Rest.Verlängert man die Linie um 3 Pixel, dann sind mindestens 7 Winkelstufen zwischen 0° und 90° ermittelbar.
Wie lange muß die Linue aber nun sein, um alle Winkel einer 360° Kreisdrehung ermitteln zu könenn?
-
Winkelrechnung schrieb:
Wie lange muß die Linue aber nun sein, um alle Winkel einer 360° Kreisdrehung ermitteln zu könenn?
ist das eine pfandfrage?
-
Nein, es ist keine Fangfrage.
-
Erläuterung:
Ich brauch das für nen Algo.
-
Hallo,
Winkelrechnung schrieb:
Wie lange muß die Linue aber nun sein, um alle Winkel einer 360° Kreisdrehung ermitteln zu könenn?
Das kann man sich ganz einfach ausrechnen.
Grüße
Erik
-
Wenn die Fläche, die die Linie bei den 360 Grad beschreibt, ein Kreis sein soll, muss sie verschiedene Längen (in Pixeln) haben, je nach Ausrichtung. Da Pixel quadratisch sind (meinetwegen auch rechteckig), ist die ihre Länge in der Diagonalen größer als in der waagerechten - daher ist eien Diagonale aus N Pixeln auch länger als eine Waagerechte oder Senkrechte aus N Pixeln.
Wenns ein Quadrat werden soll und die Länge der Linie, gemessen in Pixeln, immer gleich bleiben soll, ist die Aufgabe einfach: Zwischen der Diagonalen von links oben nach rechts unten und der Diagonalen von rechts oben nach links unten ist ein Winkel von 90 Grad, also 90 1-Grad-Schritte, die zweite Diagonale mit eingeschlossen. d.h. die Kantenlänge des Quadrats muss 91 sein, damit alle Schritte unterschiedliche Darstellungen haben. Also hat auch die Linie eine Länge von 91 Pixeln. Damit hast du 180 verschiedene Darstellungen, da man bei einer einfachen Linie nicht zwischen einer Stellung A und der Stellung A+180° unterscheiden kann.
-
Aber passt das auch an den ungünstigen Stellen (den Diagonalen)? Es geht ja nicht darum, dass es die nötigen 90 Zustände zwischen zwei Diagonalen gibt, sondern, dass auch immer genau ein Zustand pro Gradschritt angesprungen wird. Dazu müsste man die differentielle Positionsänderung pro Gradschritt ausrechnen und diese muss größer sein als eine Pixeldiagonale.
Das ist zwar nicht schwer zu rechnen, aber ich habe gerade leider keine Zeit dafür.
-
Ok, ich hab's mal ausgerechnet. Wenn du einen Kreis hast, muss der Radius (in Pixeln) größer als 360*sqrt(2)/(2*pi) sein, also mindestens 82 Pixel. Rechnung: Ein Gradschritt entspricht einem 360'stel des Umfangs, also 2*pi*R/360. Die größte Länge eines Pixels ist, wenn man diagonal durchgeht also sqrt(2)*Pixelbreite (quadratische Pixel vorausgesetzt). Wenn der Gradschritt größer ist als diese Länge, dann landet man auf jeden Fall nach jedem Schritt in einem neuen Pixel.
Das heißt nicht, dass es nicht auch mit einem kleineren Kreis geht. Die Umstände müssten schon sehr ungünstig sein, dass man wirklich die volle Pixeldiagonale als Schritt braucht. Aber mit 82 Pixeln Radius ist man auf der sicheren Seite für wirklich jeden Kreismittelpunkt (selbst nicht ganzzahlige Pixelkoordinaten als Mittelpunkt!).
Wenn man sich auf ganzzahlige Mittelpunktskoordinaten und Radien beschränkt würde ich die Mindestgröße durch ausprobieren herausfinden. Ein kleines Testprogramm dafür ist in Minuten geschrieben und kann in Sekundenbruchteilen alle Möglichkeiten kleiner als 82 Pixel mit Brute-Force durchprobieren.
-
unter der annahme das von jeder linie ein einziger einzigartiger pixel ausreicht um sie zu identifizieren.
hier die counter ausgabe
radius vs einzigartige punkte 10 0 11 0 12 2 13 6 14 4 15 2 16 3 17 2 18 4 19 2 20 6 21 7 22 6 23 4 24 4 25 1 26 8 27 4 28 13 29 8 30 9 31 22 32 35 33 44 34 46 35 54 36 42 37 54 38 44 39 48 40 50 41 52 42 72 43 62 44 66 45 66 46 70 47 75 48 86 49 82 50 84 51 88 52 88 53 88 54 88 55 88 56 88 57 88 58 88 59 90 60 90 61 90 62 90 63 90 64 90 65 86 66 90 67 90 68 90 69 90 70 90 71 90 72 90 73 90 74 90 75 90 76 90 77 90 78 90 79 90 80 90 81 90 82 90 83 90 84 90 85 90
-
64 90 65 86 66 90
Cool, dann war meine Rechnung doch nicht rein akademisch, es gibt tatsächlich Parametersätze bei denen die Pixelgrenzen so ungünstig liegen, dass nicht alle Punkte einzigartig sind.
-
[quote="SeppJ"]Ok, ich hab's mal ausgerechnet. Wenn du einen Kreis hast, muss der Radius (in Pixeln) größer als 360*sqrt(2)/(2*pi) sein, also mindestens 82 Pixel. Rechnung: Ein Gradschritt entspricht einem 360'stel des Umfangs, also 2*pi*R/360. Die größte Länge eines Pixels ist, wenn man diagonal durchgeht also sqrt(2)*Pixelbreite (quadratische Pixel vorausgesetzt). Wenn der Gradschritt größer ist als diese Länge, dann landet man auf jeden Fall nach jedem Schritt in einem neuen Pixel.
[/QOUTE]Die Aufgabe ist aber nicht, daß man in jedem Schritt in einem neuen Endpixel landen soll. Die Linie ist als gesamtes zu betrachten.
Bsp:
1. xx xxxx 2. xx xxxx
Linie 1 und 2 landen beide im gleichen Endpixel, aber dennoch drücken sie unterschiedliche Winkel aus.
-
Bsp:
1. xx xxxx 2. xxx xxx
Sorry, zu früh abgeschickt, so sollte es aussehen.
-
deswegen hab ich wohl ganz andere resultate, das haengt aber auch von vielen dingen ab die hier garnicht definiert wurden. z.b. rasterization rules bzw linien algorithm, selbst der rundungsmodus (die endpunkte sind ja nicht exakt auf pixelende liegend) kann das resultat um 10pixeleinheiten veraendern.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
rapso schrieb:
deswegen hab ich wohl ganz andere resultate, das haengt aber auch von vielen dingen ab die hier garnicht definiert wurden. z.b. rasterization rules bzw linien algorithm, selbst der rundungsmodus (die endpunkte sind ja nicht exakt auf pixelende liegend) kann das resultat um 10pixeleinheiten veraendern.
Ja, das wollte ich gerade auch schreiben. Wer fragt ob Line( 50 ); und Line( 51 ); zwei unterschiedliche Bilder liefern, der muss erstmal sagen, was Line() genau macht.
Ansonsten sehe ich auch den Sinn davon nicht einen Winkel in ganzzahligen Gradschritten auf dieses Art in eine Linie zu codieren. f'`8k
AutocogitoGruß, TGGC (Was Gamestar sagt...)