EX. DE MODULARISATION : POINT DANS TRIANGLE

cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 - 26 oct. 2005 à 20:55
krissssss Messages postés 88 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 2 janvier 2007 - 17 mai 2007 à 15:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/34364-ex-de-modularisation-point-dans-triangle

krissssss Messages postés 88 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 2 janvier 2007
17 mai 2007 à 15:21
Tu pourais le faire de la même façon avec un tétraèdre :
Tu dois probablement jouer avec les points de percée.

puisque ton solide a 4 sommets dans ce cas, un point y est contenu SSI la droite passant par un des sommets et ton point perce la base opposée au sommet.
Les cas limites étants : point sur une arrête ou un sommet.

Pour le cube, tu le découpe en 2 tétraèdres.

Pour la sphère, il y a une formule de la distance entre 2 point dans l'espace dans l'espace. Il suffit que d < r.

C'est des connaissances en maths qu'il faut plus qu'en VB ;-)
oliv_def Messages postés 14 Date d'inscription mardi 15 mai 2007 Statut Membre Dernière intervention 20 décembre 2007
17 mai 2007 à 12:57
Super :-) !
mais ou trouve t on le code testant si un point de l'espace est dans un volume de l'espace (cube) ou dans un premier temps si un point de l'espace est dans un triangle de l'espace ?
on trouve sur VBFRANCE le code : http://www.vbfrance.com/code.aspx?ID=38673, mais il ne repond pas au besoin puisqu'il ne fonctionne que dans le plan egalement...
Bref ce serait tres bien si qqun etudiat le probleme, quand a moi j'ai ce besoin mais ne suis pas un master en vb... :-(
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
11 nov. 2005 à 14:20
Tu n'aimes pas les commentaires non constructifs donc je n'en fais pas
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
30 oct. 2005 à 10:59
Bonjour,

A la suite de la remarque de VBLOVER, sur son code il y a une remarque très intéressante de VbMaster, précisant l'existance d'une API réalisant la même chose, valable pour de nombreuses formes géomètriques...

Autrement, le code proposé me semble assez bien construit dans l'ensemble... Néanmoins, j'ai une remarque sur le code proposé...

LE code :

=

If ppy < p.Y Then
equ = False
Else
If ppy = p.Y Then
equ = True
Else
equ = True
End If
End If

=

A été simplifié par Gally avec :

=

If (b.X - a.X) <> &H0 Then
ppy = (b.Y - a.Y) * (p.X - a.X) / (b.X - a.X) + a.Y
If ppy < p.Y Then
setTriangle = False
Else
setTriangle = True
End If
End If

=

Il me semble qu'on peut encore faire plus optimum, par :

If (b.X - a.X) <> &H0 Then
ppy = (b.Y - a.Y) * (p.X - a.X) / (b.X - a.X) + a.Y
setTriangle = (ppy > p.Y)
End If

=

Amicalement,
Us.
gallyhc Messages postés 386 Date d'inscription samedi 4 octobre 2008 Statut Membre Dernière intervention 19 février 2018 2
27 oct. 2005 à 09:35
ReBOnjour,

Petite erreur dans le message si-dessus, revu et corrigé:

Public Type TPoint
X As Double
Y As Double
End Type

Public Function setTriangle(ByRef a As TPoint, ByRef b As TPoint, ByRef p As TPoint) As Boolean
'
If (b.X - a.X) <> &H0 Then
ppy = (b.Y - a.Y) * (p.X - a.X) / (b.X - a.X) + a.Y
If ppy < p.Y Then
setTriangle = False
Else
setTriangle = True
End If
End If

End Function

Public Function getInTriangle(ByRef a As TPoint, ByRef b As TPoint, ByRef c As TPoint, ByRef p As TPoint) As Boolean
'
getInTriangle Not ((setTriangle(a, b, c) Not setTriangle(a, b, p)) Or (setTriangle(b, c, a) = Not setTriangle(b, c, p)) Or (setTriangle(c, a, b) = Not setTriangle(c, a, p)))

End Function

A++
[Gally Home Corp]
gallyhc Messages postés 386 Date d'inscription samedi 4 octobre 2008 Statut Membre Dernière intervention 19 février 2018 2
27 oct. 2005 à 09:06
Bonjour Krissssss,

Je penses pour ma par que voir plusieurs méthodes est une bonne choses. Même si vous avez des codes "plus propre", cela n'empeche pas de voir d'autre façon de faire.

Sinon tu peux optimiser avec la

Public Function dansTriangle(Byval a As TPoint, Byval b As TPoint, Byval c As TPoint, Byval p As TPoint) As Boolean
'
dansTriangle Not ((equ(a, b, c) Not equ(a, b, p)) Or (equ(b, c, a) = Not equ(b, c, p)) Or (equ(c, a, b) = Not equ(c, a, p)))

End Function

A++
[Gally Home Corp]
Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
26 oct. 2005 à 21:41
je pense aussi que la diversité est un avantage, sauf quand elle n'apporte rien de plus (surtout quand c'est des maths)! j'ai posté un code il y a longtemps sur ce site qui fait exactement la même chose, mais de manière mathématique beaucoup plus élégante:

http://www.vbfrance.com/code.aspx?id=2196

je pense que d'un point de vue purement utilitaire, rien ne sert de rajouter des sources qui font la même chose que d'autres; ça surcharge inutilement les recherches des utilisateurs

à part ça je n'ai rien de personnel contre ce code:)
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
26 oct. 2005 à 20:55
il y a une méthode matricielle pour ça, beaucoup plus rapide et efficace, qu'on peut trouver sur vbfrance aussi :)

mais la diversité c'est un avantage !
Rejoignez-nous