OSDN Git Service

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