def trackball(p1x, p1y, p2x, p2y, r): TRACKBALLSIZE = r #float a[3]; /* Axis of rotation */ #float phi; /* how much to rotate about axis */ #float p1[3], p2[3], d[3]; #float t; if (p1x == p2x and p1y == p2y): return [0.0, 0.0, 0.0, 1.0] p1 = [p1x, p1y, project_to_sphere(TRACKBALLSIZE, p1x, p1y)] p2 = [p2x, p2y, project_to_sphere(TRACKBALLSIZE, p2x, p2y)] a = stltool.cross(p2, p1) d = map(lambda x, y: x - y, p1, p2) t = math.sqrt(sum(map(lambda x: x * x, d))) / (2.0 * TRACKBALLSIZE) if (t > 1.0): t = 1.0 if (t < -1.0): t = -1.0 phi = 2.0 * math.asin(t) return axis_to_quat(a, phi)
def vrot(v, axis, angle): kxv = stltool.cross(axis, v) kdv = sum(map(lambda x, y: x * y, axis, v)) return list( map( lambda x, y, z: x * math.cos(angle) + y * math.sin( angle) + z * kdv * (1.0 - math.cos(angle)), v, kxv, axis))
def vrot(v, axis, angle): kxv = stltool.cross(axis, v) kdv = sum(map(lambda x, y: x * y, axis, v)) return map( lambda x, y, z: x * math.cos(angle) + y * math.sin(angle) + z * kdv * (1.0 - math.cos(angle)), v, kxv, axis, )
def genline(self, i, h, w): S = i[0][:3] E = i[1][:3] v = map(lambda x, y: x - y, E, S) vlen = math.sqrt(float(sum(map(lambda a: a * a, v[:3])))) if vlen == 0: vlen = 0.01 sq2 = math.sqrt(2.0) / 2.0 htw = float(h) / w d = w / 2.0 if i[1][3] == i[0][3]: d = 0.05 points = [ [d, 0, 0], [sq2 * d, sq2 * d, 0], [0, d, 0], [-sq2 * d, sq2 * d, 0], [-d, 0, 0], [-sq2 * d, -sq2 * d, 0], [0, -d, 0], [sq2 * d, -sq2 * d, 0], ] axis = stltool.cross([0, 0, 1], v) alen = math.sqrt(float(sum(map(lambda a: a * a, v[:3])))) if alen > 0: axis = map(lambda m: m / alen, axis) angle = math.acos(v[2] / vlen) def vrot(v, axis, angle): kxv = stltool.cross(axis, v) kdv = sum(map(lambda x, y: x * y, axis, v)) return map( lambda x, y, z: x * math.cos(angle) + y * math.sin(angle) + z * kdv * (1.0 - math.cos(angle)), v, kxv, axis, ) points = map(lambda x: vrot(x, axis, angle), points) points = map(lambda x: [x[0], x[1], htw * x[2]], points) def vadd(v, o): return map(sum, zip(v, o)) spoints = map(lambda x: vadd(S, x), points) epoints = map(lambda x: vadd(E, x), points) return spoints, epoints, S, E
def genline(self, i, h, w): S = i[0][:3] E = i[1][:3] v = map(lambda x, y: x - y, E, S) vlen = math.sqrt(float(sum(map(lambda a: a * a, v[:3])))) if vlen == 0: vlen = 0.01 sq2 = math.sqrt(2.0) / 2.0 htw = float(h) / w d = w / 2.0 if i[1][3] == i[0][3]: d = 0.05 points = [[d, 0, 0], [sq2 * d, sq2 * d, 0], [0, d, 0], [-sq2 * d, sq2 * d, 0], [-d, 0, 0], [-sq2 * d, -sq2 * d, 0], [0, -d, 0], [sq2 * d, -sq2 * d, 0] ] axis = stltool.cross([0, 0, 1], v) alen = math.sqrt(float(sum(map(lambda a: a * a, v[:3])))) if alen > 0: axis = map(lambda m: m / alen, axis) angle = math.acos(v[2] / vlen) def vrot(v, axis, angle): kxv = stltool.cross(axis, v) kdv = sum(map(lambda x, y: x * y, axis, v)) return map(lambda x, y, z: x * math.cos(angle) + y * math.sin(angle) + z * kdv * (1.0 - math.cos(angle)), v, kxv, axis) points = map(lambda x: vrot(x, axis, angle), points) points = map(lambda x: [x[0], x[1], htw * x[2]], points) def vadd(v, o): return map(sum, zip(v, o)) spoints = map(lambda x: vadd(S, x), points) epoints = map(lambda x: vadd(E, x), points) return spoints, epoints, S, E
def genline(self, i, h, w): S = i[0][:3] E = i[1][:3] v = list(map(lambda x, y: x - y, E, S)) vlen = math.sqrt(float(sum([a * a for a in v[:3]]))) if vlen == 0: vlen = 0.01 sq2 = math.sqrt(2.0) / 2.0 htw = float(h) / w d = w / 2.0 if i[1][3] == i[0][3]: d = 0.05 points = [[d, 0, 0], [sq2 * d, sq2 * d, 0], [0, d, 0], [-sq2 * d, sq2 * d, 0], [-d, 0, 0], [-sq2 * d, -sq2 * d, 0], [0, -d, 0], [sq2 * d, -sq2 * d, 0]] axis = stltool.cross([0, 0, 1], v) alen = math.sqrt(float(sum([a * a for a in v[:3]]))) if alen > 0: axis = [m / alen for m in axis] angle = math.acos(v[2] / vlen) def vrot(v, axis, angle): kxv = stltool.cross(axis, v) kdv = sum(map(lambda x, y: x * y, axis, v)) return list( map( lambda x, y, z: x * math.cos(angle) + y * math.sin( angle) + z * kdv * (1.0 - math.cos(angle)), v, kxv, axis)) points = [vrot(x, axis, angle) for x in points] points = [[x[0], x[1], htw * x[2]] for x in points] def vadd(v, o): return list(map(sum, list(zip(v, o)))) spoints = [vadd(S, x) for x in points] epoints = [vadd(E, x) for x in points] return spoints, epoints, S, E