Calculer l'aire de n'importe quel polygone

Question : Dans le système de coordonnées planes bidimensionnelles, pour tout polygone, les coordonnées de chaque sommet sont connues a_{1}(x_{1},y_{1}),a_{2}(x_{2},y_{2}),...,a_{n}(x_{n},y_{n} )et l'aire du polygone est calculée.

Quand j'ai vu les mots "coordinates" et "area", la première chose à laquelle j'ai pensé a été le contenu du dernier blog que je viens d'écrire : le produit extérieur des vecteurs. Ensuite, nous essayons de partir du produit extérieur du vecteur pour voir si nous pouvons répondre au problème du calcul de l'aire.

Définition du produit extérieur vectoriel :

Si deux vecteurs\overrightarrow{a}=(x_{a},y_{a},z_{a}),\overrightarrow{b}=(x_{b},y_{b},z_{b})

Alors \overrightarrow{a}\fois \overrightarrow{b}=(y_{a}z_{b}-z_{a}y_{b},x_{a}z_{b}-z_{a}x_{b},x_{a}y_{b}-y_{a} x_{b})

Afin de faciliter le calcul et la dérivation, nous faisons encore évoluer la formule de définition du produit extérieur, comme suit :

\overrightarrow{a}\fois \overrightarrow{b}

=(y_{a}z_{b}-z_{a}y_{b},x_{a}z_{b}-z_{a}x_{b},x_{a}y_{b}-y_{a} x_{b})

=(y_{a}z_{b}-z_{a}y_{b})\overrightarrow{i}+(x_{a}z_{b}-z_{a}x_{b})\overrightarrow{j}+ (x_{a}y_{b}-y_{a}x_{b})\overrightarrow{k}

=\begin{vmatrix} \overrightarrow{i} & \overrightarrow{j} & \overrightarrow{k}\\ x_{a} & y_{a} & z_{a}\\ x_{b} & y_{b} & z_{b} \end{vmatrice}

Réduction de la dimensionnalité à un plan bidimensionnel, on pose z_{a}=0,z_{b}=0, on obtient

\overrightarrow{a}\fois \overrightarrow{b}= \begin{vmatrix} \overrightarrow{i} & \overrightarrow{j} & \overrightarrow{k}\\ x_{a} & y_{a} & z_{a}\\ x_{b} & y_{b} & z_{b} \end{vmatrice}= \begin{vmatrix} \overrightarrow{i} & \overrightarrow{j} & \overrightarrow{k}\\ x_{a} & y_{a} & 0\\ x_{b} & y_{b} & 0 \end {matrice}, qui \overrightarrow{i},\overrightarrow{j},\overrightarrow{k}représentent respectivement les vecteurs unitaires des axes x, y et z.

Parce que dans la troisième colonne, à l'exception de la première ligne, toutes les autres lignes sont 0, nous développons donc en fonction de la troisième colonne du déterminant et obtenons

\overrightarrow{a}\fois \overrightarrow{b}= \begin{vmatrix} \overrightarrow{i} & \overrightarrow{j} & \overrightarrow{k}\\ x_{a} & y_{a} & 0\\ x_{b} & y_{b} & 0 \end {matrice}= \overrightarrow{k}A_{13}= \begin{vmatrix} x_{a} & y_{a}\\ x_{b} & y_{b} \end{vmatrix}\overrightarrow{k}, qui A_{13}représente \overrightarrow{k}le cofacteur algébrique.

 Ainsi, lorsque nous calculons le produit extérieur de deux vecteurs dans un plan bidimensionnel, nous pouvons l'évaluer en calculant le déterminant du tableau ordonné des coordonnées des deux vecteurs. Dans le blog précédent, nous avons vérifié que la valeur absolue du produit extérieur de deux vecteurs est égale à deux fois l'aire du triangle délimité par l'origine (0,0)et les trois points.(x_{a},y_{a}),(x_{b},y_{b})

Avec cette fondation en place, revenons à la question.

 Le problème décrit un polygone. Commençons par le polygone le plus simple : un triangle, comme le montre la figure ci-dessous :

L'aire du triangle dans la figure ci-dessus S_{\Delta ABC}est égale à

S_{\Delta ABC}=S_{\Delta OAB}-S_{\Delta OBC}-S_{\Delta OCA}

 Nous utilisons le produit extérieur vectoriel pour amener l'aire de chaque triangle dans la formule ci-dessus, nous pouvons obtenir

S_{\Delta ABC}=S_{\Delta OAB}-S_{\Delta OBC}-S_{\Delta OCA}=1/2(\overrightarrow{OA}\times \overrightarrow{OB}+\overrightarrow{OB}\times \overrightarrow{OC}+\overrightarrow{OC}\times \overrightarrow{OA})

 Remarque : lorsque les vecteurs sont multipliés par croisement, le résultat sera positif ou négatif, et le positif et le négatif représentent la direction qui satisfait la règle de la main droite.

Après avoir calculé les triangles, nous passons aux quadrilatères.

Le quadrilatère devient un peu plus compliqué, car le quadrilatère a des côtés dits convexes et concaves Essayons de voir si les deux scénarios peuvent avoir la même idée de calcul, c'est-à-dire pas de sensation de bosses. Nous calculons d'abord les deux graphiques séparément.

Forme convexe :

S_{ABCD}

=-S_{\Delta OAB}-S_{\Delta OBC}+S_{\Delta OCD}+S_{\Delta ODA}

1/2(\overrightarrow{OA}\times \overrightarrow{OB}+\overrightarrow{OB}\times \overrightarrow{OC}+\overrightarrow{OC}\times \overrightarrow{OD}+\overrightarrow{OD}\times \overrightarrow{OA})

Forme concave :

 S_{ABCD}

-S_{\Delta OAB}-S_{\Delta OBC}+S_{\Delta OCD}+S_{\Delta ODA}

1/2(\overrightarrow{OA}\times \overrightarrow{OB}+\overrightarrow{OB}\times \overrightarrow{OC}+\overrightarrow{OC}\times \overrightarrow{OD}+\overrightarrow{OD}\times \overrightarrow{OA})

On constate que les formules des résultats supérieur et inférieur sont unifiées, c'est-à-dire les côtés convexe et concave du quadrilatère.Lorsque vous utilisez le produit extérieur vectoriel pour le calcul de l'aire, la formule de calcul est cohérente et il n'y a aucune sensation de bosses .

Maintenant, nous avons vérifié une méthode de résolution de problèmes des triangles aux quadrilatères, qui est :

Les vecteurs composés de chaque sommet et de l'origine du polygone, dans le sens inverse des aiguilles d'une montre (ou dans le sens des aiguilles d'une montre, peuvent également être utilisés), et les deux vecteurs avant et après sont multipliés pour trouver le produit extérieur, et les vecteurs de queue et de tête sont également multipliés de manière croisée (en d'autres termes, c'est-à-dire que les deux extrémités connectées par chaque arête du graphique doivent être multipliées de manière croisée par tête-à-queue ), puis la valeur absolue de la moitié de la somme obtenue en ajoutant tous les produits extérieurs sont l'aire du polygone. Tout de suite

S_{polygone}=1/2(\overrightarrow{oa_{1}}\times\overrightarrow{oa_{2}} +\overrightarrow{oa_{2}}\times\overrightarrow{oa_{3}}+...+\overrightarrow{oa_ {n}}\times\overrightarrow{oa_{1}} )

Cette méthode de calcul peut-elle être appliquée à tous les polygones ? Prouvons-le par induction mathématique.

En supposant que lorsqu'il y a n côtés, S_{n}= 1/2(\overrightarrow{oa_{1}}\times\overrightarrow{oa_{2}} +\overrightarrow{oa_{2}}\times\overrightarrow{oa_{3}}+...+\overrightarrow{oa_ {n}}\times\overrightarrow{oa_{1}} )est vrai, alors ajoutez un point sur cette base à ce moment un_{n+1}pour devenir n + 1 côtés

Comme le montre la figure ci-dessus, nous devons ajouter a_{n}a_{n+1},a_{n+1}a_{1}deux arêtes (la partie jaune sur la figure) et supprimer un_{n}un_{1}cette arête (la ligne pointillée rouge sur la figure), puis

S_{n+1}

S_{n}+1/2(\overrightarrow{oa_{n}}\times \overrightarrow{oa_{n+1}}+\overrightarrow{oa_{n+1}}\times \overrightarrow{oa_{1}}-\overrightarrow{oa_ {n}}\times \overrightarrow{oa_{1}})

= 1/2(\overrightarrow{oa_{1}}\times\overrightarrow{oa_{2}} +\overrightarrow{oa_{2}}\times\overrightarrow{oa_{3}}+...+\overrightarrow{oa_ {n}}\times\overrightarrow{oa_{1}} ) +

  1/2(\overrightarrow{oa_{n}}\times \overrightarrow{oa_{n+1}}+\overrightarrow{oa_{n+1}}\times \overrightarrow{oa_{1}}-\overrightarrow{oa_ {n}}\times \overrightarrow{oa_{1}})(Remarque : cela correspond à ajouter deux côtés et à supprimer un côté)

=1/2(\overrightarrow{oa_{1}}\times\overrightarrow{oa_{2}} +\overrightarrow{oa_{2}}\times\overrightarrow{oa_{3}}+...+\overrightarrow{oa_ {n}}\times\overrightarrow{oa_{n+1}}+\overrightarrow{oa_{n+1}}\times\overrightarrow{oa_{1}} )

Le résultat final satisfait aux règles de calcul que nous avons résumées ci-dessus. Jusqu'à présent, nous avons théoriquement obtenu la solution de l'aire du polygone.

 Ensuite, ensuite, nous devons transplanter cette méthode de calcul sur l'ordinateur et laisser l'ordinateur effectuer le calcul pour nous, nous devons donc continuer à faire évoluer la formule de calcul dans une forme qui convient à l'ordinateur pour calculer.

S_{polygone}

1/2(\overrightarrow{oa_{1}}\times\overrightarrow{oa_{2}} +\overrightarrow{oa_{2}}\times\overrightarrow{oa_{3}}+...+\overrightarrow{oa_ {n}}\times\overrightarrow{oa_{1}} )

=1/2(\begin{vmatrix} x_{1} & y_{1}\\ x_{2} & y_{2} \end{vmatrix} + \begin{vmatrix} x_{2} & y_{2}\ \ x_{3} & y_{3} \end{vmatrix} +...+\begin{vmatrix} x_{n} & y_{n}\\ x_{1} & y_{1} \end{vmatrix} )

=1/2(x_{1}y_{2}-y_{1}x_{2}+x_{2}y_{3}-y_{2}x_{3}+...+x_{n}y_{ 1}-y_{n}x_{1})

=1/2\sum_{i=1}^{n}(x_{i}y_{i+1}-y_{i}x_{i+1})

Parmi eux, je=nà cette époque , je+1=n+1=1c'est-à-direx_{n+1}=x_{1},y_{n+1}=y_{1}

Enfin, nous avons obtenu la formule ci-dessus, qui est le célèbre théorème des lacets Shoelace Theorem .

 Quelles sont ses caractéristiques ? Empruntons des images à Internet, comme suit:

 

 Parce que cette formule fonctionne comme un lacet, on l'appelle le théorème du lacet.

 Avec le théorème du lacet, nous pouvons facilement le porter dans le code.

struct Point2d  
{  
    double x;  
    double y;  
    Point2d(double xx, double yy): x(xx), y(yy){}  
};  
   
//计算任意多边形的面积,顶点按照顺时针或者逆时针方向排列  
double ComputePolygonArea(const vector<Point2d> &points)  
{  
    int point_num = points.size();  
    if(point_num < 3)return 0.0;  
    double s = 0;  
    for(int i = 0; i < point_num; ++i)  
        s += points[i].x * points[(i+1)%point_num].y - points[i].y * points[(i+1)%point_num].x;  
    return fabs(s/2.0);  
}

Je suppose que tu aimes

Origine blog.csdn.net/m0_74178120/article/details/128737748
conseillé
Classement