Entwickler-Ecke

Multimedia / Grafik - GDI/Drawing Koordinaten System Spiegeln - aber ohne Text


IsNull - Mo 06.09.10 15:04
Titel: GDI/Drawing Koordinaten System Spiegeln - aber ohne Text
Hallo,

Ich bin gerade mit dem GDI (System.Drawing) Koordinatensystem auf Kriegsfuss.

Ich rendere (= x,y Koordinaten berechnen) meine Geometrische Form und zeichne sie danach über das Graphics Objekt in ein Bild.

In GDI/System.Drawing ist das Koordinatensystem allerdings an der y Achse gespiegelt, und daher stimmen oben/unten bez. links/rechts nicht.

Ich dachte mir, na was solls, transformiere ich halt das Koordinatnsystem mit der y Flip Matrix (1, 0, 0, -1, 0, 0) und verschiebe den Koordinaten-Ursprungspunkt in die untere linke Ecke, und meine Linien/bögen wurden korrekt gezeichnet.

Nur leider steht nun der Text auf dem Kopf o.0, was nach kurzem Nachdenken auch ganz verständlich war.


Meine Frage:

Wie gehe ich es am besten an, dass ich meine Figuren richtig zeichnen kann? Ich möchte nur sehr ungern bei meinen Koordinaten Berechnungen überall y * -1 rechnen... Was ist der eleganteste Weg?



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
        public void RenderForm() {

            if (!IsInitialized)
                return;

            if (FormFrame == null)
                return;

            using (var G = Graphics.FromImage(FormFrame)){

                G.SmoothingMode = SmoothingMode.AntiAlias;
                G.Clear(FORM_BACKGROUND_COLOR);
                G.Transform = Common.FlipY; // (1, 0, 0, -1, 0, 0)
                G.TranslateTransform(0, -FormFrame.Size.Height);


                // Draw the figure
                foreach (var FormElement in FormElements) {
                    try {
                        FormElement.Geometry.Draw(G);
                    } catch (Exception) {
                        return;
                    }
                }
            }
        }


Kha - Mi 08.09.10 10:37

Flippe die y-Achse für die Text-Ausgabe noch einmal?


IsNull - Mi 15.09.10 08:24

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Flippe die y-Achse für die Text-Ausgabe noch einmal?

Wenn ich die Transformation für den Text einfach ausschalte, also y wieder spiegeln und Ursprungspunkt wieder nach oben verschiebe, dann wäre der Text zwar gerade, hätte dann aber die falsche Position, siehe Anhang. ;)
Durch das flippen stimmt die Y Koordinate - ich müsste nur den Text gespiegelt zeichnen lassen können, dann würde es wieder passen.

Aktuell habe ich es so gelöst:
Ich musste sowieso ein Spiegeln des Formenobjektes implementieren, und nun spiegle ich das Formenobjekt einfach, bevor ich es in den Renderer lade, das scheint mir am saubersten, da ich eine einzige Codezeile zum spiegeln des Formenobjektes benötige, und ansonsten keine Änderungen am Rendering machen muss.


Greenberet - Mi 15.09.10 09:13

wie wäre es, wenn du statt Y einfach Height-Y schreibst( Kannst ja eine Methode dafür verwenden die dir die Position umrechnet )
du musst nix Transformieren, wodurch Nebeneffeckte wie das mit dem Text keine Probleme mehr machen( Bilder würde nauch verkehrt dargestellt werden bei deiner Variante ).


IsNull - Mi 15.09.10 09:54

Naja das Height-Y ist so eine Sache, ich habe die Geometrie/Draw Körper völlig lose vom Rest.

(Ich hab Linien/Bögen usw. die alle ein gemeinsames Interface teilen, neben Kollisions erkennung gibts da auch das IGeometry.Draw(Graphics g), und ich möchte ungern das ganze mehr kuppeln, da es ein solides FrameWork darstellt.

Was ich aber evtl. mache, ist dem IGeometry Interface ein neue Methode; Mirror(X/Y) zu spendieren, dann kann ich das einigermassen sauber lösen.

So würde ich dann einmalig alle Geometrie-Objekte spiegeln

C#-Quelltext
1:
2:
3:
            foreach (var FormElement in FormElements) {
                    FormElement.Geometry.Mirror(Axis.Y);
            }


Kha - Mi 15.09.10 18:54

user profile iconIsNull hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich die Transformation für den Text einfach ausschalte, also y wieder spiegeln und Ursprungspunkt wieder nach oben verschiebe, dann wäre der Text zwar gerade, hätte dann aber die falsche Position, siehe Anhang. ;)
Nein, ich dachte an das zweite Flippen als allerletzte Transformation vor der Textausgabe. Wenn du erst die Translation um (0,30) durchführst, dann flippst und einfach auf (0,0) zeichnest, verschiebt sich nichts.