Calcul surface quadrilatéral

idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012 - 25 juil. 2011 à 15:09
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012 - 29 juil. 2011 à 10:08
Bonjour ,
J'ai un petit souci je sais pas comment faire pour calculer la surface d'un quadrilateral en C# merci
A voir également:

50 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
25 juil. 2011 à 16:03
Qu'est ce qui te pose problème ?
0
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012
25 juil. 2011 à 16:07
c'est comment faire pour calculer la surface d' un quadrilateral quelconque en C#
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
25 juil. 2011 à 16:14
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.
0
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012
25 juil. 2011 à 16:22
Merci pour la reponse le quadrilatere est definie par quatre point comment je peux calculer le nombre de pixel qui est entre ces derniers
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
25 juil. 2011 à 16:34
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)
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
25 juil. 2011 à 17:22
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...
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
25 juil. 2011 à 17:35
Oui, c'est vrai, ca te permettrait d'avoir une valeur exacte en plus.
0
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012
26 juil. 2011 à 08:36
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
0
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012
26 juil. 2011 à 08:46
Re,
Desole l'image n'est pas apparu j'arrive pas l'afficher ??!!
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
26 juil. 2011 à 09:05
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...
0
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012
26 juil. 2011 à 10:15
je l ai fais ca marche si tu veux je t envoie l'image par mail si ca te derange pas ??!!
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
26 juil. 2011 à 10:46
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...
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
26 juil. 2011 à 10:47
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...
0
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012
26 juil. 2011 à 10:55
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
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
26 juil. 2011 à 11:01
ç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...
0
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012
26 juil. 2011 à 13:22
comment ca delimiter ??!!
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
26 juil. 2011 à 13:35
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...
0
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012
26 juil. 2011 à 13:42
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;
                            }
                              
                        }

                
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
26 juil. 2011 à 16:32
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...
0
idrissiilias Messages postés 76 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 31 janvier 2012
26 juil. 2011 à 16:52
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;
                            }
}

                           
0
Rejoignez-nous