123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- from sympy.core.symbol import symbols
- from sympy.sets.sets import FiniteSet
- from sympy.combinatorics.polyhedron import (Polyhedron,
- tetrahedron, cube as square, octahedron, dodecahedron, icosahedron,
- cube_faces)
- from sympy.combinatorics.permutations import Permutation
- from sympy.combinatorics.perm_groups import PermutationGroup
- from sympy.testing.pytest import raises
- rmul = Permutation.rmul
- def test_polyhedron():
- raises(ValueError, lambda: Polyhedron(list('ab'),
- pgroup=[Permutation([0])]))
- pgroup = [Permutation([[0, 7, 2, 5], [6, 1, 4, 3]]),
- Permutation([[0, 7, 1, 6], [5, 2, 4, 3]]),
- Permutation([[3, 6, 0, 5], [4, 1, 7, 2]]),
- Permutation([[7, 4, 5], [1, 3, 0], [2], [6]]),
- Permutation([[1, 3, 2], [7, 6, 5], [4], [0]]),
- Permutation([[4, 7, 6], [2, 0, 3], [1], [5]]),
- Permutation([[1, 2, 0], [4, 5, 6], [3], [7]]),
- Permutation([[4, 2], [0, 6], [3, 7], [1, 5]]),
- Permutation([[3, 5], [7, 1], [2, 6], [0, 4]]),
- Permutation([[2, 5], [1, 6], [0, 4], [3, 7]]),
- Permutation([[4, 3], [7, 0], [5, 1], [6, 2]]),
- Permutation([[4, 1], [0, 5], [6, 2], [7, 3]]),
- Permutation([[7, 2], [3, 6], [0, 4], [1, 5]]),
- Permutation([0, 1, 2, 3, 4, 5, 6, 7])]
- corners = tuple(symbols('A:H'))
- faces = cube_faces
- cube = Polyhedron(corners, faces, pgroup)
- assert cube.edges == FiniteSet(*(
- (0, 1), (6, 7), (1, 2), (5, 6), (0, 3), (2, 3),
- (4, 7), (4, 5), (3, 7), (1, 5), (0, 4), (2, 6)))
- for i in range(3): # add 180 degree face rotations
- cube.rotate(cube.pgroup[i]**2)
- assert cube.corners == corners
- for i in range(3, 7): # add 240 degree axial corner rotations
- cube.rotate(cube.pgroup[i]**2)
- assert cube.corners == corners
- cube.rotate(1)
- raises(ValueError, lambda: cube.rotate(Permutation([0, 1])))
- assert cube.corners != corners
- assert cube.array_form == [7, 6, 4, 5, 3, 2, 0, 1]
- assert cube.cyclic_form == [[0, 7, 1, 6], [2, 4, 3, 5]]
- cube.reset()
- assert cube.corners == corners
- def check(h, size, rpt, target):
- assert len(h.faces) + len(h.vertices) - len(h.edges) == 2
- assert h.size == size
- got = set()
- for p in h.pgroup:
- # make sure it restores original
- P = h.copy()
- hit = P.corners
- for i in range(rpt):
- P.rotate(p)
- if P.corners == hit:
- break
- else:
- print('error in permutation', p.array_form)
- for i in range(rpt):
- P.rotate(p)
- got.add(tuple(P.corners))
- c = P.corners
- f = [[c[i] for i in f] for f in P.faces]
- assert h.faces == Polyhedron(c, f).faces
- assert len(got) == target
- assert PermutationGroup([Permutation(g) for g in got]).is_group
- for h, size, rpt, target in zip(
- (tetrahedron, square, octahedron, dodecahedron, icosahedron),
- (4, 8, 6, 20, 12),
- (3, 4, 4, 5, 5),
- (12, 24, 24, 60, 60)):
- check(h, size, rpt, target)
- def test_pgroups():
- from sympy.combinatorics.polyhedron import (cube, tetrahedron_faces,
- octahedron_faces, dodecahedron_faces, icosahedron_faces)
- from sympy.combinatorics.polyhedron import _pgroup_calcs
- (tetrahedron2, cube2, octahedron2, dodecahedron2, icosahedron2,
- tetrahedron_faces2, cube_faces2, octahedron_faces2,
- dodecahedron_faces2, icosahedron_faces2) = _pgroup_calcs()
- assert tetrahedron == tetrahedron2
- assert cube == cube2
- assert octahedron == octahedron2
- assert dodecahedron == dodecahedron2
- assert icosahedron == icosahedron2
- assert sorted(map(sorted, tetrahedron_faces)) == sorted(map(sorted, tetrahedron_faces2))
- assert sorted(cube_faces) == sorted(cube_faces2)
- assert sorted(octahedron_faces) == sorted(octahedron_faces2)
- assert sorted(dodecahedron_faces) == sorted(dodecahedron_faces2)
- assert sorted(icosahedron_faces) == sorted(icosahedron_faces2)
|