Mayavi 结合两个隐式 3d 表面
Mayavi combining two implicit 3d surfaces
我使用 Mayavi 绘制隐式 3d 表面,我想将这些表面组合成一个图。然而,当我这样做时,我得到类似这样的东西:
我使用的代码:
import numpy as np
from mayavi import mlab
A=0.24639243776
B=5.39100472027e-17
C=1.71555149594
D=1.72967325617
E=7.50535440036
F=-1.17072847143
G=1.0
x, y, z = np.ogrid[-3:1:100j, -10:1:100j, 0:3:100j]
def Fun (x,y,z, A,B,C,D,E,F,G):
F1 = (x - A + y - B) / 2 + np.sqrt(((x - A - y + B) / 2) ** 2 + C * z ** 2)
F2 = np.sqrt(x*((F*y)/2 + (E*x)/D) + y*((F*x)/2 + (D*y)/E) + G*z**2) - np.sqrt(D*E)
F1 [F1 < 0] = F2 [F1 < 0]
return F1
Fu = Fun (x,y,z,A,B,C,D,E,F,G)
mlab.contour3d(Fu, contours = [0])
mlab.show()
问题是无论我怎么做,其中一个表面的多边形非常低!我在 Mathematica 中绘制了相同的图,它产生了一个完美的图:
我不希望获得与 Mathematica 相同质量的图,因为它是一种商业产品。但至少我希望两个表面都光滑。
如果 Mayavi 不是完成这项任务的正确工具,也许你可以推荐一些不同的东西,我可以用它来达到预期的结果。
提前致谢!
我明白了。关键是将曲面设置为 None 以进行修剪。然后可以用相同的方式绘制另一个表面。此外,对于要根据比例绘制的表面,还必须将 x、y、z 传递到 contour3d
import numpy as np
from mayavi import mlab
A=0.24639243776
B=5.39100472027e-17
C=1.71555149594
D=1.72967325617
E=7.50535440036
F=-1.17072847143
G=1.0
x, y, z = np.mgrid[-3:1:300j, -10:1:300j, 0:3:300j]
def Fun1 (x,y,z, A,B,C,D,E,F,G):
F1 = (x - A + y - B) / 2 + np.sqrt(((x - A - y + B) / 2) ** 2 + C * z ** 2)
F2 = np.sqrt(x*((F*y)/2 + (E*x)/D) + y*((F*x)/2 + (D*y)/E) + G*z**2) - np.sqrt(D*E)
F1 [F2 > 0.0] = None
return F1
def Fun2 (x,y,z, A,B,C,D,E,F,G):
F1 = (x - A + y - B) / 2 + np.sqrt(((x - A - y + B) / 2) ** 2 + C * z ** 2)
F2 = np.sqrt(x*((F*y)/2 + (E*x)/D) + y*((F*x)/2 + (D*y)/E) + G*z**2) - np.sqrt(D*E)
F2 [F1 > 0.0] = None
return F2
Fu1 = Fun1 (x,y,z,A,B,C,D,E,F,G)
Fu2 = Fun2 (x,y,z,A,B,C,D,E,F,G)
mlab.contour3d(x,y,z,Fu1, contours = [0])
mlab.contour3d(x,y,z,Fu2, contours = [0])
mlab.show()
结果如下:
我使用 Mayavi 绘制隐式 3d 表面,我想将这些表面组合成一个图。然而,当我这样做时,我得到类似这样的东西:
我使用的代码:
import numpy as np
from mayavi import mlab
A=0.24639243776
B=5.39100472027e-17
C=1.71555149594
D=1.72967325617
E=7.50535440036
F=-1.17072847143
G=1.0
x, y, z = np.ogrid[-3:1:100j, -10:1:100j, 0:3:100j]
def Fun (x,y,z, A,B,C,D,E,F,G):
F1 = (x - A + y - B) / 2 + np.sqrt(((x - A - y + B) / 2) ** 2 + C * z ** 2)
F2 = np.sqrt(x*((F*y)/2 + (E*x)/D) + y*((F*x)/2 + (D*y)/E) + G*z**2) - np.sqrt(D*E)
F1 [F1 < 0] = F2 [F1 < 0]
return F1
Fu = Fun (x,y,z,A,B,C,D,E,F,G)
mlab.contour3d(Fu, contours = [0])
mlab.show()
问题是无论我怎么做,其中一个表面的多边形非常低!我在 Mathematica 中绘制了相同的图,它产生了一个完美的图:
我不希望获得与 Mathematica 相同质量的图,因为它是一种商业产品。但至少我希望两个表面都光滑。
如果 Mayavi 不是完成这项任务的正确工具,也许你可以推荐一些不同的东西,我可以用它来达到预期的结果。
提前致谢!
我明白了。关键是将曲面设置为 None 以进行修剪。然后可以用相同的方式绘制另一个表面。此外,对于要根据比例绘制的表面,还必须将 x、y、z 传递到 contour3d
import numpy as np
from mayavi import mlab
A=0.24639243776
B=5.39100472027e-17
C=1.71555149594
D=1.72967325617
E=7.50535440036
F=-1.17072847143
G=1.0
x, y, z = np.mgrid[-3:1:300j, -10:1:300j, 0:3:300j]
def Fun1 (x,y,z, A,B,C,D,E,F,G):
F1 = (x - A + y - B) / 2 + np.sqrt(((x - A - y + B) / 2) ** 2 + C * z ** 2)
F2 = np.sqrt(x*((F*y)/2 + (E*x)/D) + y*((F*x)/2 + (D*y)/E) + G*z**2) - np.sqrt(D*E)
F1 [F2 > 0.0] = None
return F1
def Fun2 (x,y,z, A,B,C,D,E,F,G):
F1 = (x - A + y - B) / 2 + np.sqrt(((x - A - y + B) / 2) ** 2 + C * z ** 2)
F2 = np.sqrt(x*((F*y)/2 + (E*x)/D) + y*((F*x)/2 + (D*y)/E) + G*z**2) - np.sqrt(D*E)
F2 [F1 > 0.0] = None
return F2
Fu1 = Fun1 (x,y,z,A,B,C,D,E,F,G)
Fu2 = Fun2 (x,y,z,A,B,C,D,E,F,G)
mlab.contour3d(x,y,z,Fu1, contours = [0])
mlab.contour3d(x,y,z,Fu2, contours = [0])
mlab.show()
结果如下: