lunes, 30 de agosto de 2021

Cómo determinar el área de un triángulo 3D en Python

Las estimaciones de áreas 3D pasan por generar puntos triangulados 3D utilizando como base un modelo digital de elevación. Una vez generados los puntos 3D, se puede usar álgebra lineal para determinar de manera rápida el área del triángulo 3D muestrando la componente z de los puntos a partir del ráster. El área 2D sería entonces la proyección del tríangulo 3D en el plano xy.

Antes de la estimación completa de una superficie 3D, se va a crear una función para determinar el área individual de uno sólo de estos triángulos. Las fórmulas y los puntos 3D usados para calibrar la función creada fueron tomados de este vídeo de youtube. El código completo se encuentra a continuación.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np

def triangle3D_area(p1, p2, p3):
    #          x1            y1           z1
    p1p2 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]]
    #          x2            y2           z2
    p1p3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]]

    print(p1p2)
    print(p1p3)

    #y1*z2 - y2*z1, -(x1*z2 -x2*z1), x1*y2 -x2*y1
    u = [p1p2[1]*p1p3[2] - p1p3[1]*p1p2[2], 
         p1p3[0]*p1p2[2] - p1p2[0]*p1p3[2] ,
         p1p2[0]*p1p3[1] - p1p3[0]*p1p2[1]] 

    return np.linalg.norm(u)/2

p1 = [-5, 5, -5]
p2 = [1, -6, 6]
p3 = [2, -3, 4]

print(triangle3D_area(p1, p2, p3))

Una vez ejecutado el código anterior en la Python Console de QGIS 3, los resultados intermedios y el valor del área 3D coinciden con los del vídeo; tal como se presenta a continuación.

[6, -11, 11]
[7, -8, 9]
19.30673457630782

No hay comentarios: