# pygts - python package for the manipulation of triangulated surfaces
#
# Copyright (C) 2009 Thomas J. Duck
# All rights reserved.
#
# Thomas J. Duck <tom.duck@dal.ca>
# Department of Physics and Atmospheric Science,
# Dalhousie University, Halifax, Nova Scotia, Canada, B3H 3J5
#
# NOTICE
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Library General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
# added by eudoxos 29.1.2011, fixes https://bugs.launchpad.net/woo/+bug/668329
## force decimal separator to be always . (decimal point), not , (decimal comma) -- unless LC_ALL is set, then we are stuck
## this was reason for bogus gts imports
## adding to woo main does not solve the problem for some reason
import locale
locale.setlocale(locale.LC_NUMERIC,'C')
## PY3K compatibility
from .._gts import *
[docs]def get_coords_and_face_indices(s,unzip=False):
"""Returns the coordinates and face indices of Surface s.
If unzip is True then four tuples are returned. The first three
are the x, y, and z coordinates for each Vertex on the Surface.
The last is a list of tuples, one for each Face on the Surface,
containing 3 indices linking the Face Vertices to the coordinate
lists.
If unzip is False then the coordinates are given in a single list
of 3-tuples.
"""
vertices = s.vertices()
coords = [v.coords() for v in vertices]
face_indices = s.face_indices(vertices)
if unzip:
x,y,z = list(zip(*coords))
return x,y,z,face_indices
else:
return vertices, coords
[docs]def cube():
"""Returns a cube of side length 2 centered at the origin."""
#
# v8 +------+ v5
# / /|
# / v1/ |
# v4 +------+ |
# | | + v6
# |(v7) | /
# | |/
# v3 +------+ v2
#
v1,v2,v3,v4=Vertex(1,1,1),Vertex(1,1,-1),Vertex(1,-1,-1),Vertex(1,-1,1)
v5,v6,v7,v8=Vertex(-1,1,1),Vertex(-1,1,-1),Vertex(-1,-1,-1),Vertex(-1,-1,1)
e12,e23,e34,e14 = Edge(v1,v2), Edge(v2,v3), Edge(v3,v4), Edge(v4,v1)
e56,e67,e78,e58 = Edge(v5,v6), Edge(v6,v7), Edge(v7,v8), Edge(v8,v5)
e15,e26,e37,e48 = Edge(v1,v5), Edge(v2,v6), Edge(v3,v7), Edge(v4,v8)
e13,e16,e18 = Edge(v1,v3), Edge(v1,v6), Edge(v1,v8)
e27,e47,e57 = Edge(v7,v2), Edge(v7,v4), Edge(v7,v5)
faces = [ Face(e12,e23,e13), Face(e13,e34,e14),
Face(e12,e26,e16), Face(e15,e56,e16),
Face(e15,e58,e18), Face(e14,e48,e18),
Face(e58,e78,e57), Face(e56,e67,e57),
Face(e26,e67,e27), Face(e37,e23,e27),
Face(e37,e47,e34), Face(e78,e48,e47) ]
faces[0].revert() # Set the orientation of the first face
s = Surface()
for face in faces:
if not face.is_compatible(s):
face.revert()
s.add(face)
return s
[docs]def tetrahedron():
"""Returns a tetrahedron of side length 2*sqrt(2) centered at origin.
The edges of the tetrahedron are perpendicular to the cardinal
directions.
"""
# v4
# +
# | \ e6
# e5 '|e4 \
# v1 . +-e3-+ v3
# / .
# ./e1. e2
# / .
# +
# v2
# Create vertices
v1 = Vertex(1,1,1)
v2 = Vertex(-1,-1,1)
v3 = Vertex(-1,1,-1)
v4 = Vertex(1,-1,-1)
# Create edges
e1 = Edge(v1,v2)
e2 = Edge(v2,v3)
e3 = Edge(v3,v1)
e4 = Edge(v1,v4)
e5 = Edge(v4,v2)
e6 = Edge(v4,v3)
# Create faces
f1 = Face(e1,e2,e3) # Bottom face
f2 = Face(e1,e4,e5) # Left face
f3 = Face(e2,e5,e6) # Right face
f4 = Face(e3,e4,e6) # Back face
# Set orientation of first face
f1.revert()
# Assemble surface
s = Surface()
for face in [f1,f2,f3,f4]:
if not face.is_compatible(s):
face.revert()
s.add(face)
return s