如何判断直线穿过哪些立方体
How to determine which cubes the line passes through
我一直在寻找一种方法来构建相同大小的立方体,然后通过此画一条线 space 并以该线相交的立方体坐标的形式输出结果,并用这些立方体绘制不同的颜色。这条线可以是直线也可以是曲线。
我使用 matplotlib 绘制立方体和线条。来自这些来源:
https://www.geeksforgeeks.org/how-to-draw-3d-cube-using-matplotlib-in-python/
示例代码:
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
axes = [5, 5, 5]
# Create Data
data = np.ones(axes, dtype=np.bool)
# Controll Tranperency
alpha = 0.3
# Control colour
colors = np.empty(axes + [4], dtype=np.float32)
colors[0] = [1, 0, 0, alpha] # red
colors[1] = [0, 1, 0, alpha] # green
colors[2] = [0, 0, 1, alpha] # blue
colors[3] = [1, 1, 0, alpha] # yellow
colors[4] = [1, 1, 1, alpha] # grey
# Plot figure
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x1 = [1, 4]
y1 = [0, 5]
z1 = [0, 5]
ax.plot3D(x1, y1, z1, 'black', linewidth = 5)
# Voxels is used to customizations of
# the sizes, positions and colors.
ax.voxels(data, facecolors=colors, edgecolors='grey')
result
简而言之:我需要绘制一个立方体网格并在其中画一条线。在确定这条线与哪些立方体相交后。
是否可以在 Matplotlib 中执行此操作,或者我是否需要使用其他库来解决我的问题?
天哪,我为什么要这样。
无论如何,这是一个迭代解决方案,因为我不想做线性代数。我尝试过但失败了。
# Here be dragons
def linelamb(x,y,z):
return lambda s: [int(i) for i in [x[0]+s*(x[1]-x[0]), y[0]+s*(y[1]-y[0]), z[0]+s*(z[1]-z[0])]]
line = linelamb(x1,y1,z1)
hitboxes = np.zeros(axes)
x,y,z = 0,0,0
for r in [i for i in np.arange(0,1,0.001)]:
xnew,ynew,znew = line(r)
if not (x == xnew and y == ynew and z == znew):
hitboxes[xnew,ynew,znew] = 1
x,y,z = xnew,ynew,znew
ax.voxels(hitboxes, facecolors=[0,0,0,0.5], edgecolors='black');
我花了一些额外的时间来使它更具适应性,但我的大脑停止工作了。您可能想要自适应地更改范围的步长,但祝您好运。
我一直在寻找一种方法来构建相同大小的立方体,然后通过此画一条线 space 并以该线相交的立方体坐标的形式输出结果,并用这些立方体绘制不同的颜色。这条线可以是直线也可以是曲线。
我使用 matplotlib 绘制立方体和线条。来自这些来源:
https://www.geeksforgeeks.org/how-to-draw-3d-cube-using-matplotlib-in-python/
示例代码:
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
axes = [5, 5, 5]
# Create Data
data = np.ones(axes, dtype=np.bool)
# Controll Tranperency
alpha = 0.3
# Control colour
colors = np.empty(axes + [4], dtype=np.float32)
colors[0] = [1, 0, 0, alpha] # red
colors[1] = [0, 1, 0, alpha] # green
colors[2] = [0, 0, 1, alpha] # blue
colors[3] = [1, 1, 0, alpha] # yellow
colors[4] = [1, 1, 1, alpha] # grey
# Plot figure
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x1 = [1, 4]
y1 = [0, 5]
z1 = [0, 5]
ax.plot3D(x1, y1, z1, 'black', linewidth = 5)
# Voxels is used to customizations of
# the sizes, positions and colors.
ax.voxels(data, facecolors=colors, edgecolors='grey')
result
简而言之:我需要绘制一个立方体网格并在其中画一条线。在确定这条线与哪些立方体相交后。
是否可以在 Matplotlib 中执行此操作,或者我是否需要使用其他库来解决我的问题?
天哪,我为什么要这样。
无论如何,这是一个迭代解决方案,因为我不想做线性代数。我尝试过但失败了。
# Here be dragons
def linelamb(x,y,z):
return lambda s: [int(i) for i in [x[0]+s*(x[1]-x[0]), y[0]+s*(y[1]-y[0]), z[0]+s*(z[1]-z[0])]]
line = linelamb(x1,y1,z1)
hitboxes = np.zeros(axes)
x,y,z = 0,0,0
for r in [i for i in np.arange(0,1,0.001)]:
xnew,ynew,znew = line(r)
if not (x == xnew and y == ynew and z == znew):
hitboxes[xnew,ynew,znew] = 1
x,y,z = xnew,ynew,znew
ax.voxels(hitboxes, facecolors=[0,0,0,0.5], edgecolors='black');
我花了一些额外的时间来使它更具适应性,但我的大脑停止工作了。您可能想要自适应地更改范围的步长,但祝您好运。