Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Welche Kästchen werden von Linie geschnitten?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.07.2005, 16:21 Uhr
~TerryB
Gast


Hi,

ich habe mir selbst eine Aufgabe überlegt, um Algorithmik üben zu können. Stellt euch vor, ihr habt ein kariertes Blatt Papier vor euch liegen. Irgendwo auf diesem karierten Blatt Papier ist der Nullpunkt (0,0). Ein Kästchen ist z.B. 10x12 Einheiten groß.
Nun zieht eine beliebige Linie auf dieses Blatt.
Bemerkung: normalerweise sind Kästchen auf einem karierten Blatt ja quadratisch. Diese Kästchen dieses Algorithmus sollen aber theoretisch auch rechteckig sein können.
Die Kästchen möchte ich durch einen x,y-Index angeben, der bezogen ist auf den Nullpunkt. Der Nullpunkt ist das Kästchen (0,0). Das Kästchen z.B. direkt unter dem Nullpunkt ist (0,1).
Je weiter es auf dem Blatt Papier nach unten geht, desto grösser wird der y-Wert. Je weiter es nach rechts geht, desto größer wird der x-Wert.

Wie würdet ihr nun in C ermitteln, welche Kästchen durch diese Linie geschnitten werden?

Ich habe schon einen eigenen Ansatz. Er erscheint mir aber sehr ineffizient und ich bin mir nicht sicher, ob alles abgedeckt wird. Außerdem gilt er nur unter folgender Annahme:

Hier gehe ich davon aus, dass die Linie von links oben nach rechts unten verläuft und dass die Linie immer ein Kästchen durchläuft das darunter liegt. Und das klappt ja nicht. Denn die Linie könnte ja auch ein Kästchen durchlaufen, dass daneben liegt.
Mein Ansatz ist deshalb nur teilweise richtig.

1.) Steigung der Linie berechnen.

m = abs(Anfangspunkt_y-Endpunkt_y)/(Anfangspunkt_x-Endpunkt_x);

2.) Kästchenindex des gegebenen Anfangs- und Endpunktes berechnen.

Kaestchenindex_x = Anfangspunkt_x/Kaestchenbreite;
Kaestchenindex_y = Anfangspunkt_y/Kaestchenhoehe;
/* bei beiden Berechnungen Nachkommastelle abschneiden, da von 0 an gezählt wird */
/* dasselbe für den Endpunkt */

3.) Linie in Richtung Anfangspunkt verlängern, bis sie eine Kästchengrenze berührt.

offset_kaestchengrenze_oben = Anfangspunkt_y mod Kaestchenbreite;
Schnittpunkt_y = Anfangspunkt_y - offset_kaestchengrenze_oben;
/* m = abs(Schnittpunkt_y-Anfangspunkt_y)/Schnittpunkt_x-Anfangspunkt_x) nach Schnittpunkt_x auflösen */

Schnittpunkt_x = abs(Schnittpunkt_y-Anfangspunkt_y)/m + Anfangspunkt_x;

4.) Vom Schnittpunkt aus nun immer über die Kaestchenhöhe weiter gehen und über Steigung und den neuen y-Wert den passenden x-Wert ausrechnen.
Danach wie in 2.) den Kaestchenindex davon berechnen.

5.) Dies tun bis Endpunkt erreicht ist.

Ich bin wirklich schon auf Tipps von euch gespannt, wie man diesen Algorithmus schön lösen kann, so dass er wirklich für alle Linien gilt, egal wie sie liegen.

Vielen Dank schonmal im Voraus für eure Tipps

TerryB
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.07.2005, 16:30 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich würde einfach den Bresenham-Algorithmus benutzen

EDIT: Deine "Erweiterung", daß die Kästchen nicht zwingend quadratisch sein müssen, ist meiner Meinung nicht wirklich zu beachten, weil wenn das Verhältnis von y/x in den Kästchen !=1 ist, ist die Steigung der Graden einfach nur mit x/y zu plutimizieren.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 07.07.2005 um 16:33 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.07.2005, 17:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von virtual:
plutimizieren


ui solche wortschöpfungen kennt man gar nicht von dir
--
class God : public ChuckNorris { };

Dieser Post wurde am 07.07.2005 um 17:21 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.07.2005, 18:39 Uhr
virtual
Sexiest Bit alive
(Operator)


Ist ja auch nicht von mior, sondern Astrid Lindgren
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.07.2005, 08:57 Uhr
~TerryB
Gast


Hallo,

danke für den Tip mit dem Algorithmus. Aber er ist, wenn ich es richtig verstanden habe nicht ganz das, was ich brauche. Denn er versucht aus Anfangs- und Endpunkt einer Gerade diese möglichst geschickt zu rastern. Was ja toll wäre, wenn man eine Gerade zeichnen möchte.

Wenn ich mir z.B. das untere Bild auf der folgenden Seite anschaue:
www.iam.unibe.ch/~fcglib/special_www/cg_lecture/lectContent/rastergraphics/lessons/line/line_theory_intro.php

Dann sehe ich hier, dass die Gerade auch Kästchen durchläuft, die nicht farbig markiert sind. Und ich möchte ja alle Kästchen haben, die von der Gerade durchlaufen werden.

Gruß

TerryB
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.07.2005, 09:16 Uhr
~TerryB
Gast


Hi,

mein eigentliches Ziel ist es ein beliebiges Rechteck in ein Raster zu legen. Und zu bestimmen, welche Kästchen darin liegen. Ein Kästchen sollte dabei halt nicht 1 Pixel groß sein, sondern z.B. 10x12 Pixel groß sein. Und micht interessiert dann nur welche Kästchen und nicht welche Pixel im Einzelnen darin liegen. Wie schon gesagt, möchte ich, dass der Nullpunkt beliebig platziert werden kann und das y-Werte, die nach unten laufen größer werden und x-Werte nach rechts größer werden.
Ich hatte zuerst nur nach der Linie gefragt, da ich vorhatte erst alle Kästchen der Grenzlinien zu bestimmen. Und dann die Inneren Kästchen des Rechtecks zu ermitteln.
Vielleicht habt ihr mir hier ein paar Tips.

Danke schonmal im Voraus

TerryB
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.07.2005, 14:27 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Ist ja auch nicht von mior, sondern Astrid Lindgren


Das 3er Komplement aber nicht
was passiert eigentlich wenn man eine zahl in 3er Komplement darstellung mit einer in 4711er Darstellung plutimiziert? (wenn eine von beiden 69er wäre käme vermutlich immer ne Sauerei raus)
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 08.07.2005 um 14:27 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: