Я пытаюсь создать набор изображений цилиндра в оттенках серого, исходя из информации о радиусе, размере и ориентации цилиндра.
Этот цилиндр должен содержаться в кубе c 3D me sh, где каждая точка сетки будет представлять пиксель.
Код будет примерно таким.
#Define meshgrid
x_ = np.linspace(0,Lx,int(Lx/vox))
y_ = np.linspace(0,Ly,int(Ly/vox))
z_ = np.linspace(0,Lz,int(Lz/vox))
X,Y,Z = np.meshgrid(x_,y_,z_,indexing='ij')
Где vox - это размер вокселя, который я ввел. Это определит 3D me sh, Матрица, из которой мы получим стек шкалы серого, будет определена как
M = np.zeros((x_.size,y_.size,z_.size),dtype=int)
Теперь нам дан цилиндр, центральная ось которого идет от точки p1 к p2, и имеет радиус r. Итак, на основе следующей ссылки Numpy маска из координат цилиндра , я создаю дополнительную сетку, содержащую все точки, принадлежащие этому цилиндру.
#Vector
v = p2 - p1
#Normalize vector
lenght = scipy.linalg.norm(v)
v = v / lenght
# make some vector not in the same direction as v
not_v = np.array([1.0, 0, 0])
if (v == not_v).all():
not_v = np.array([0, 1.0, 0])
# make vector perpendicular to v
n1 = np.cross(v, not_v)
# normalize n1
n1 = n1 / scipy.linalg.norm(n1)
# make unit vector perpendicular to v and n1
n2 = np.cross(v, n1)
#Define gridpoints for the cilinder
l_ = np.linspace(0,lenght,100)
r_ = np.linspace(0,r,10)
theeta_ = np.linspace(0,2*np.pi,10)
#define meshgrid for cilinder
L,R,Theeta = np.meshgrid(l_,r_,theeta_,indexing='ij')
Тогда я бы получил координаты xyz по этим цилиндрическим координатам.
#Transform to x, y, z coordinates
Xc, Yc, Zc = [p1[i] + v[i] * L + R * np.sin(Theeta) * n1[i] + r * np.cos(Theeta) * n2[i] for i in [0, 1, 2]]
Итак, теперь вопрос в следующем. Я определил точки сетки, которые составляют данный цилиндр в декартовых координатах. Однако проблема, с которой я сейчас сталкиваюсь, заключается в попытке сопоставить эту сетку для цилиндра с сеткой, определенной для получения стека изображений в градациях серого.
Итак, я хотел бы взять этот X c , Y c, Z c, координаты и посмотреть, каким координатам X, Y, Z они будут соответствовать, и осветить соответствующие пиксели в матрице M. Но я не вижу очевидного способа сделать это.
С уважением,