最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

python - find_simplex not finding some triangles - Stack Overflow

programmeradmin1浏览0评论

I'm trying to dive a domain (in this case is a surface in 4 segments), this is how the surface is created and how I create the segments and check if a triangle is inside a segment

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
from mpl_toolkits.mplot3d import Axes3D
from utilidades import d2r, mag, r2d, test_creation
from sun import sun3, sun_reflection, normal_distribution, ray_count
from scipy.spatial import Delaunay, ConvexHull
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from matplotlib.tri import Triangulation




# Definimos los parámetros a, b, c
a = 40  # Semieje en x
b = 35  # Semieje en y
c = 20 # Semieje en z
dx=11

theta = np.linspace(d2r(30), d2r(50), dx) #ultimo parametro indica la cantidad de puntos de malla
phi = np.linspace(d2r(50),d2r(130),dx)
theta, phi = np.meshgrid(theta, phi)

x_e = a * np.cos(phi) * np.sin(theta)
y_e = b  * np.sin(phi) * np.sin(theta)
z_e = c  * np.cos(theta) 

##Superficie cilindrica
R=20 #supongamos que cm
h=x_e.min() #supongamos que cm

thet=np.linspace(d2r(0), d2r(75), dx)
x=np.linspace(-h, h, dx)
thet, x= np.meshgrid(thet, x)
y = R * np.cos(thet)
z = R * np.sin(thet)


# Aplanar los datos para formar una lista de puntos
points_2D = np.column_stack((theta.ravel(), phi.ravel()))  # Coordenadas paramétricas
points_3D = np.column_stack((x_e.ravel(), y_e.ravel(), z_e.ravel()))  # Coordenadas en la elipsoide


# Triangulación de Delaunay en el espacio paramétrico
tri = Delaunay(points_2D)

centr_tri = np.array([np.mean(points_3D[simplex], axis=0) for simplex in tri.simplices])

# Dividir el dominio paramétrico en 4 secciones
theta_mid = (theta.min() + theta.max()) / 2
phi_mid = (phi.min() + phi.max()) / 2

def create_division(first_parameter, second_parameter, mesh_poitns_2D, num_sections =4):
    middle_point_1 = (first_parameter.min() + first_parameter.max()) / (num_sections / 2)
    middle_point_2 = (second_parameter.min() + second_parameter.max()) / (num_sections / 2)


    segments = [
        mesh_poitns_2D[(first_parameter.ravel() <= middle_point_1) & (second_parameter.ravel() <= middle_point_2)],
        mesh_poitns_2D[(first_parameter.ravel() <= middle_point_1) & (second_parameter.ravel() >= middle_point_2)],
        mesh_poitns_2D[(first_parameter.ravel() >= middle_point_1) & (second_parameter.ravel() <= middle_point_2)],
        mesh_poitns_2D[(first_parameter.ravel() >= middle_point_1) & (second_parameter.ravel() >= middle_point_2)]
    ]

    return segments

def tri_in_segment(tri, sections):
    triangles =[]

    for i in range(len(sections)):
        tri_petenence = tri.find_simplex(sections[i])
        print(tri_petenence)
        triangles.append(tri_petenence)

    return triangles

seg = create_division(theta, phi, points_2D)

triangles = tri_in_segment(tri, seg)

When I plot the triangles, I can see that despite some triangles being inside the segment they are treated as if they aren't inside the segment

For better viewing I will show the polar representation of the surface

发布评论

评论列表(0)

  1. 暂无评论