Объем 3-х мерного объекта с использованием 3-х координатных координат - PullRequest
0 голосов
/ 14 мая 2018

Я довольно новичок в 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, чтобы заполнить области между моими поворотами, чтобы у него была поверхность, и она работала оттуда?Заранее благодарю за любую помощь, которую кто-либо может предложить!

1 Ответ

0 голосов
/ 15 мая 2018

Я не понимаю ваш подход (я не очень хорош в Python), поэтому не могу помочь вам исправить это, но здесь был похожий вопрос с гораздо более простым решением:

https://stackoverflow.com/a/48114604/1479630

Ваша ситуация еще проще, потому что у вас в основном есть искаженная сфера, и у вас есть регулярная сетка на ее поверхности.Вы можете выполнить итерацию по всем поверхностным треугольникам и для каждого вычислить объем тетраэдра, состоящего из этого треугольника и центра объекта.Суммируя эти объемы, вы получите объем всего объекта.

...