IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Dessin et rotation


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 55
    Points : 46
    Points
    46
    Par défaut Dessin et rotation
    Bonjour,

    Je souhaite dessiner du texte incliné sur une page lors d'une impression.

    La rotation fonctionne mais l'angle final n'est pas correct et je ne comprend pourquoi. Si je fais le dessin sur une feuille avec les valeurs obtenues par calcul, toutes les coordonnées sont correctes.

    Voici le code commenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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))
    		};
    }
    La première ligne que je dessine (dans le repère x'y') est bien inclinée à 45°
    Ensuite je calcule les coordonnées pour dessiner le même segment depuis le repère x'y' de manière à ce qu'il soit vertical dans le repère xy.
    Les calculs sont corrects (vérifié par dessin sur feuille etc)
    Mais le résultat que j'obtiens est un segment légèrement incliné de genre 55°... -> inclinaison : / au lieu de |

    Si vous pouviez m'éclairer...

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour
    les fonctions Math demandent des angle en radians :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Shared Function GetRotatedPovCoord(ByVal point As PointF, ByVal angle As Double) As PointF
            angle = Math.PI * angle / 180
            Return New PointF(CSng(point.X * Math.Cos(angle) + point.Y * Math.Sin(angle)), _
                              CSng(-1 * point.X * Math.Sin(angle) + point.Y * Math.Cos(angle)))
        End Function
    A traduire en C#

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 55
    Points : 46
    Points
    46
    Par défaut
    Bonjour Chrismonoye,

    Merci beaucoup ! C'est parfait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Dessiner avec rotation un bitmap
    Par Andry dans le forum Delphi
    Réponses: 6
    Dernier message: 04/05/2007, 15h15
  2. Dessiner des regions rectangulaires avec rotation
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 5
    Dernier message: 26/09/2006, 20h08
  3. [Graphic] Dessiner des hachures
    Par sylverspoon dans le forum 2D
    Réponses: 7
    Dernier message: 22/03/2006, 21h46
  4. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 22h58
  5. Réponses: 3
    Dernier message: 12/06/2002, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo