diff options
author | rodri <rgl@antares-labs.eu> | 2023-01-29 23:11:05 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2023-01-29 23:11:05 +0000 |
commit | a5c6374b77610cb2bcb794551475e092d990ef8b (patch) | |
tree | 9fc77cf42281a02fbc545afead9be30206b2bd32 /sys/src/libgeometry/qball.c | |
parent | 08a080e8c2c775eda149d3e830bd4fad2c35f249 (diff) |
libgeometry revamp
Diffstat (limited to 'sys/src/libgeometry/qball.c')
-rw-r--r-- | sys/src/libgeometry/qball.c | 65 |
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)(); - } -} |