Laden...

Spiegeln einer Kontur entlang der X-Achse

Erstellt von oehrle vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.995 Views
O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 14 Jahren
Spiegeln einer Kontur entlang der X-Achse

Hallo,

gibt es eine Methode in GDI+ mit der man eine Kontur (mehrere Linien aneinander gereiht) entlang der X-Achse spiegeln kann? Hae mal recherchiert, aber nichts gefunden.

Gelöschter Account
vor 14 Jahren

meines wissen ist sowas nicht vorgefertigt zu finden. alleine eine kontur zu erkennen, ist für sich schon ein recht komplexer algorithmus. die spiegelung ist dann nur noch ein klax.

daher meine frage, sind die konturen bereits berechnet?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo oehrle,

kommt darauf an, wie du das genau meinst. Evtl. ist Graphics.Transform in Kombination mit Matrix.Scale (1, -1) was du suchst.

herbivore

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 14 Jahren
Spiegeln an der X-Achse

Also,

ich zeichne Geraden entlang der X-Achse. Da habe ich einen Button, wenn der gedrückt wird einEingabefeld für die neue X-Position angezeigt. Mit dem anderen Button kann ich einen Winkel und die nächste X-Position angeben. Somit kann ich ein Rotationssymmstrisches Teil entlang der X-Achse zeichnen. Es ist dann halt nur der halbe Körper gezeichnet. Um einen kompletten Körper anzuzeigen, müßte man diese Kontur (habe diese in einem GraphicsPath abgelegt) einfach nach oben spiegeln können. Hab das mal mit Matrix probiert, bin mir nicht sicher ob das aber korrekt ist.
Geht sowas überhaupt mit Transform und Matrix?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo oehrle,

ja, das geht wie in meinem letzten Beitrag beschrieben. Codebeispiele im Forum oder in der :rtfm: Doku.

herbivore

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 14 Jahren
Klappt nicht mit Spiegelung

Hallo herbifore,

danke für die Hilfe. Leider klappts noch nicht, mit der Spiegelung.

Laut Doku:

Die Matrix-Klasse bietet mehrere Methoden zum Erstellen einer zusammengesetzten Transformation: Multiply, Rotate, RotateAt, Scale, Shear und Translate. Im folgenden Beispiel wird die Matrix einer zusammengesetzten Transformation erstellt, die zuerst eine Drehung um 30 Grad, dann eine Skalierung um den Faktor 2 in yRichtung und anschließend eine Verschiebung um 5 Einheiten in xRichtung ausführt:

Matrix myMatrix = new Matrix();  
myMatrix.Rotate(30);  
myMatrix.Scale(1, 2, MatrixOrder.Append);  
myMatrix.Translate(5, 0, MatrixOrder.Append);  

BEi Scale müßte (2,-1 oder 2,1) stehen, um an der X-Achse zu spiegeln.
Ich habs in einem Panel getestet, da habe ich mir zuerst ein Fadenkreuz mittig eingezeichnet un dann probiert, die Linienkontur zu spiegeln. Geht aber nicht. Ich habe hie rmal den Code, vielleicht ist da auch was verbogen??


 private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics graph = e.Graphics;

            pen = new Pen(Brushes.Aquamarine, Width = 2);
            graph.DrawLine(pen, 1.0F, panel1.Height / 2.0F, panel1.Width, panel1.Height / 2.0F);

            fadenkreuz_X_start = new Point(0, panel1.Height / 2);
            fadenkreuz_X_end = new Point((panel1.Location.X + panel1.Width), panel1.Height / 2);
            //  fadenkreuz_Y_start = new Point(panel1.Location.X + Randabstand , 0);
            fadenkreuz_Y_start = new Point(Randabstand, 0);
            //  fadenkreuz_Y_end = new Point(panel1.Location.X + Randabstand, panel1.Height);
            fadenkreuz_Y_end = new Point(Randabstand, panel1.Height);

            stiftstärke = 2;
            stiftfarbe = Color.Blue;
            pen = new Pen(stiftfarbe, stiftstärke);
            pen.DashStyle = DashStyle.DashDot;

            // g.PageUnit = GraphicsUnit.Pixel;
            graph.DrawLine(pen, fadenkreuz_X_start, fadenkreuz_X_end);
            graph.DrawLine(pen, fadenkreuz_Y_start, fadenkreuz_Y_end);

            // Nullpunktverschiebung
            graph.TranslateTransform(Randabstand, panel1.Height / 2.0F);
            





            GraphicsPath graphicsPath = new GraphicsPath();

            graph.DrawLine(Konturform, 0,0,10,10);

            graphicsPath.AddLine(0,0,10,10);
            graph.DrawLine(Konturform, 10, 10, 35, 10);
            graphicsPath.AddLine(10, 10, 35, 10);
            graph.DrawLine(Konturform, 35,10,80,55);
            graphicsPath.AddLine(35,10, 80, 55);
        //    graph.DrawPath(Rohkörper,graphicsPath);

           


            Matrix myMatrix = new Matrix();
           // myMatrix.Rotate(30);
            myMatrix.Scale(2,-1, MatrixOrder.Append);
            
          //  myMatrix.Translate(25,25, MatrixOrder.Append);
            graph.Transform.Translate(0,0,MatrixOrder.Append);
           graph.DrawPath(new Pen(Color.DarkTurquoise,2), graphicsPath);


        }

Wieso klappt das nicht?

5.657 Beiträge seit 2006
vor 14 Jahren
  
            Matrix myMatrix = new Matrix();  
           // myMatrix.Rotate(30);  
            myMatrix.Scale(2,-1, MatrixOrder.Append);  
              
          //  myMatrix.Translate(25,25, MatrixOrder.Append);  
            graph.Transform.Translate(0,0,MatrixOrder.Append);  
           graph.DrawPath(new Pen(Color.DarkTurquoise,2), graphicsPath);  
  
  
        }  
  

Wieso klappt das nicht?

Wenn ich es richtig sehe, weist du deine myMatrix gar nicht zu...

Weeks of programming can save you hours of planning

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 14 Jahren
Funktioniert ! Danke

Funktioniert, hatte die Matrix nicht zugewiesen, Danke.