OSDN Git Service

refactoring
[meshio/pymeshio.git] / pymeshio / common.py
1 # coding: utf-8\r
2 """\r
3 common utilities.\r
4 """\r
5 import math\r
6 \r
7 def radian_to_degree(x):\r
8     """darian to deglee"""\r
9 \r
10     return x/math.pi * 180.0\r
11 \r
12 \r
13 """\r
14 common structures.\r
15 """\r
16 class ParseException(Exception):\r
17     pass\r
18 \r
19 \r
20 class Vector2(object):\r
21     """\r
22     2D coordinate for uv value\r
23     """\r
24     __slots__=['x', 'y']\r
25     def __init__(self, x=0, y=0):\r
26         self.x=x\r
27         self.y=y\r
28 \r
29     def __str__(self):\r
30         return "<%f %f>" % (self.x, self.y)\r
31 \r
32     def __getitem__(self, key):\r
33         if key==0:\r
34             return self.x\r
35         elif key==1:\r
36             return self.y\r
37         else:\r
38             assert(False)\r
39 \r
40     def to_tuple(self):\r
41         return (self.x, self.y)\r
42 \r
43 \r
44 class Vector3(object):\r
45     """\r
46     3D coordinate for vertex position, normal direction\r
47     """\r
48     __slots__=['x', 'y', 'z']\r
49     def __init__(self, x=0, y=0, z=0):\r
50         self.x=x\r
51         self.y=y\r
52         self.z=z\r
53 \r
54     def __str__(self):\r
55         return "<%f %f %f>" % (self.x, self.y, self.z)\r
56 \r
57     def __getitem__(self, key):\r
58         if key==0:\r
59             return self.x\r
60         elif key==1:\r
61             return self.y\r
62         elif key==2:\r
63             return self.z\r
64         else:\r
65             assert(False)\r
66 \r
67     def to_tuple(self):\r
68         return (self.x, self.y, self.z)\r
69 \r
70     def __add__(l, r):\r
71         return Vector3(l.x+r.x, l.y+r.y, l.z+r.z)\r
72 \r
73 \r
74 class Quaternion(object):\r
75     """\r
76     rotation representation in vmd motion\r
77     """\r
78     __slots__=['x', 'y', 'z', 'w']\r
79     def __init__(self, x=0, y=0, z=0, w=1):\r
80         self.x=x\r
81         self.y=y\r
82         self.z=z\r
83         self.w=w\r
84 \r
85     def __str__(self):\r
86         return "<%f %f %f %f>" % (self.x, self.y, self.z, self.w)\r
87 \r
88     def __mul__(self, rhs):\r
89         u=numpy.array([self.x, self.y, self.z], 'f')\r
90         v=numpy.array([rhs.x, rhs.y, rhs.z], 'f')\r
91         xyz=self.w*v+rhs.w*u+numpy.cross(u, v)\r
92         q=Quaternion(xyz[0], xyz[1], xyz[2], self.w*rhs.w-numpy.dot(u, v))\r
93         return q\r
94 \r
95     def dot(self, rhs):\r
96         return self.x*rhs.x+self.y*rhs.y+self.z*rhs.z+self.w*rhs.w\r
97 \r
98     def getMatrix(self):\r
99         sqX=self.x*self.x\r
100         sqY=self.y*self.y\r
101         sqZ=self.z*self.z\r
102         xy=self.x*self.y\r
103         xz=self.x*self.z\r
104         yz=self.y*self.z\r
105         wx=self.w*self.x\r
106         wy=self.w*self.y\r
107         wz=self.w*self.z\r
108         return numpy.array([\r
109                 # 1\r
110                 [1-2*sqY-2*sqZ, 2*xy+2*wz, 2*xz-2*wy, 0],\r
111                 # 2\r
112                 [2*xy-2*wz, 1-2*sqX-2*sqZ, 2*yz+2*wx, 0],\r
113                 # 3\r
114                 [2*xz+2*wy, 2*yz-2*wx, 1-2*sqX-2*sqY, 0],\r
115                 # 4\r
116                 [0, 0, 0, 1]],\r
117                 'f')\r
118 \r
119     def getRHMatrix(self):\r
120         x=-self.x\r
121         y=-self.y\r
122         z=self.z\r
123         w=self.w\r
124         sqX=x*x\r
125         sqY=y*y\r
126         sqZ=z*z\r
127         xy=x*y\r
128         xz=x*z\r
129         yz=y*z\r
130         wx=w*x\r
131         wy=w*y\r
132         wz=w*z\r
133         return numpy.array([\r
134                 # 1\r
135                 [1-2*sqY-2*sqZ, 2*xy+2*wz, 2*xz-2*wy, 0],\r
136                 # 2\r
137                 [2*xy-2*wz, 1-2*sqX-2*sqZ, 2*yz+2*wx, 0],\r
138                 # 3\r
139                 [2*xz+2*wy, 2*yz-2*wx, 1-2*sqX-2*sqY, 0],\r
140                 # 4\r
141                 [0, 0, 0, 1]],\r
142                 'f')\r
143 \r
144     def getRollPitchYaw(self):\r
145         m=self.getMatrix()\r
146 \r
147         roll = math.atan2(m[0, 1], m[1, 1])\r
148         pitch = math.asin(-m[2, 1])\r
149         yaw = math.atan2(m[2, 0], m[2, 2])\r
150 \r
151         if math.fabs(math.cos(pitch)) < 1.0e-6:\r
152             roll += m[0, 1] > math.pi if 0.0 else -math.pi\r
153             yaw += m[2, 0] > math.pi if 0.0 else -math.pi\r
154 \r
155         return roll, pitch, yaw\r
156 \r
157     def getSqNorm(self):\r
158         return self.x*self.x+self.y*self.y+self.z*self.z+self.w*self.w\r
159 \r
160     def getNormalized(self):\r
161         f=1.0/self.getSqNorm()\r
162         q=Quaternion(self.x*f, self.y*f, self.z*f, self.w*f)\r
163         return q\r
164 \r
165     def getRightHanded(self):\r
166         "swap y and z axis"\r
167         return Quaternion(-self.x, -self.z, -self.y, self.w)\r
168 \r
169     @staticmethod\r
170     def createFromAxisAngle(axis, rad):\r
171         q=Quaternion()\r
172         half_rad=rad/2.0\r
173         c=math.cos(half_rad)\r
174         s=math.sin(half_rad)\r
175         return Quaternion(axis[0]*s, axis[1]*s, axis[2]*s, c)\r
176 \r
177 \r
178 class RGB(object):\r
179     """\r
180     material color\r
181     """\r
182     __slots__=['r', 'g', 'b']\r
183     def __init__(self, r=0, g=0, b=0):\r
184         self.r=r\r
185         self.g=g\r
186         self.b=b\r
187 \r
188     def __getitem__(self, key):\r
189         if key==0:\r
190             return self.r\r
191         elif key==1:\r
192             return self.g\r
193         elif key==2:\r
194             return self.b\r
195         else:\r
196             assert(False)\r
197 \r
198 \r
199 class RGBA(object):\r
200     """\r
201     material color\r
202     """\r
203     __slots__=['r', 'g', 'b', 'a']\r
204     def __init__(self, r=0, g=0, b=0, a=1):\r
205         self.r=r\r
206         self.g=g\r
207         self.b=b\r
208         self.a=a\r
209 \r
210     def __getitem__(self, key):\r
211         if key==0:\r
212             return self.r\r
213         elif key==1:\r
214             return self.g\r
215         elif key==2:\r
216             return self.b\r
217         elif key==3:\r
218             return self.a\r
219         else:\r
220             assert(False)\r
221 \r