1

这是一个用 Python 和 PyVista 制作的 Hopf 圆环:

在此处输入图像描述

import numpy as np
import pyvista as pv

A = 0.44
n = 3
def Gamma(t):
    alpha = np.pi/2 - (np.pi/2-A)*np.cos(n*t)
    beta = t + A*np.sin(2*n*t)
    return np.array([
      np.sin(alpha) * np.cos(beta),
      np.sin(alpha) * np.sin(beta),
      np.cos(alpha)
    ])

def HopfInverse(p, phi):
    return np.array([
      (1+p[2])*np.cos(phi),
      p[0]*np.sin(phi) - p[1]*np.cos(phi), 
      p[0]*np.cos(phi) + p[1]*np.sin(phi),
      (1+p[2])*np.sin(phi)
    ]) / np.sqrt(2*(1+p[2]))

def Stereo(q):
    return 2*q[0:3] / (1-q[3])

def F(t, phi):
    return Stereo(HopfInverse(Gamma(t), phi))

angle = np.linspace(0, 2 * np.pi, 300)
theta, phi = np.meshgrid(angle, angle)
x, y, z = F(theta, phi)

# Display the mesh
grid = pv.StructuredGrid(x, y, z)
grid.plot(smooth_shading=True)

颜色并不完全光滑:在右下角的叶瓣上,你可以看到一条分隔淡灰色和深灰色的线。如何摆脱这条线?

4

1 回答 1

1

我认为这里发生的情况是,结构化网格的两端没有连接信息。解决此问题的一种方法是将您的网格变成PolyData使用该extract_geometry()方法的网格,然后使用clean更大的容差。这将迫使 pyvista 意识到网格中有一个接缝,其中点被加倍,导致点被合并并且接缝闭合:

import numpy as np
import pyvista as pv

A = 0.44
n = 3
def Gamma(t):
    alpha = np.pi/2 - (np.pi/2-A)*np.cos(n*t)
    beta = t + A*np.sin(2*n*t)
    return np.array([
      np.sin(alpha) * np.cos(beta),
      np.sin(alpha) * np.sin(beta),
      np.cos(alpha)
    ])

def HopfInverse(p, phi):
    return np.array([
      (1+p[2])*np.cos(phi),
      p[0]*np.sin(phi) - p[1]*np.cos(phi), 
      p[0]*np.cos(phi) + p[1]*np.sin(phi),
      (1+p[2])*np.sin(phi)
    ]) / np.sqrt(2*(1+p[2]))

def Stereo(q):
    return 2*q[0:3] / (1-q[3])

def F(t, phi):
    return Stereo(HopfInverse(Gamma(t), phi))

angle = np.linspace(0, 2 * np.pi, 300)
theta, phi = np.meshgrid(angle, angle)
x, y, z = F(theta, phi)

# Display the mesh, show seam
grid = pv.StructuredGrid(x, y, z)
grid.plot(smooth_shading=True)

# convert to PolyData and clean to remove the seam
cleaned_poly = grid.extract_geometry().clean(tolerance=1e-6)
cleaned_poly.plot(smooth_shading=True)

没有接缝的漂亮 Hopf 圆环图

您的参数里程tolerance可能会有所不同。

就像一件小事一样,我们可以通过提取原始网格的特征边缘来可视化原始接缝:

grid.extract_feature_edges().plot()

绘图显示环形数据集边缘处的圆形和三叶草形曲线

这些曲线对应于原始网格中的开放边缘:

>>> grid.extract_surface().n_open_edges
1196

由于您的表面是封闭且防水的,因此它应该有 0 个开放边缘:

>>> cleaned_poly.n_open_edges
0
于 2021-10-05T12:37:18.297 回答