summaryrefslogtreecommitdiff
path: root/sys/src/libgeometry/qball.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2023-01-29 23:11:05 +0000
committerrodri <rgl@antares-labs.eu>2023-01-29 23:11:05 +0000
commita5c6374b77610cb2bcb794551475e092d990ef8b (patch)
tree9fc77cf42281a02fbc545afead9be30206b2bd32 /sys/src/libgeometry/qball.c
parent08a080e8c2c775eda149d3e830bd4fad2c35f249 (diff)
libgeometry revamp
Diffstat (limited to 'sys/src/libgeometry/qball.c')
-rw-r--r--sys/src/libgeometry/qball.c65
1 files changed, 0 insertions, 65 deletions
diff --git a/sys/src/libgeometry/qball.c b/sys/src/libgeometry/qball.c
deleted file mode 100644
index aaf4e6dfd..000000000
--- a/sys/src/libgeometry/qball.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Ken Shoemake's Quaternion rotation controller
- */
-#include <u.h>
-#include <libc.h>
-#include <draw.h>
-#include <event.h>
-#include <geometry.h>
-#define BORDER 4
-static Point ctlcen; /* center of qball */
-static int ctlrad; /* radius of qball */
-static Quaternion *axis; /* constraint plane orientation, 0 if none */
-/*
- * Convert a mouse point into a unit quaternion, flattening if
- * constrained to a particular plane.
- */
-static Quaternion mouseq(Point p){
- double qx=(double)(p.x-ctlcen.x)/ctlrad;
- double qy=(double)(p.y-ctlcen.y)/ctlrad;
- double rsq=qx*qx+qy*qy;
- double l;
- Quaternion q;
- if(rsq>1){
- rsq=sqrt(rsq);
- q.r=0.;
- q.i=qx/rsq;
- q.j=qy/rsq;
- q.k=0.;
- }
- else{
- q.r=0.;
- q.i=qx;
- q.j=qy;
- q.k=sqrt(1.-rsq);
- }
- if(axis){
- l=q.i*axis->i+q.j*axis->j+q.k*axis->k;
- q.i-=l*axis->i;
- q.j-=l*axis->j;
- q.k-=l*axis->k;
- l=sqrt(q.i*q.i+q.j*q.j+q.k*q.k);
- if(l!=0.){
- q.i/=l;
- q.j/=l;
- q.k/=l;
- }
- }
- return q;
-}
-void qball(Rectangle r, Mouse *m, Quaternion *result, void (*redraw)(void), Quaternion *ap){
- Quaternion q, down;
- Point rad;
- axis=ap;
- ctlcen=divpt(addpt(r.min, r.max), 2);
- rad=divpt(subpt(r.max, r.min), 2);
- ctlrad=(rad.x<rad.y?rad.x:rad.y)-BORDER;
- down=qinv(mouseq(m->xy));
- q=*result;
- for(;;){
- *m=emouse();
- if(!m->buttons) break;
- *result=qmul(q, qmul(down, mouseq(m->xy)));
- (*redraw)();
- }
-}