Я довольно новичок в Python и думаю, что пытаюсь сделать что-то довольно сложное?Я неоднократно пытался найти это и думаю, что мне не хватает некоторых базовых знаний, поскольку я, честно говоря, не понимаю, что я прочитал.
Фактически у меня есть 3 массива, которые содержат x точек, y точек,и z баллов.Они создают приблизительно полусферическую форму.У меня есть эти точки: взять контур двухмерной осесимметричной полукруглой формы, выделить из него x-точки и y-точки в отдельные массивы и создать массив нулей "z points" той же длины, что и два предыдущих массива.
После этого я поворачиваю y-точки в z-область, используя углы, чтобы создать 3D-аппроксимацию 2D-контура.
Эта 3D-форма полностью ограничена (в том смысле, что она создает как дно, так ивверху), как указано ниже:
3D-аппроксимация
Я вырезал следующий код из моей гораздо более длинной программы, это единственная часть, которая имеет отношение к моейоднако вопрос:
c, contours, _ = cv2.findContours(WB, mode = cv2.RETR_EXTERNAL, method = cv2.CHAIN_APPROX_NONE) # Find new contours in recently bisected mask
contours = sorted (contours, key = cv2.contourArea, reverse = True) # # Sort contours (there is only 2 contours left, plinth/background, and droplet)
contour = contours[1] # Second longest contour is the desired contour
xpointsList = [xpoints[0][0] for xpoints in contour] # Create new array of all x co-ordinates
ypointsList = [ypoints[0][1] for ypoints in contour] # Create new array of all y co-ordinates
zpointsList = np.zeros(len(xpointsList)) # # Create an array of 0 values to represent the z domain. True contour sits at 0 on all points in the z-domain
angles = np.arange(0,180,5, dtype = int) # # Creating an array of angles between to form a full drop in degrees of 5
i = 0
b = 0
d = 0
qx = np.zeros(len(xpointsList)*len(angles)) # Setting variable to equal the length of x points times the length of iterative angle calculations
qy = np.zeros(len(ypointsList)*len(angles)) # Setting variable to equal the length of x points times the length of iterative angle calculations
qz = np.zeros(len(zpointsList)*len(angles)) # Setting variable to equal the length of x points times the length of iterative angle calculations
ax = plt.axes(projection='3d')
for b in range(0,len(angles)):
angle = angles[b]
for i in range(0,len(ypointsList)):
qx[i+d] = xpointsList[i]-origin[0] # Setting the x-axis to equal it's current values around the origin
qz[i+d] = origin[0] + math.cos(math.radians(angle)) * (zpointsList[i]) - math.sin(math.radians(angle)) * (ypointsList[i] - origin[1]) # creating a z value based on 10 degree rotations of the y values around the x axis
qy[i+d] = origin[1] + math.sin(math.radians(angle)) * (zpointsList[i]) + math.cos(math.radians(angle)) * (ypointsList[i] - origin[1]) # adapting the y value based on the creation of the z values.
i = i + 1
b = b + 1
d = d + len (xpointsList)
ax.plot3D (qy, qz, qx, color = 'blue', linewidth = 0.1)
По сути, мой вопрос заключается в том, как мне использовать эту структуру, чтобы каким-то образом найти объем, используя массивы координат?Я думаю, что мне нужно использовать какой-то scipy.spatial ConvexHull, чтобы заполнить области между моими поворотами, чтобы у него была поверхность, и она работала оттуда?Заранее благодарю за любую помощь, которую кто-либо может предложить!