Как определить пользовательский класс векторных точек в трехмерном пространстве и рассчитать их центральную (среднюю) точку? - PullRequest
0 голосов
/ 06 февраля 2020

Я делаю программу, которая делает формы и тому подобное. Я хочу найти центр грани (предоставленной списком трехмерных векторных точек), найдя среднее значение каждой векторной точки, которая существует на нем. Вот что я пробовал:

import math

class vector:

    def __init__(self, x, y, z):

        self.x = x
        self.y = y
        self.z = z

class plane:

    def __init__(self, pointsList):

        self.vertex = []

        # check that each point is unique
        for p in range(0, len(pointsList)-1):


            for i in range(p+1, len(pointsList)):

                if (pointsList[p] != pointsList[i]):
                        if (i == len(pointsList)-1):
                            self.vertex.append(pointsList[p])

                else:
                    return None
        self.vertex.append(pointsList[-1])


    #returns the mean of x, y, and z            
    def center(self):

        xs = 0
        ys = 0
        zs = 0
        count = len(self.vertex)    

        for i in range(0, count):
            xs += self.vertex[i].x

            ys += self.vertex[i].y

            zs += self.vertex[i].z

        xMean = xs/count
        yMean = ys/count
        zMean = zs/count


        return vector(xMean, yMean, zMean)

, а затем я go для проверки функции plane.center ():

#initialize some vectors
A = vector(1,7,5)
B = vector(3,9,4)
C = vector(0,1,0)
D = vector(0,0,0)

testList = [A, B, C, D]

#initialize a plane with those vectors
plane1 = plane(testList)

acenter = plane1.center()
print('%d %d %d' % (acenter.x, acenter.y, acenter.z))

затем возвращаемый результат равен 1 4 2. I хотел среднее значение компонентов x, компонентов y и компонентов z, но 4 явно не является средним значением 7, 9, 1, and 0. Ожидаемый результат должен быть 1.0, 4.25, 2.25. Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Даже если вы решили свою проблему самостоятельно, я дам здесь два цента. Вы можете использовать Python встроенный dataclass для создания vector. Это позволит вам не создавать правила ручной работы, чтобы проверить, являются ли все vectors в списках уникальными. Вы можете напрямую использовать функцию set, чтобы убедиться, что нет повторяющихся векторов (я реорганизовал имена переменных в соответствии с PEP8)

import math
from dataclasses import dataclass
from typing import Union

# using dataclass to build the vector class
# unsafe_hash = True makes the class hashable
@dataclass(unsafe_hash=True)
class Vector:
    x: Union[int, float]
    y: Union[int, float]
    z: Union[int, float]

Теперь давайте создадим класс Plane:

class Plane:
    def __init__(self, points_list):

        self.vertex = []
        self.points_list = points_list

    def _check_unique(self):
        """Check and make sure that there are no duplicate points in the list."""
        self.vertex = list(set(self.points_list))

        return self.vertex

    # returns the mean of x, y, and z
    def center(self):

        xs = 0
        ys = 0
        zs = 0

        vertex = self._check_unique()
        count = len(vertex)

        for i in range(0, count):
            xs += vertex[i].x

            ys += vertex[i].y

            zs += vertex[i].z

        x_mean = xs / count
        y_mean = ys / count
        z_mean = zs / count

        return Vector(x_mean, y_mean, z_mean)

Теперь давайте посмотрим на них в действии:

# initialize some vectors
A = vector(1, 7, 5)
B = vector(3, 9, 4)
C = vector(0, 1, 0)
D = vector(0, 0, 0)

testList = [A, B, C, D, A, B]

# initialize a plane with those vectors
plane1 = plane(testList)

acenter = plane1.center()
print(f"{acenter.x}, {acenter.y}, {acenter.z}")

Это даст вам:

1.0, 4.25, 2.25
0 голосов
/ 07 февраля 2020

Спасибо всем. да, я вижу ошибку сейчас. это было что-то действительно простое, и я чувствую себя глупо. Я думал, что это как-то связано с тем, что мой переводчик по умолчанию набрал python 2, но это было явно далеко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...