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 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
static void Draw(PrintPageEventArgs e)
{
float angle = 45; // rotation trigonométrique vers la gauche
e.Graphics.RotateTransform(-angle); // ! sens trigo inversé
// segment vertical
var pv1 = new PointF(40F, 0);
var pv2 = new PointF(40F, 40F);
// si on dessine le segment il sera incliné à 45° si l'on se place selon le repère x,y
// et vertical selon x'y'
e.Graphics.DrawLine(Pens.Green, pv1.X, pv1.Y, pv2.X, pv2.Y);
// à présent si je souhaite utiliser mon repère x'y' comme base pour dessiner dans le repère xy
// je peux calculer les coordonées de pv1 et et pv2 en les situant dans xY mais en coordonées x'y'
pv1.Y *= -1; // est y négatif dans un repère trigonométrique
pv2.Y *= -1;
var pvr1 = GetRotatedPovCoord(pv1, angle);
var pvr2 = GetRotatedPovCoord(pv2, angle);
System.Console.WriteLine(pvr1 + " " + pvr2); // {X=21.01288, Y=-34.03614} {X=-13.02326, Y=-55.04902}
// si je dessine le segment dans le repère x'y' je devrais avoir un ligne verticale dans le repère xy
pvr1.Y *= -1; // en winform Y est opposé
pvr2.Y *= -1;
e.Graphics.DrawLine(Pens.Green, pvr1.X, pvr1.Y, pvr2.X, pvr2.Y);
e.Graphics.ResetTransform();
}
static PointF GetRotatedPovCoord(PointF point, float angle)
{
return new PointF
{
X = (float)(point.X * Math.Cos(angle) + point.Y * Math.Sin(angle))
,
Y = (float)(-1 * point.X * Math.Sin(angle) + point.Y * Math.Cos(angle))
};
} |
Partager