Calcular el área de cualquier polígono

Pregunta: En el sistema de coordenadas del plano bidimensional, para cualquier polígono, se conocen las coordenadas de cada vértice a_{1}(x_{1},y_{1}),a_{2}(x_{2},y_{2}),...,a_{n}(x_{n},y_{n} )y se calcula el área del polígono.

Cuando vi las palabras "coordenadas" y "área", lo primero que pensé fue el contenido del último blog que acabo de escribir: el producto externo de vectores. Luego tratamos de comenzar desde el producto exterior del vector para ver si podemos responder el problema de calcular el área.

Definición de producto exterior vectorial:

Si dos vectores\overrightarrow{a}=(x_{a},y_{a},z_{a}),\overrightarrow{b}=(x_{b},y_{b},z_{b})

Entonces \overrightarrow{a}\veces \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})

Para facilitar el cálculo y la derivación, desarrollamos aún más la fórmula de definición del producto exterior, de la siguiente manera:

\overrightarrow{a}\veces \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{vmatriz}

Reducción de dimensionalidad a un plano bidimensional, ponemos z_{a}=0,z_{b}=0, obtenemos

\overrightarrow{a}\veces \overrightarrow{b}= \begin{vmatrix} \overrightarrow{i} & \overrightarrow{j} & \overrightarrow{k}\\ x_{a} & y_{a} & z_{a}\\ x_{b} & y_{b} & z_{b} \end{vmatriz}= \begin{vmatrix} \overrightarrow{i} & \overrightarrow{j} & \overrightarrow{k}\\ x_{a} & y_{a} & 0\\ x_{b} & y_{b} & 0 \end {vmatriz}, que \overrightarrow{i},\overrightarrow{j},\overrightarrow{k}representan los vectores unitarios del eje x, eje y y eje z respectivamente.

Debido a que en la tercera columna, excepto la primera fila, todas las demás filas son 0, por lo que desarrollamos de acuerdo con la tercera columna del determinante y obtenemos

\overrightarrow{a}\veces \overrightarrow{b}= \begin{vmatrix} \overrightarrow{i} & \overrightarrow{j} & \overrightarrow{k}\\ x_{a} & y_{a} & 0\\ x_{b} & y_{b} & 0 \end {vmatriz}= \overrightarrow{k}A_{13}= \begin{vmatrix} x_{a} & y_{a}\\ x_{b} & y_{b} \end{vmatrix}\overrightarrow{k}, que A_{13}representa \overrightarrow{k}el cofactor algebraico.

 Entonces, cuando calculamos el producto exterior de dos vectores en un plano bidimensional, podemos evaluarlo calculando el determinante de la matriz ordenada de coordenadas de los dos vectores. En el blog anterior hemos comprobado que el valor absoluto del producto exterior de dos vectores es igual al doble del área del triángulo encerrado por el origen (0,0)y los tres puntos.(x_{a},y_{a}),(x_{b},y_{b})

Con esta base en su lugar, volvamos a la pregunta.

 El problema describe un polígono, comencemos con el polígono más simple: un triángulo, como se muestra en la siguiente figura:

El área del triángulo de la figura anterior S_{\Delta ABC}es igual a

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

 Usamos el producto externo del vector para traer el área de cada triángulo en la fórmula anterior, podemos obtener

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

 Nota: Cuando los vectores se multiplican en cruz, el resultado será positivo o negativo, y el positivo y el negativo representan la dirección que satisface la regla de la mano derecha.

Después de calcular los triángulos, pasamos a los cuadriláteros.

El cuadrilátero se vuelve un poco más complicado, porque el cuadrilátero tiene los llamados lados convexos y cóncavos. Intentemos ver si los dos escenarios pueden tener la misma idea de cálculo, es decir, sin sentido de baches. Primero calculamos los dos gráficos por separado.

Forma convexa:

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

Forma cóncava:

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

Se encuentra que las fórmulas de los resultados superior e inferior están unificadas, es decir, los lados convexos y cóncavos del cuadrilátero. Cuando se usa el producto exterior vectorial para el cálculo del área, la fórmula de cálculo es consistente y no hay sensación de golpes. .

Ahora hemos verificado un método de resolución de problemas de triángulos a cuadriláteros, que es:

Los vectores compuestos por cada vértice y el origen del polígono, en sentido contrario a las agujas del reloj (o en el sentido de las agujas del reloj, también se puede utilizar), y los dos vectores anteriores y posteriores se multiplican en cruz para encontrar el producto exterior, y los vectores de la cola y la cabeza también se multiplican en cruz (en otras palabras, es decir, los dos extremos conectados por cada borde del gráfico deben multiplicarse en cruz por la cabeza a la cola ), y luego el valor absoluto de la mitad de la suma obtenida al sumar todos los productos exteriores es el área del polígono. Ahora mismo

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

¿Se puede aplicar este método de cálculo a todos los polígonos? Probémoslo por inducción matemática.

Suponiendo que cuando hay n lados, 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}} )es verdadero, entonces agregue un punto sobre esta base en este momento a_{n+1}para convertirse en n+1 lados

Como se muestra en la figura anterior, necesitamos agregar a_{n}a_{n+1},a_{n+1}a_{1}dos bordes (la parte amarilla en la figura) y eliminar a_{n}a_{1}este borde (la línea de puntos roja en la figura), luego

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}})(Nota: Esto corresponde a agregar dos lados y quitar un lado)

=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}} )

El resultado final satisface las reglas de cálculo que resumimos anteriormente. Hasta ahora hemos obtenido teóricamente la solución del área del polígono.

 Luego, a continuación, debemos trasplantar este método de cálculo a la computadora y dejar que la computadora realice el cálculo por nosotros, por lo que debemos continuar desarrollando la fórmula de cálculo en una forma que sea conveniente para que la computadora calcule.

S_{polígono}

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{vmatriz} x_{1} & y_{1}\\ x_{2} & y_{2} \end{vmatriz} + \begin{vmatriz} x_{2} & y_{2}\ \ x_{3} & y_{3} \end{vmatriz} +...+\begin{vmatriz} x_{n} & y_{n}\\ x_{1} & y_{1} \end{vmatriz} )

=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})

Entre ellos, yo=nen ese momento , yo+1=n+1=1es decirx_{n+1}=x_{1},y_{n+1}=y_{1}

Finalmente, obtuvimos la fórmula anterior, que es el famoso teorema del cordón .

 ¿Cuáles son sus características? Tomemos prestadas imágenes de Internet, de la siguiente manera:

 

 Debido a que esta fórmula funciona como un cordón de zapatos, se llama el teorema del cordón de zapatos.

 Con el teorema del cordón de zapato, podemos convertirlo fácilmente en código.

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

Supongo que te gusta

Origin blog.csdn.net/m0_74178120/article/details/128737748
Recomendado
Clasificación