PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kleine Frage zur Matrizenrechnung


Elemental
2010-11-12, 12:31:03
Hallo,
ich versuche gerade ein Objekt mittels GraphicPath zu zeichnen. Allerdings muss ich das Object manchmal auf dem Kopf stehend zeichnen, was ich mit Hilfe einer Matrixtransformation erreichen wollte.

internal override void Draw(Graphics g, Color color, Color backColor, double dOffsetX, double dOffsetY)
{
GraphicsPath path = new GraphicsPath();
path.AddArc(this.X + (float)dOffsetX, this.Y + (float)dOffsetY, this.Diameter, this.Diameter, this.StartAngle, this.SweepAngle);

Matrix matrixMirrorY = new Matrix();
matrixMirrorY.Translate(0f, (float)-m_dCenterY);
matrixMirrorY.Multiply(new Matrix(1f, 0f, 0f, -1f, 0f, 0f));
matrixMirrorY.Translate(0f, (float)m_dCenterY);
path.Transform(matrixMirrorY);

Pen pen = new Pen(color, (float)this.m_aperture.Width);
g.DrawPath(pen, path);
}


Das auf den Kopf drehen funktioniert zwar, aber das Object wird auch weit in Y-Richtung verschoben!
Sieht jemand, was an meiner Matrix falsch ist?

mfG
Elemental

instinct
2010-11-12, 18:37:12
Falsche Reihenfolge der Matrizen?

Elemental
2010-11-13, 09:42:43
Ich hab doch nur eine Matrix? Also mich mache erst die Verschiebung, damit das Objekt mittig auf der X-Achse liegt, also Y des Zentrums 0 ist. Dann Spiegelung an der X-Achse und dann wieder zurück verschieben an den ursprünglichen Y-Wert.

Was ich nicht verstehe:
Wenn z.B. m_dCenterY = 10, dann kommt am Ende in der Matrix eine Translation um -20 raus???

Ich sag doch einmal Translation um -10 und dann Tranlation um +10. Wie kommt der da auf -20?

mfG
Elemental

DocEW
2010-11-16, 10:15:04
Ich erinner mich, dass ich damals etwas mit MatrixOrder rumgespielt habe, bis alles so war, wie ich es mir vorgestellt hab.

Elemental
2010-11-16, 11:50:48
Habs inzwischen rausbekommen. Mein Problem war, dass das Graphics-Objekt schon eine Transformation hatte, die die Y-Achse nach oben gedreht hat. So gehts bei mir:

internal override void Draw(Graphics g, Color color, Color backColor, double dOffsetX, double dOffsetY)
{
//draw the arc using a GraphicPath, so we are able to specify a transform for this single drawing operation
GraphicsPath path = new GraphicsPath();
path.AddArc(this.X + (float)dOffsetX, this.Y + (float)dOffsetY, this.Diameter, this.Diameter, this.StartAngle, this.SweepAngle);

//create a matrix to mirror on x-axis, because "Graphics g" has y axis going up (instead of going down, which is default)
Matrix matrixMirrorY = new Matrix(1f, 0f, 0f, -1f, 0f, 2*(float)m_dCenterY);
path.Transform(matrixMirrorY);

Pen pen = new Pen(color, (float)this.m_aperture.Width);
g.DrawPath(pen, path);
}