Exemplo n.º 1
0
 def test_center01(self):
     f = Facet([
         R3(0.0, 0.0, 0.0),
         R3(2.0, 0.0, 0.0),
         R3(2.0, 2.0, 0.0),
         R3(0.0, 2.0, 0.0)
     ])
     assert f.center().approx((R3(1.0, 1.0, 0.0)))
Exemplo n.º 2
0
    def __init__(self, file):

        # списки вершин, рёбер и граней полиэдра
        self.vertexes, self.edges, self.facets = [], [], []
        self.vertexes_real = []
        # сумма длин проекций всех ребер имеющих хотя бы одну "хорошую" точку
        self.sum_of_edges = 0

        # список строк файла
        with open(file) as f:
            for i, line in enumerate(f):
                if i == 0:
                    # обрабатываем первую строку; buf - вспомогательный массив
                    buf = line.split()
                    # коэффициент гомотетии
                    c = float(buf.pop(0))
                    # углы Эйлера, определяющие вращение
                    alpha, beta, gamma = (float(x) * pi / 180.0 for x in buf)
                elif i == 1:
                    # во второй строке число вершин, граней и рёбер полиэдра
                    nv, nf, ne = (int(x) for x in line.split())
                elif i < nv + 2:
                    # задание всех вершин полиэдра
                    x, y, z = (float(x) for x in line.split())
                    # test = R3(x, y, z).rz(alpha).ry(beta).rz(gamma) * c
                    # test2 = (test * (1.0 / c)).rz(-gamma).ry(-beta).rz(-alpha)
                    self.vertexes.append(
                        R3(x, y, z).rz(alpha).ry(beta).rz(gamma) * c)
                    self.vertexes_real.append(R3(x, y, z))
                    # print(f"({x,y,z}), ({test2.x}, {test2.y}, {test2.z})")

                else:
                    # вспомогательный массив
                    buf = line.split()
                    # количество вершин очередной грани
                    size = int(buf.pop(0))
                    # массив вершин этой грани
                    vertexes = list(self.vertexes[int(n) - 1] for n in buf)
                    vertexes_real = list(self.vertexes_real[int(n) - 1]
                                         for n in buf)
                    # задание рёбер грани
                    for n in range(size):
                        self.edges.append(Edge(vertexes[n - 1], vertexes[n]))
                        # if test2.point_check() or test2.point_check():
                        if vertexes_real[n - 1].point_check(
                        ) or vertexes_real[n].point_check():
                            dx = abs(self.edges[n].beg.x - self.edges[n].fin.x)
                            dy = abs(self.edges[n].beg.y - self.edges[n].fin.y)
                            self.sum_of_edges += sqrt(dx**2 + dy**2)

                    # задание самой грани
                    self.facets.append(Facet(vertexes))

        print("\nSum_of_edges = ", self.sum_of_edges, '\n')
Exemplo n.º 3
0
 def test_v_normal02(self):
     f = Facet([
         R3(0.0, 0.0, 0.0),
         R3(2.0, 0.0, 0.0),
         R3(2.0, 2.0, 0.0),
         R3(0.0, 2.0, 0.0)
     ])
     normals = [
         R3(-1.0, 0.0, 0.0),
         R3(0.0, -1.0, 0.0),
         R3(1.0, 0.0, 0.0),
         R3(0.0, 1.0, 0.0)
     ]
     for t in zip(f.v_normals(), normals):
         assert t[0].is_collinear(t[1])
Exemplo n.º 4
0
 def test_shadow_03(self):
     s = Edge(R3(0.0, 0.0, -1.0), R3(1.0, 1.0, -1.0))
     f = Facet([
         R3(0.0, 0.0, 0.0),
         R3(2.0, 0.0, 0.0),
         R3(2.0, 2.0, 0.0),
         R3(0.0, 2.0, 0.0)
     ])
     s.shadow(f)
     assert len(s.gaps) == 0
Exemplo n.º 5
0
 def test_shadow_02(self):
     s = Edge(R3(0.0, 0.0, 1.0), R3(1.0, 1.0, 1.0))
     f = Facet([
         R3(0.0, 0.0, 0.0),
         R3(2.0, 0.0, 0.0),
         R3(2.0, 2.0, 0.0),
         R3(0.0, 2.0, 0.0)
     ])
     s.shadow(f)
     assert s.gaps[0].approx(Segment(0.0, 1.0))
Exemplo n.º 6
0
class Polyedr:
    """ Полиэдр """
    # вектор проектирования
    V = R3(0.0, 0.0, 1.0)

    # Параметры конструктора: файл, задающий полиэдр
    def __init__(self, file):

        # списки вершин, рёбер и граней полиэдра
        self.vertexes, self.edges, self.facets = [], [], []
        # сумма длин проекций всех ребер имеющих хотя бы одну "хорошую" точку
        self.sum_of_edges = 0

        # список строк файла
        with open(file) as f:
            for i, line in enumerate(f):
                if i == 0:
                    # обрабатываем первую строку; buf - вспомогательный массив
                    buf = line.split()
                    # коэффициент гомотетии
                    c = float(buf.pop(0))
                    # углы Эйлера, определяющие вращение
                    alpha, beta, gamma = (float(x) * pi / 180.0 for x in buf)
                elif i == 1:
                    # во второй строке число вершин, граней и рёбер полиэдра
                    nv, nf, ne = (int(x) for x in line.split())
                elif i < nv + 2:
                    # задание всех вершин полиэдра
                    x, y, z = (float(x) for x in line.split())
                    self.vertexes.append(R3(x, y, z).rz(
                        alpha).ry(beta).rz(gamma) * c)
                else:
                    # вспомогательный массив
                    buf = line.split()
                    # количество вершин очередной грани
                    size = int(buf.pop(0))
                    # массив вершин этой грани
                    vertexes = list(self.vertexes[int(n) - 1] for n in buf)
                    # задание рёбер грани
                    for n in range(size):
                        self.edges.append(Edge(vertexes[n - 1], vertexes[n]))
                        # print(vertexes[n-1].bool, vertexes[n].bool)
                        # print(vertexes[n - 1].x, vertexes[n - 1].y,'  ||  ', vertexes[n].x, vertexes[n].y)
                        # print('[',self.edges[n].beg.x, '] ','[',self.edges[n].beg.y, '] AND ',
                        # '[',self.edges[n].fin.x, '] ','[',self.edges[n].fin.y, '] \n' )
                        if vertexes[n - 1].point_check() or vertexes[n].point_check():
                            dx = abs(self.edges[n].beg.x - self.edges[n].fin.x)
                            dy = abs(self.edges[n].beg.y - self.edges[n].fin.y)
                            self.sum_of_edges += sqrt(dx**2 + dy**2)

                    # задание самой грани
                    self.facets.append(Facet(vertexes))

        print("\nSum_of_edges = ", self.sum_of_edges, '\n')

    # Метод изображения полиэдра
    def draw(self, tk):
        tk.clean()
        for e in self.edges:
            for f in self.facets:
                e.shadow(f)
            for s in e.gaps:
                tk.draw_line(e.r3(s.beg), e.r3(s.fin))
Exemplo n.º 7
0
 def center(self):
     return sum(self.vertexes, R3(0.0, 0.0, 0.0)) * \
         (1.0 / len(self.vertexes))
Exemplo n.º 8
0
 def test_h_normal03(self):
     f = Facet([R3(1.0, 0.0, 0.0), R3(0.0, 1.0, 0.0), R3(0.0, 0.0, 1.0)])
     assert f.h_normal().is_collinear(R3(1.0, 1.0, 1.0))
Exemplo n.º 9
0
 def test_vertical02(self):
     f = Facet([R3(0.0, 0.0, 0.0), R3(0.0, 0.0, 1.0), R3(1.0, 0.0, 0.0)])
     assert f.is_vertical()
Exemplo n.º 10
0
 def test_vertical01(self):
     f = Facet([R3(0.0, 0.0, 0.0), R3(3.0, 0.0, 0.0), R3(0.0, 3.0, 0.0)])
     assert not f.is_vertical()
Exemplo n.º 11
0
 def test_intersect_05(self):
     s = Edge(R3(0.0, 0.0, 1.0), R3(1.0, 0.0, -1.0))
     a = R3(1.0, 1.0, 0.0)
     n = R3(0.0, 0.0, 1.0)
     assert s.intersect_edge_with_normal(a, n).approx(Segment(0.5, 1.0))
Exemplo n.º 12
0
 def test_intersect_03(self):
     s = Edge(R3(0.0, 0.0, 0.0), R3(1.0, 0.0, 0.0))
     a = R3(0.0, 0.0, 0.0)
     n = R3(0.0, 0.0, 1.0)
     assert s.intersect_edge_with_normal(a, n).is_degenerate()
Exemplo n.º 13
0
 def test_r303(self):
     s = Edge(R3(0.0, 0.0, -1.0), R3(1.0, 0.0, -1.0))
     assert R3(0.5, 0.0, -1.0).approx(s.r3(0.5))
Exemplo n.º 14
0
 def test_r302(self):
     s = Edge(R3(0.0, 0.0, -1.0), R3(1.0, 0.0, -1.0))
     assert s.fin.approx(s.r3(1.0))
Exemplo n.º 15
0
 def test_r301(self):
     s = Edge(R3(0.0, 0.0, -1.0), R3(1.0, 0.0, -1.0))
     assert s.beg.approx(s.r3(0.0))