jytest
Messages postés314Date d'inscriptiondimanche 27 novembre 2005StatutMembreDernière intervention22 décembre 2014
-
14 déc. 2006 à 23:31
mortmen
Messages postés8Date d'inscriptionjeudi 1 janvier 2004StatutMembreDernière intervention15 août 2010
-
15 août 2010 à 16:52
Je n'arrive pas à dessiner un triangle dans une picturebox (pictriangle).
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 déc. 2006 à 08:15
J'ai décomposé pour que tu puisses mieux voir :
Private Sub Command1_Click()
pictriangle.AutoRedraw = True
pictriangle.DrawWidth = 5
Dim Ax As Single, Ay As Single, Bx As Single, By As Single, Cx As Single, CY As Single
Ax = 0
Ax = pictriangle.ScaleWidth / 2
Ay = 0
Bx = 0
By = pictriangle.ScaleHeight
Cx = pictriangle.ScaleWidth
CY = pictriangle.ScaleHeight
pictriangle.Line (Ax, Ay)-(Bx, By), vbRed
pictriangle.Line (Bx, By)-(Cx, CY), vbRed
pictriangle.Line (Cx, CY)-(Ax, Ay), vbRed
End Sub
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 15 déc. 2006 à 09:17
Arf, ton problème est tout simple mon cher...
Déjà, là, prends conscience que tu dessine à la manière du language LOGO made under TO7, c'est à dire, à la manière des années 80 [mdr], ou, pour être plus précis, de manière relative. Sais-tu que tu peux aussi tracer des lignes de manière absolue ??? J'imagine que oui, mais juste au cas où, voici la syntaxe à utiliser :
objet.LINE (point1_X, point1_Y)-(point2_X, point2_Y), color [, [B][F]]
OBJET étant un contrôle possédant la méthode Line tel que les Form, les PictureBox, ...
Les options B, BF tracent respectivement un carré ou un carré rempli de la couleur.
Pi il vaut mieux utiliser une "structure de donnée" pour stocker les coordonnées des points.
Exemple :
[Private/Public] Type typPoint
X As Long
Y As Long
End Type
pictriangle.CurrentX = 0
pictriangle.CurrentY = 0
'Tu traces une ligne de 0,0 à 160,230
pictriangle.Line -Step(160, 230), vbred
'Tu traces une ligne de 160,230 à -320,0
pictriangle.Line -Step(-320, 0), vbRed
pictriangle.Line -Step(160, -230), vbRed
DEUX CHOSES À SAVOIR :
- L'UNITÉ (de mesure) par défaut des contrôles VB sur lesquels tu peux dessiner (FORM, PICTUREBOX, ...) est en TWIPS et non en PIXELS !!! C'est une unité relative standard made by Crosoft pour garantir un affichage identique sous tous les types de supports (écrans, imprimante, ...). Généralement, 1 Pixel = 15 Twips (et inversement). Mais en réalité, le nombre de Twips par Pixels dépend des valeurs des propriétés "TwipsPerPixelX"
et "TwipsPerPixelY"
retournées par l'objet "Screen" (pour ton écran donc) :
Screen.TwipsPerPixelX
Screen.TwipsPerPixelY. Le plus simple, au lieu de tout convertir à chaque fois, est de paramétrer la propriété "ScaleMode" de ton objet. Scale = échelle, donc, c'est le mode de l'échelle utilisée (ce qui sous entend que l'échelle peut être personnalisée. Pour résoudre ton premier problème il faut soit régler cette propriété manuellement dans l'IDE (l'interface graphique) du VB, soit via cette ligne de code (avant les autres, dans l'initialisation de ton module, autrement dit, dans Form_Load de préférence) :
pictriangle.ScaleMode = vbPixels
(Note que vbPixels est une constante VB de valeur 3 )
- LE POINT 0,0. En effet, là tu dessines hors de l'écran !!! Le point 0,0 se trouve en haut à gauche de ta PictureBox et non, tel on en a l'habitude en maths, au centre de l'écran !!! Donc, avec tes valeurs négatives, tu dessines hors de la zone affichable. Il faut, tel le sous-entends JFMmarques, utiliser les Propriétés ScaleWidth et ScaleHeight de ton objet. Elles retourne la largeur et la hauteur de la zone dessinable DANS l'unité spécifiée via ScaleMode, le pixel en l'occurence !!!
'Définition de l'unité de l'échelle employée :
pictriangle.ScaleMode = vbPixels
'Centre horizontal de la zone de dessin :
Cx = pictriangle.ScaleWidth / 2
'Centre vertical de la zone de dessin :
Cy = pictriangle.ScaleHeight / 2
Enjoy
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 déc. 2006 à 11:28
Bon...
Ceci étant dit : tu as eu là de quoi dessiner le plus grand triangle isocèle inscriptible dans ta pictureBox
Tu a la liberté totale de dessiner d'autres triangles isocèles, mais alors :
"triangle isocèle" tout court ne signifie pas grand chose !
La manière la plus simple d'en définir un est de définir sa base BC (coordonnées des 2 extrémités de la base) et sa hauteur H (car il est évident que pour une même base, tu peux dessiner plusieurs triangles isocèles.
Un calcul arithmétique élémentaire te permet alors de déterminer les coordonnées du sommet A (abscisse (abscisse de C - abscisse de B)/2 et ordonnée ordonnée de B - H )
Ceci pour un triangle dont la base est parallèle à celle de ta pictureBox.
Pour un triangle "incliné", c'est un peu plus compliqué mais quelques notions de trigonométrie suffisent.
Amuse-toi bien.
Vous n’avez pas trouvé la réponse que vous recherchez ?
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 15 déc. 2006 à 16:24
Eh puis note également qu'il y a une API qui te les déssineront (les triangles quelconques) et peuvent même te les remplir... et même, te les remplir avec un dégradé !!!
est ton ami (cf. Poly)
Enjoy
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
mortmen
Messages postés8Date d'inscriptionjeudi 1 janvier 2004StatutMembreDernière intervention15 août 2010 15 août 2010 à 16:52
Salut ScSami,
Pourrait-on en savoir un peu plus sur ces API qui pourraient nous dessiner des triangles quelconques et qui peuvent même nous les remplir ?
ça m'intéresse !
Merci et bonne prog !!!