printrun-src/printrun/gl/trackball.py

Wed, 20 Jan 2021 10:15:13 +0100

author
mdd
date
Wed, 20 Jan 2021 10:15:13 +0100
changeset 46
cce0af6351f0
parent 15
0bbb006204fc
permissions
-rw-r--r--

updated and added new files for printrun

15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
1 # This file is part of the Printrun suite.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
2 #
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
3 # Printrun is free software: you can redistribute it and/or modify
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
4 # it under the terms of the GNU General Public License as published by
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
5 # the Free Software Foundation, either version 3 of the License, or
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
6 # (at your option) any later version.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
7 #
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
8 # Printrun is distributed in the hope that it will be useful,
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
11 # GNU General Public License for more details.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
12 #
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
13 # You should have received a copy of the GNU General Public License
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
14 # along with Printrun. If not, see <http://www.gnu.org/licenses/>.
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
16 import math
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
17
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
18 from pyglet.gl import GLdouble
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
19
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
20 def cross(v1, v2):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
21 return [v1[1] * v2[2] - v1[2] * v2[1],
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
22 v1[2] * v2[0] - v1[0] * v2[2],
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
23 v1[0] * v2[1] - v1[1] * v2[0]]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
24
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
25 def trackball(p1x, p1y, p2x, p2y, r):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
26 TRACKBALLSIZE = r
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
27
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
28 if p1x == p2x and p1y == p2y:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
29 return [0.0, 0.0, 0.0, 1.0]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
30
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
31 p1 = [p1x, p1y, project_to_sphere(TRACKBALLSIZE, p1x, p1y)]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
32 p2 = [p2x, p2y, project_to_sphere(TRACKBALLSIZE, p2x, p2y)]
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
33 a = cross(p2, p1)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
34
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
35 d = map(lambda x, y: x - y, p1, p2)
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
36 t = math.sqrt(sum(x * x for x in d)) / (2.0 * TRACKBALLSIZE)
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
37
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
38 if t > 1.0:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
39 t = 1.0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
40 if t < -1.0:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
41 t = -1.0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
42 phi = 2.0 * math.asin(t)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
43
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
44 return axis_to_quat(a, phi)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
45
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
46 def axis_to_quat(a, phi):
46
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
47 lena = math.sqrt(sum(x * x for x in a))
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
48 q = [x * (1 / lena) for x in a]
cce0af6351f0 updated and added new files for printrun
mdd
parents: 15
diff changeset
49 q = [x * math.sin(phi / 2.0) for x in q]
15
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
50 q.append(math.cos(phi / 2.0))
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
51 return q
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
52
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
53 def build_rotmatrix(q):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
54 m = (GLdouble * 16)()
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
55 m[0] = 1.0 - 2.0 * (q[1] * q[1] + q[2] * q[2])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
56 m[1] = 2.0 * (q[0] * q[1] - q[2] * q[3])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
57 m[2] = 2.0 * (q[2] * q[0] + q[1] * q[3])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
58 m[3] = 0.0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
59
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
60 m[4] = 2.0 * (q[0] * q[1] + q[2] * q[3])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
61 m[5] = 1.0 - 2.0 * (q[2] * q[2] + q[0] * q[0])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
62 m[6] = 2.0 * (q[1] * q[2] - q[0] * q[3])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
63 m[7] = 0.0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
64
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
65 m[8] = 2.0 * (q[2] * q[0] - q[1] * q[3])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
66 m[9] = 2.0 * (q[1] * q[2] + q[0] * q[3])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
67 m[10] = 1.0 - 2.0 * (q[1] * q[1] + q[0] * q[0])
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
68 m[11] = 0.0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
69
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
70 m[12] = 0.0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
71 m[13] = 0.0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
72 m[14] = 0.0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
73 m[15] = 1.0
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
74 return m
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
75
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
76
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
77 def project_to_sphere(r, x, y):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
78 d = math.sqrt(x * x + y * y)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
79 if (d < r * 0.70710678118654752440):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
80 return math.sqrt(r * r - d * d)
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
81 else:
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
82 t = r / 1.41421356237309504880
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
83 return t * t / d
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
84
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
85
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
86 def mulquat(q1, rq):
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
87 return [q1[3] * rq[0] + q1[0] * rq[3] + q1[1] * rq[2] - q1[2] * rq[1],
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
88 q1[3] * rq[1] + q1[1] * rq[3] + q1[2] * rq[0] - q1[0] * rq[2],
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
89 q1[3] * rq[2] + q1[2] * rq[3] + q1[0] * rq[1] - q1[1] * rq[0],
0bbb006204fc Added printrun sourcecode from
mbayer
parents:
diff changeset
90 q1[3] * rq[3] - q1[0] * rq[0] - q1[1] * rq[1] - q1[2] * rq[2]]

mercurial