Autor Beitrag
IsNull
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: Mo 06.09.10 15:04 
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?


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 08.09.10 10:37 
Flippe die y-Achse für die Text-Ausgabe noch einmal?

_________________
>λ=
IsNull Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: 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.
Einloggen, um Attachments anzusehen!
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
2:
3:
            foreach (var FormElement in FormElements) {
                    FormElement.Geometry.Mirror(Axis.Y);
            }
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.

_________________
>λ=