Accueil > Forum > > > > Collision avec l'intérieur d'une shape
Collision avec l'intérieur d'une shape
dimanche 18 février 2007 à 17:55:51 |
Collision avec l'intérieur d'une shape

le pro masterchief
|
Bonjour, je dois créer une animation de boule qui rebondissent ensemble dans un shape, les balles doivent rebondir sur les paroie intérieure d'une shape ovale. J'avoue que je ne sais pas vraiment comment m'y prendre. Pour les collision entre les boule ça je suis capable mais pas avec la shape. Les boule sont des picturebox et je suis sous vb6 Merci de m'aider.
|
|
dimanche 18 février 2007 à 18:22:20 |
Re : Collision avec l'intérieur d'une shape

jmfmarques
|
Bonjour,
S'agissant d'une Shape (qui est un contrôle inerte) , je ne vois pas d'autres ressources qu'un calcul trigonométrique, fait sur les bases suivantes :
- tu connais les coordonnées x et y du centre d'une balle - la construction de ta forme ovale devrait par ailleurs te permettre d'en établir l'équation de courbe - le rayon de la boule devrait te permettre de définir une 2ème courbe ovale, invisible, concentrique avec la première et à une distance de celle-ci (vers l'intérieur) égale au rayon de la boule... et d'en déterliner l'équation.
Il te faut ensuite, bien entendu, déterminer si le centre de ta boule coincide avec un point de cette dernière courbe.
Comme tu le vois, il s'agit avant tout d'un problème mathématique (trigonométrie). Ce n'est que lorsque tu auras résolu ce problème (équations et comparaisons) sur papier que tu pourras commencer à parler de VB.
Il te faut donc nécessairement commencer par l'établissement de la deuxième équation puis par établir le raisonnement mathématique relatif à la vérification de ce qu'un point coincide ou non avec la courbe représentant cette équation.
Puis (et seulement alors) aller vers VB pour écrire tout celà Nous t'y aiderons lorsque tu auras passé cette étape purement trigonométrique.
|
|
dimanche 18 février 2007 à 18:37:21 |
Re : Collision avec l'intérieur d'une shape

jmfmarques
|
Il reste que si tu n'utilisais pas une "Shape" et que tu acceptais de la remplacer par une ellipse (mais ce serait alors une ellipse et pas un ovale), les choses seraient largement facilitées (utilisation des fonctions PtInRect , PtInRegion, SetPixelV et CreateEllipticRgnIndirect de la librairie Lib gdi32 de l'Api de Windows, accompagnées de la fonction SetRect de la librairie user32 Car tout celà t'éviterait de longs calculs trigonométriques
|
|
dimanche 18 février 2007 à 18:49:13 |
Re : Collision avec l'intérieur d'une shape

jmfmarques
|
Mais si tu es débutant et non encore à l'aise avec l'utilisation des fonctions de l'Api de Windows, tu peux chercher une astuce de remplacement ...
En voilà une :
1) en lieu et place d'une Shape, dessiner ton ovale dans une couleur de remplissage identificatrice (soit sur ta Form, soit dans une PictureBox 2) ajouter aux coordonnées x et y du centre de la boule la valeur de son rayon 3) verifier que le pixel correspondant aux valeurs ainsi obtenues est bien de la couleur prédéfinie (et alors la boule est à l'intérieur) ou, au contraire, d'e la couleur de l' "entourage" (et alors la boule est à l'extérieur). La fonction Point de VB te permet de relever la couleur d'un pixel...
(astuce à cent sous...mais bonne)
Rien, de surcroît, ne t'empêche de ne faire varier que d'un point une seules des composantes RGB, de telle façon que bul ne saurait voir la différence entre le remplissage de ton ovale et la couleur qui l'entoure (on n'en verrait que la bordure).
Pour dessiner cet ovale : fonction Circle de VB
|
|
dimanche 18 février 2007 à 20:45:19 |
Re : Collision avec l'intérieur d'une shape

le pro masterchief
|
Ok merci je vais y penser. Je vais plus me trourner vers la fonction circle. Sachez que je ne suis pas débutant. A+
|
|
dimanche 18 février 2007 à 20:54:40 |
Re : Collision avec l'intérieur d'une shape

jmfmarques
|
Reviens si tu n'y parviens pas ! En nous montrant toutefois ce que tu as essayé ...s'il te plait Sache simplement que je viens de m'amuser à vérifier la faisabilité du "truc" (le dernier exposé) et... j'y suis très rapidement parvenu sans problèmes. J'ai juste ajouté un autre petit "truc jmfien" (que tu devrais également trouver facilement car il ne fait appel à aucune connaissance de VB mais au seul mécanisme de la pensée) pour éviter des vérifications et des calculs ralentisseurs (qui ne seraient pas les mêmes en fonction du sens de déplacement de la boule). Le tout demande environ 8 minutes de concentration, pastis en main 
|
|
dimanche 18 février 2007 à 22:02:23 |
Re : Collision avec l'intérieur d'une shape

jmfmarques
|
Bon... une heure, c'est beaucoup pour si peu... et je commence à avoir sommeil, là...
Allez, on va bâcler et boucler cette "affaire :
Une form Form1 Sur ta form : une picturebox nommée picture1 et un Timer Timer1 A l'intérieur de ta Form : une shape nommée boule
Code :
Private Sub Form_Activate() Me.Move Screen.Width / 3, Screen.Height / 3, Screen.Width / 3, Screen.Height / 3 With Picture1 .Move 0, 0, 5000, 5000 .BackColor = RGB(255, 255, 254) .AutoRedraw = True .FillColor = RGB(255, 255, 255) .FillStyle = 0 End With Timer1.Enabled = True Picture1.Circle (2000, 2000), 1500, RGB(255, 0, 0), , , 1.5 boule.Move 2500, 1500, 300, 300 Timer1.Interval = 10 End Sub Private Sub Timer1_Timer() boule.Move boule.Left - 3, boule.Top + 2 If boum(Picture1, boule, vbWhite) Then Timer1.Enabled = False MsgBox "boum" Exit Sub End If End Sub Private Function boum(controle As PictureBox, maboule As Shape, couleur As Long) As Boolean X1 = maboule.Left + (maboule.Width / 2) Y1 = maboule.Top X2 = maboule.Left + maboule.Width Y2 = maboule.Top + (maboule.Height / 2) X3 = X1 Y3 = Y1 + maboule.Height X4 = maboule.Left Y4 = Y2 If controle.Point(X1, Y1) <> couleur Then boum = True: Exit Function If controle.Point(X2, Y2) <> couleur Then boum = True: Exit Function If controle.Point(X3, Y3) <> couleur Then boum = True: Exit Function If controle.Point(X4, Y4) <> couleur Then boum = True End Function
Bonne nuit.
|
|
lundi 19 février 2007 à 14:07:38 |
Re : Collision avec l'intérieur d'une shape

jmfmarques
|
Plus là !!!
Bon ... Tiens donc, ami :
Si tu es capable de comprendre ce mécanisme (que tu dois lancer et attendre la sortie de la boule.... ), tu es apte à traiter de collisions et de confinements... Si tel n'est pas le cas, laisse tomber...
Private versgauche As Integer, versdroite As Integer, sensx As Single, sensy As Single, kx As Single, ky As Single Private Sub Form_Activate() Randomize Me.Move Screen.Width / 3, Screen.Height / 3, Screen.Width / 3, Screen.Height / 3 With Picture1 .Move 0, 0, 5000, 5000 .BackColor = RGB(255, 255, 254) .AutoRedraw = True .FillColor = RGB(255, 255, 255) .FillStyle = 0 End With Timer1.Enabled = True Picture1.Circle (2000, 2000), 1500, RGB(255, 0, 0), , , 1.5 boule.Move 2100, 700, 300, 300 Timer1.Interval = 20 versgauche = 120 vershaut = 120 sensx = -1 sensy = 1 kx = 1.3 ky = 1.5 End Sub Private Sub Timer1_Timer() boule.Move boule.Left + (versgauche + kx) * sensx, boule.Top + (vershaut + ky) * sensy DoEvents If boum(Picture1, boule, vbWhite) Then While boum(Picture1, boule, vbWhite) boule.Move boule.Left - Int((versgauche + kx) * sensx / 10), boule.Top - Int((vershaut + ky) * sensy / 10) DoEvents Wend sensx = -sensx sensy = sensy kx = Int((2 * Rnd) + 1) / 10 ky = Int((20 * Rnd) + 1) ' / 3 End If End Sub Private Function boum(controle As PictureBox, maboule As Shape, couleur As Long) As Boolean X1 = maboule.Left + (maboule.Width / 2) Y1 = maboule.Top X2 = maboule.Left + maboule.Width Y2 = maboule.Top + (maboule.Height / 2) X3 = X1 Y3 = Y1 + maboule.Height X4 = maboule.Left Y4 = Y2 If controle.Point(X1, Y1) <> couleur Then boum = True: Exit Function If controle.Point(X2, Y2) <> couleur Then boum = True: Exit Function If controle.Point(X3, Y3) <> couleur Then boum = True: Exit Function If controle.Point(X4, Y4) <> couleur Then boum = True End Function
|
|
lundi 19 février 2007 à 22:26:44 |
Re : Collision avec l'intérieur d'une shape

le pro masterchief
|
Ok merci j'ai remplacé cela par des picture box ayant la même apparence qu'une ligne.
Avec quatre picture box jai formé un rectangle. Le picturebox du haut en forme de ligne ce nomme donc "haut" celui en bas "bas" et même chose pour la gauche et la droite.
Pour l'instant je fais uniquement rebondir les boule dans la boîte et non les boules entre eux.
Dim trajetX(70) As Long 'représente le nombre de left qui est incrémenter (un peu comme la vitesse)
Dim trajetY(70) As Long 'représente le nombre de top qui est incrémenter (un peu comme la vitesse)
'Dans le form load j'attribue une trajectoire aléatoire à chaque boule
For i = 1 To 70 Randomize trajetX(i) = Int(Rnd * 200) - 200 picboule(i - 1).Left = picboule(i - 1).Left + trajetX(i) Randomize trajetY(i) = Int(Rnd * 200) - 200 picboule(i - 1).Top = picboule(i - 1).Top + trajetY(i) Next i
'J'anime les boule et les fait rebondir avec la boite j'ai en tout 70 boule index de 0 à 69 'la fonction collision renvoi true si les deux controle en argument se touche For i = 1 To 70 DoEvents
picboule(i - 1).Left = picboule(i - 1).Left + trajetX(i) picboule(i - 1).Top = picboule(i - 1).Top + trajetY(i) If Collision(picboule(i - 1), gauche) = True Or Collision(picboule(i - 1), droit) = True Then trajetX(i) = -trajetX(i) If Collision(picboule(i - 1), haut) = True Or Collision(picboule(i - 1), bas) = True Then trajetY(i) = -trajetY(i)
Next i
Mais je veux aussi faire rebondir les balles entre eux mais j'ai un problème parce que jusque là jai tester la colision d'objet bien différent étant le rectangle et les boule mais pour les boule entre eux c'est plus difficile. J'avais pensé faire une boucle imbriqué que je testerai la collision de deux boule mais ça na pas marché. Si possible rester avec la fonction Collision(controle1 as control,controle2 as control) car elle est très simple. Merci
|
|
lundi 19 février 2007 à 22:51:26 |
Re : Collision avec l'intérieur d'une shape

jmfmarques
|
Le principe que je t'ai montré est valable dans tous les cas de figure : boule contre paroi, boule contre boule (les 2 se déplaçant ou pas...) puisque tu ne te sers que de la différence de couleurs pour savoir s'il y a collision ! Et tu pourrais même faire bouger la paroi (celà ne changerait absolument rien au principe !). Si tu étais astucieux, tu pourrais même te servir de l'une des composantes R,G,B de tes boules pour savoir laquelle a été frappée  Mais, comme tu le vois, tout celà n'a rien à voir avec VB à proprement parler mais tout avec la seule agilité de ta pensée ... pour déterminer une stratégie... Je te conseille vivement de tracer un cercle au sol, d'y faire "circuler" des billes, de raisonner... et d'en tirer les meilleures conclusions. Aucun code informatique, dans quelque langage que ce soit, ne t'affranchira de cette précieuse étape. Restera ensuite, par contre, à calculer la nouvelle trajectoire de chaque boule après collision, suivant l'angle de collision, le(s) point(s) (car il y en a 2) de collision, la force de la collision en fonction de(s) vitesse(s) d'une boule contre la paroi ou de 2 boules s'entrechoquant, les effets de "ripping" induits en fonction des points de collision, etc... J'espère que tu es très fort en mathémétiques, en cinétique et en dunamique. Un "détail" : à moins que tes boules ne soient supposées avoir toutes le même poids, les mêmes dimensions et être faîtes dans la même matière, ces poids, dimensions et matuères devront également entrer en ligne de compte, ainsi que la nature supposée de leur plan d'évolution (sur du sable, ce n'est pas la même chose que sur du verre, par exemple, et ce ne sera pas non plus la même chose sur du feutre et sur du lin...) et la résistance à la déformation des parois de la "boîte". Bon travail...
|
|
Cette discussion est classée dans : shape, collision, intérieur, boule
Répondre à ce message
Sujets en rapport avec ce message
Groupe de controle [ par TwakVB ]
Bonjour, je voudrais savoir si cela est possible. J'ai un picturebox, avec un shape a l'intérieur et je voudrais qu'à chaque fois que j'appuis sur un
rst hiérarchiques et commande SHAPE [ par orthodocs ]
Bonjour, Ci dessous, je lie différentes tables par la Commande Shape (Base de donnée Access2000 e VB6.0). La syntaxe de ma commande Shape semble corre
Problème con ... [ par MaxSoldier ]
Bonjours, Voici mon problème :Je n'arive pas a mettre un Shape au dessus d'un filelistbox. C'est à dire que l'on ne le voit pas. J'ai fait bring to fr
redimensionner une shape [ par SofieV ]
Bonjour,j'ai un petit souci concernant la modification de shapes (ici des graphes) sous Excel...Les graphes sont crées en automatique ...le problème e
MSH FlexGrid -> Insertion d'un shape dans une cellule ? [ par Afyn ]
Est il possible d'insérer un objet shape ou un label dans une cellule d'un Hierachical Flex Grid ?A+AfynNavedac
Problème de Shape dans une feuille Excel [ par BeebopMcFly ]
Voila mon problème, j'utilise VBA sous excel pour visualiser mes onglets excelJ'ai un userform qui permet de visualiser l'onglet sélectionner à traver
passage d'une collection en argument [ par mb95 ]
bonsoir !J'ai un probleme avec un passage d'arguments. Le programmecontient 3 collections de shapeshape1(index de 0 a 6).shape2 (index de 0 a 6).shape
Saisir à l'intérieur d'un listview en mode report [ par XWinnieX ]
Hello !!!J'aimerais savoir s'il est possible de saisir des données dans un listview en mode report car je trouve l'affichage beaucoup plus conviviale
Ado Shape Append [ par kLuxiWare ]
J'ai créé une base de données avec deux tables liées.Je crée un recordset par ADO avec la méthode Shape Append.J'ai récupéré la table parent à travers
contrôle de shape [ par Acolyte ]
Salut !J'aimerais savoir comment rendre une shape cliquable.j'ai tester le code suivant mais il marche pasPrivate Sub shape_click()EndEnd Sub<br
Livres en rapport
|
Derniers Blogs
[HTML5] SLIDES ET DéMOS : AUTOUR DU W3C , NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] SLIDES ET DéMOS : AUTOUR DU W3C , NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Très bonne après-midi passée lors cette conférence avec le W3C, organisée par L' Inria sur les nouveaux standards, ce Mardi 14 Février, on sent vraiment que çà bosse au W3C, et l'avenir est très très prometteur pour le HTML5, notamment ...
Cliquez pour lire la suite de l'article par Gio GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko
Forum
RE : VITESSERE : VITESSE par ossama261988
Cliquez pour lire la suite par ossama261988 RE : VITESSERE : VITESSE par ucfoutu
Cliquez pour lire la suite par ucfoutu
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|