as tu compris mon shemat???
ben non ...
d correspond à quoi ???
dans les formules , il y a des vecteurs (L et N) ... mais comment je fais ça en C++??
Oui, je comprends, c'est pas compliqué non plus. Par contre, si je te donnais un angle varaible ce n'est pas pour rien, car sinon ta pointe va sans cesse pointer dans le même sens.
mon explication avec el calcul, te donne le calcul des coordonées du point lineStart, ce qui ce voit d'ailleurs.
il te suffit d'imaginer les triangles rectangles là où il faut et appliquer des sinus et des cosinus.
Encore plus simple si l'idée de faire de la trigo te pique les yeux : prends un angle (noté alpha sur mon schema) entre les lignes de la pointe et la ligne de la fleche egal a 45 degres, du coup, plus de sinus ni cosinus puisque tu te retrouves avec des lignes horizontales ou verticales :
là tu vois bien qu'en connaissant la position de la pointe, la position des autres points se déduit bêtement en ajoutant/soustrayant la longeur des lignes des pointes.
Après cela, je ne pourrais rien faire de plus pour toi.
Ben non justement , je ne vois pas ...
SI je demande c'est que je ne sais pas comment faire...
Comment je fais pour calculer les coordonnées des points "left" et "right" sachant que je connais la ligne qui va du point "LineStart" au point "LineStop" (point TOP sur le dernier dessin) ????????
Merci
d est la demi longueur en pixel de la base de ta flèche
h est la hauteur en pixel de ta flèche (je l'avais oublié)
L =B-A que tu normalise
Pour N, pose Nx =1 et resoud Lx+Ny*Ly =0 =>Ny =-Lx/Ly; puis tu la normalise.
Ceci te permet d'obtenir deux points :
N1 = B - h*L + d*N
N2 = B - h*L - d*N
Sert toi du dessin pour comprendre
Y as un exemple pour dessiner une horloge avec les QPainter :
http://qt.developpez.com/doc/3.3/aclock-example/
et exemple sur les cancas
http://qt.developpez.com/doc/3.3/canvas-example/
sérieusement, tu vois vraiment pas ?
on est bien d'accord qu'un point possède une abscisse x et une ordonnée y.
sur mon schema, Left est à la même ordonnée que Top, donc la composante y de Left est la même que Top, son abscisse, elle, est un peu en retrait, de la longeur de la ligne qui relie Top et Left. On a donc abscisse de Left = abscisse de Top - longeur de la ligne.
Imagine que ton point Top est situé en (500; 600) et que la longueur de la ligne est de 15 points, on aura les coordonnées de Left qui sont les suivantes (500-15; 600).
Pour le point right, tu remplaces tu raisonnes pareil en transposant sur l'axe vertical :
Right est à la même abscisse que top, et en dessous de lui d'une distance égale à la longueur de la ligne qui les sépare. on a donc Right (500;600+15)
Pourquoi j'ai mis +15 et pas -15 pour l'ordonnée ? car comme je t'ai dis, le coin haut gauche de ton écran est le coin (0;0), donc les ordonnées augmentent vers le bas !!
Oui j'avais compris mais ça c'est pour ton exemple de flèche...
Moi , il faudrait que ma flèche puisse s'orienter dans tout les sens donc ton exemple ne fonctionnera pas...
Si tu regarde l'exemple de la clock,
c'est moins compliqué.
Tu peut utiliser rotate, translate,.... sur le QPainter qui va dessiner ta flêche.
voici un exemple.
C'est fait avec le support de QT3 dans Qt4, Il faut donc que tu adapte le nom des class Qt
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 #include <Qt3Support> #include <QtGui> class myItem : public Q3CanvasLine { public : myItem(Q3Canvas * canvas ) :Q3CanvasLine(canvas) { } void drawShape ( QPainter & painter ) { //dessine la ligne avec Q3CanvasLine::drawShape Q3CanvasLine::drawShape(painter); //Calcul le vecteur B-A QPoint L = endPoint()-startPoint (); //distance double distance = sqrt((double)L.x()*L.x() +L.y()*L.y()); //sauvegarde l'etat du painter painter.save(); //initialise le pen painter.setPen(pen()); //position le painter pour que (0,0) correspond au point A painter.translate(startPoint()); //oriente la direction du painter painter.rotate(180./3.14159265*atan2((double)L.y(),(double)L.x())); //dessine la fleche painter.drawLine(distance,0,distance-10,10); painter.drawLine(distance,0,distance-10,-10); //restore l'etat du painter painter.restore(); } }; int main(int argc,char ** argv) { QApplication app(argc,argv); Q3CanvasView w(new Q3Canvas(800,600)); myItem *item = new myItem(w.canvas()); item->setPoints (10,10,100,200); item->setZ(1); item->show(); item = new myItem(w.canvas()); item->setPoints (100,200,0,200); item->setZ(1); item->show(); w.show(); return app.exec(); }
Merci beaucoup Mongaulois !
C'est exactement ce que je cherchais ...
Je te remercie énormément !
@ bientot
Pas tout à fait ...
Je n'ai pas trop compris le translate et le rotate ...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager