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)))
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')
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])
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
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))
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))
def center(self): return sum(self.vertexes, R3(0.0, 0.0, 0.0)) * \ (1.0 / len(self.vertexes))
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))
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()
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()
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))
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()
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))
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))
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))