Calcul surface quadrilatéral

Signaler
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012
-
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012
-
Bonjour ,
J'ai un petit souci je sais pas comment faire pour calculer la surface d'un quadrilateral en C# merci

50 réponses

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Qu'est ce qui te pose problème ?
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

c'est comment faire pour calculer la surface d' un quadrilateral quelconque en C#
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
D'accord, c'est un quadrilatère quelconque. Je ne sais pas comment tu veux le faire, comment ton quadrilatère est il enregistré ?

Tu peux le faire en comptant le nombre de pixels qui appartiennent à ton quadrilatère et en convertissant le résultat en cm².

Sinon, il y a une façon probabiliste de le faire.

En tout cas, tu ne trouveras pas de formule qui te permet de le faire en contrepassant la taille des cotés et les angles.
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

Merci pour la reponse le quadrilatere est definie par quatre point comment je peux calculer le nombre de pixel qui est entre ces derniers
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Tu peux dessiner le quadrilatère si tu fais une interface graphique mais dans ton cas, cette solution n'est pas la bonne.

C'est quelque chose d'assez difficile, est il vraiment quelconque ce quadrilatère ? Si oui, ca va être assez difficile algorithmiquement parlant.

Ce que je ferais si j'étais à ta place, d'abord, créer une méthode qui détermine si oui ou non un point appartient au quadrilatère. Une deuxième méthode qui permet d'inscrire ton quadrilatère dans un rectangle (ca, c'est facile).

Et ensuite, tu tire aléatoirement un grand nombre de points (une cinquantaine peut suffire) et tu comptes le nombre de points qui appartiennent au quadrilatère (qu'on note n1 et n2 le nombre de points n'appartenant pas au quandrilatere).

L'aire du quadrilatère est approchée par aireRectangle*n1/(n1+n2)
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
Hello,
Je me trompe ou bien l'aide d'un quadrilatère est égale à la somme des aires des triangles inscrits (pour peu que ta forme ne soit pas croisée)?
Si tu connais les coordonnées des points ABCD de ton quadrilatère, tu peux calculer l'aire comme suit:
Aabcd = Aabc + Aacd


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Oui, c'est vrai, ca te permettrait d'avoir une valeur exacte en plus.
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

bonjour merci pour vos reponse , voici le resultat que j ai eu et si vous avez remarquer il ya des quadrilater en bleu et moi je dois les compter et je dois avoir 66 LEDs pas 117 LEds
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

Re,
Desole l'image n'est pas apparu j'arrive pas l'afficher ??!!
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
Yop,
Il faut que tu passes l'url de l'image, c'est-à-dire que tu dois l'héberger au préalable quelque part


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

je l ai fais ca marche si tu veux je t envoie l'image par mail si ca te derange pas ??!!
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
Voilà l'image en question

En fait, ton objectif n'est pas de calculer l'aire d'un quadrilatère mais plutôt de détecter des formes, c'est ça?
L'idéal serait plutôt de stocker une image d'une LED allumé et de voir combien de fois elle est présente dans l'image (voir les techniques de block maching).

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
Bon, effectivment, il doit y avoir un souci dans la gestion des images.
Voici le lien pour la visualiser


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

mon but c'est de calculer combien il ya de LEDs dans l'image d'entree " celle qui sont en blanc " c'est pour ca j ai fait la detection de forme donc a chaque fois il ya une leds en blanc il dessine il quadrilatere mais le probleme vu que l'image il est pas bien nettoyer il ya des petit quadrilatére qui sont juste à cote des grands donc moi je me suis dit tu fais une condition qd la surface du quadrilatere est grande tu incremente nombre_led= nombre_led+1;ut vois pour que le calcul soit plus selectif et comme ca j'obtient mes 66 LEDs
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
ça se tient. Mais comment tu fais pour délimiter tes quadrilatères?


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

comment ca delimiter ??!!
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
Ben, comment tu fais pour calculer tes quadrilatères? Est-ce que tu as les coordonnées des points délimitant la forme?
Ce que je te demande a un but d'optimisation: plutôt que de calculer les quadrilatères puis, ensuite, les re-parcourir pour calculer leur aire, autant le faire en amont, avant de les afficher.


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

oui je peux calculer la distance entre deux points voici le bout de code qui me permet de faire ca :
// ------------- Detection -------------  
                    for (int i 0, n blob.Length; i < n; i++)
                    {

                        List edgePoints = blobCounter.GetBlobsEdgePoints(blob[i]);
                        List corners = PointsCloud.FindQuadrilateralCorners(edgePoints);
                        g.DrawPolygon(Bleu,ToPointsArray(corners));

                        int cornersCount = corners.Count; // Devrait être 4 pour le quadrilatère
                        // 1 - se préparent pour les calculs de distance entre un point
                        // Et le quadrilatère
                        double[] k = new double[cornersCount];
                        double[] b = new double[cornersCount];
                        double[] div = new double[cornersCount]; // precalculated divisor
                        bool[] isVert = new bool[cornersCount];
                        for (int j = 0; j < cornersCount; j++)
                        {
                            IntPoint currentPoint = corners[j];
                            IntPoint nextPoint (j + 1 cornersCount) ?
                            corners[0] : corners[j + 1];
                            if (!(isVert[j] = nextPoint.X == currentPoint.X))
                            {
                                k[j] = (double)(nextPoint.Y - currentPoint.Y) /
                                (nextPoint.X - currentPoint.X);
                                b[j] = currentPoint.Y - k[j] * currentPoint.X;
                                div[j] = Math.Sqrt(k[j] * k[j] + 1);
                            }
                           // c'est pour compter le nombre de LEDs
                            if (div[j]  >= 2  & cornersCount == 4 )
                            {
                                nombre_led = nombre_led+1;
                            }
                              
                        }
                        
                
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
Je te mets un algo qui pourra t'inspirer.

- pour chaque quadrilatère dans la liste
. calculer aire quadrilatère (cf. ci-dessous)
. si aire < seuil
. suppression du quadrilatère
. fin si
- fin pour

- calcul aire quadrilatère
. récupération de 3 points consécutifs (A, B, C)
. calcul aire triangle1
. récupération points (A, C, D)
. calcul aire triangle2
. retourner aire1+aire2
- fin calcul aire quadrilatère

Pour trouver l'aire d'un triangle, je te laisse chercher sur le net: il existe des optimisations

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
76
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
31 janvier 2012

j'ai fais comme ca pour tu peux voir 2s stp psk pour la récupération de ' points A,B,C,D je suis pas sur mais juste corrige moi car je trouve zero pour le nombre des leds et j ai fais le pas à pas je trouve que les 4 point egal à zero.
		// pour avoir 4 point de mon quadrilatere
int cornersCount = corners.Count; 
// declaration des 4 point 
                        double[] A = new double[cornersCount];
                        double[] B = new double[cornersCount];
                        double[] C = new double[cornersCount];
                        double[] D = new double[cornersCount];
                       
                        double Air_1,Air_2,Air_total=0;

                        for (int j = 0; j < cornersCount; j++)
                        {
                            IntPoint currentPoint = corners[j];
                            IntPoint nextPoint (j + 1 cornersCount) ?
                            corners[0] : corners[j + 1];
                            if ((nextPoint.X == currentPoint.X))
                            {

// pour avoir les coordoner des points mais je suis pas sur 
                                A[j] = (double)(nextPoint.Y - currentPoint.Y) /
                                (nextPoint.X - currentPoint.X);
                                B[j] = (double)(nextPoint.Y - currentPoint.Y) /
                                (nextPoint.X - currentPoint.X);
                                C[j] = (double)(nextPoint.Y - currentPoint.Y) /
                                (nextPoint.X - currentPoint.X);
                                D[j] = (double)(nextPoint.Y - currentPoint.Y) /
                                (nextPoint.X - currentPoint.X);
// calcul de l'aire d'un triangle aire = (hauteur*base)/2
                                 Air_1 = ((A[j] - D[j]) * (D[j] - C[j]) / 2);
                                 Air_2 = ((A[j] - B[j]) * (B[j] - C[j]) / 2);

                                 Air_total = Air_1 + Air_2;
                            }
                           
                            if (Air_total  >2  & cornersCount 4 )
                            {
                                nombre_led = nombre_led+1;
                            }
}