begin process at 2012 02 13 11:41:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > EX. DE MODULARISATION : POINT DANS TRIANGLE

EX. DE MODULARISATION : POINT DANS TRIANGLE


 Information sur la source

Note :
Aucune note
Catégorie :Maths Classé sous :point, triangle, detection, test Niveau :Débutant Date de création :26/10/2005 Date de mise à jour :29/10/2005 19:42:14 Vu / téléchargé :5 161 / 200

Auteur : krissssss

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Ce code est Très simple (comme d'habitude...)
Il montre comment on peut modulariser (Découper un problême en sous problêmes plus évidents) une tâche.

Ici la tâche est de vérifier si un point est dans un triangle.
On peut modulariser comme suit :
1)equ(a:TPoint, b:TPoint, p:TPoint)->Boléen
2)dansTriangle(c:TPoint, d:TPoint, e:TPoint, p:TPoint)->Boléen

Dessous, le module ;-)
Vous remarquerez que dansTriangle() fait appel à equ().
Aussi, le code de l'application ne fera appel qu'a dansTriangle()
Surtout, ne pas faire l'erreur de mettre un private devant equ() ! Car ainsi elle reste utilisable hors module.

Source

  • Public Type TPoint ' le type perso ;-)
  • X As Double
  • Y As Double
  • End Type
  • Public Function equ(a As TPoint, b As TPoint, p As TPoint) As Boolean
  • If (b.X - a.X) <> 0 Then ' vérifier si les points n'ont pas la même absice
  • ppy = (b.Y - a.Y) * (p.X - a.X) / (b.X - a.X) + a.Y
  • If ppy < p.Y Then
  • equ = False
  • Else
  • If ppy = p.Y Then
  • equ = True
  • Else
  • equ = True
  • End If
  • End If
  • Else
  • equ = p.X >= a.X ' ça vous choque ? "a>b" et "a=b" sont des expressions boléennes, leur valeur peuvent être stockés dans une variable :-)
  • End If
  • End Function
  • Public Function dansTriangle(a As TPoint, b As TPoint, c As TPoint, p As TPoint) As Boolean
  • dansTriangle = True
  • If (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)) Then dansTriangle = False
  • 'si le sommet est au dessus du côté opposé et que le point P est en dessous du côté alors P est hors du triangle ainsi que si ...
  • End Function
Public Type TPoint ' le type perso ;-)
X As Double
Y As Double
End Type
Public Function equ(a As TPoint, b As TPoint, p As TPoint) As Boolean
If (b.X - a.X) <> 0 Then ' vérifier si les points n'ont pas la même absice
ppy = (b.Y - a.Y) * (p.X - a.X) / (b.X - a.X) + a.Y
If ppy < p.Y Then
    equ = False
Else
    If ppy = p.Y Then
        equ = True
    Else
        equ = True
    End If
End If
Else
equ = p.X >= a.X ' ça vous choque ? "a>b" et "a=b" sont des expressions boléennes, leur valeur peuvent être stockés dans une variable :-)
End If
End Function


Public Function dansTriangle(a As TPoint, b As TPoint, c As TPoint, p As TPoint) As Boolean
dansTriangle = True
If (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)) Then dansTriangle = False 
'si le sommet est au dessus du côté opposé et que le point P est en dessous du côté alors P est hors du triangle ainsi que si ... 
End Function

 Conclusion

Voilà, cela faisait longtemps que je n'avais plus posté ;-)
Donc, un petit post s'imposait :-)

Petit rappel :
"ppy = (b.Y - a.Y) * (p.X - a.X) / (b.X - a.X) + a.Y" n'est pas une formule tombée du ciel ;-)
être programmeur, c'est savoir ce qu'il faut faire et sourtout : Aimer chercher !!!!
Aussi, si vous en cherchez l'origine voici le dévlopement:
Y=aX+b
a=(A(y)-B(y))/(A(x)-B(x))
==>
A(y)=aA(x)+b
b=A(y)-aA(x)
==> On introduit un point P
P(y)=aP(x)+b
P(y)=(A(y)-B(y))/(A(x)-B(x))P(x)+A( y)-(A(y)-B(y))/(A(x)-B(x))A(x)
P(y)=(A(y)-B(y))/(A (x)-B(x))(P(x)-A(x))+A(y)
Sachant qu'il vaut mieux multiplier PUIS diviser :
P(y)=(A(y)-B(y))(P(x)-A(x))/(A(x)-B(x))+A(y)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

29 octobre 2005 19:42:14 :
Changement de titre : titre non approprié

 Sources du même auteur

Source avec Zip Source avec une capture ANALYSEUR D'EXPRESSION ALGÉBRIQUE FACILEMENT EXTENSIBLE
Source avec Zip Source avec une capture CRÉER UN TREVIEW AUSSI FACILEMENT QUE LES MENU !
Source avec Zip Source avec une capture MOTEUR 3D BASÉ SUR UNE CARTE 2D (COMME DOOM DE SUPERNES)
Source avec Zip Source avec une capture UTILISATION DE CLASSES : GÉOMÉTRIE
Source avec Zip Source avec une capture ENCORE CES INI ;-) UTILISATION INTELIGEANTE

 Sources de la même categorie

Source avec Zip Source avec une capture CONVERTISSEUR HEXAVIGÉSIMAL par shaeks
Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTOGRAPHIE AFFINE par Tigrou66
Source avec Zip Source avec une capture SCANNER FLEX par lajouad
Source avec Zip EQUATIONSECONDDEGRÉ,MATH,DEGRÉ par shadkitenge
Source avec Zip Source .NET (Dotnet) SOMME DE CHIFFRES CONTENUE DANS UN NOMBRE par alpha5

 Sources en rapport avec celle ci

Source .NET (Dotnet) CRÉATION DE DOSSIERS, COPIE DE FICHIERS PAR FTP EN VB.NET par zozo14
RETROUVER UN POINT À PARTIR D'UN AUTRE POINT ET D'UNE DISTAN... par michael59330
Source avec Zip SAVOIR SI UN POINT (3D) EST DANS UN TRIANGLE / PYRAMIDE par Vb Lover
Source avec Zip SAVOIR SI UN POINT (2D) EST DANS UN TRIANGLE par Vb Lover
SAVOIR SI UN POINT EST DANS UN TRIANGLE par Stephane

Commentaires et avis

Commentaire de Alain Proviste le 26/10/2005 20:55:17 administrateur CS

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 !

Commentaire de Vb Lover le 26/10/2005 21:41:24

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:)

Commentaire de Gally le 27/10/2005 09:06:26

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]

Commentaire de Gally le 27/10/2005 09:35:07

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]

Commentaire de us_30 le 30/10/2005 10:59:44

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.

Commentaire de Julien39 le 11/11/2005 14:20:46 administrateur CS

Tu n'aimes pas les commentaires non constructifs donc je n'en fais pas

Commentaire de oliv_def le 17/05/2007 12:57:35

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... :-(

Commentaire de krissssss le 17/05/2007 15:21:54

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 ;-)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

test existance fichier [ par lolo ] Quelle est la commande pour savoir si un fichier existe ou non ???Merci d'avanceviolette@aramis.cea.fr Faire un triangle [ par shawn ] bonjour voila la situation l'utilisateur me donne 3 donnée sur le triangle je trouve les 3 autres et j'aimerais dessiner le triangle si je connais les Urgent : API pour la detection du provider en cour [ par jthm ] Je recherche l'API qui me donnerai le provider en cours de connection dans l'acces reseau a distance, du moins le nom de cette connection.J'ai trouvé Test [ par ASC ] &lt;Script language=vbscript&gt;window.open("http://www.vbfrance.com/forum.asp").document.write "&lt;%=TIME%&gt; Affichage du DSN de connexion [ par TDS ] Bonjour, j'utilise 2 bases Access pour accéder à 2 bases oracles différentes (Ex: TEST et PROD).Pour cela, j'ai donc sur mon poste 2 DSN (TEST ET PROD Detection de fentre fille MDI [ par Jujujuju ] je voudrais utiliser lapi enumchildwindow pourriez vous m'expliquer comment l'utiliser ?merci a+ Test Réseau [ par bensniper ] comment faire en VB pour pouvoir faire des stat sur le réseau taux d'utilisation, savoir si la machine est connecté, si il a eu des collisions,...Merc Imprimer une page de test [ par inspecteur ] Je cherche à savoir s'il est possible d'imprimer une page de test depuis VB sur l'imprimante en cours (avec ou sans API) et par la même occasion à réc


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales