Make + y UP, Move Origin C # System.Drawing.Graphics
-
06-07-2019 - |
Pregunta
Quiero que el origen esté en el centro de mi ventana.
______________ | ^ | | | | | o----->| | | |____________|
.NET quiere que esté en la esquina superior izquierda.
_____________> | | | | | | | | V____________|
Dot net y yo estamos tratando de llevarnos bien ...
¿Alguien sabe cómo hacer esto en C # simplemente usando el objeto Graphics?
Graphics.TranslateTransform no lo hace, ya que deja las coordenadas invertidas. Combinar este Graphics.ScaleTransform (1, -1) tampoco es satisfactorio ya que eso hace que el texto aparezca al revés.
Solución
Una solución sería usar la propiedad TranslateTransform. Luego, en lugar de usar las estructuras Point / PointF, puede crear sus propias estructuras FlippedPoint / FlippedPointF que tengan conversiones implícitas en Point / PointF (pero al emitirlas, las coordenadas se voltean):
public struct FlippedPoint
{
public int X { get; set; }
public int Y { get; set; }
public FlippedPoint(int x, int y) : this()
{ X = x; Y = y; }
public static implicit operator Point(FlippedPoint point)
{ return new Point(-point.X, -point.Y); }
public static implicit operator FlippedPoint(Point point)
{ return new FlippedPoint(-point.X, -point.Y); }
}
Otros consejos
Puede continuar usando ScaleTransform (1, -1)
y restablecer la transformación actual temporalmente mientras dibuja su texto:
// Convert the text alignment point (x, y) to pixel coordinates
PointF[] pt = new PointF[] { new PointF(x, y) };
graphics.TransformPoints(CoordinateSpace.Device, CoordinateSpace.World, pt);
// Revert transformation to identity while drawing text
Matrix oldMatrix = graphics.Transform;
graphics.ResetTransform();
// Draw in pixel coordinates
graphics.DrawString(text, font, brush, pt[0]);
// Restore old transformation
graphics.Transform = oldMatrix;
Intente crear el objeto gráfico con una altura negativa. No conozco específicamente la biblioteca de C #, pero este truco funciona en versiones recientes de GDI.