class Vec { double X=0, Y=0, Z=0; public static final int MOUSE = 0; public static final int PMOUSE = 1; Vec() {} Vec(int t) { if (t==MOUSE) { X=mouseX; Y=mouseY; } else if (t==PMOUSE) { X=pmouseX; Y=pmouseY; } } Vec(double x, double y) { X=x;Y=y;} Vec(double x, double y, double z) { X=x;Y=y;Z=z; } Vec(Vec v) {X=v.X;Y=v.Y;Z=v.Z;} void set(double x, double y) { X=x;Y=y; } void set(double x, double y, double z) { X=x;Y=y;Z=z; } void set(Vec v) {X=v.X;Y=v.Y;Z=v.Z;} void add(double x, double y) { X+=x;Y+=y; } void add(double x, double y, double z) { X+=x;Y+=y;Z+=z; } void add(Vec v) { X+=v.X;Y+=v.Y;Z+=v.Z; } boolean equals(Vec v) { return (X==v.X&&Y==v.Y&&Z==v.Z); } void sub(double x, double y) { X-=x;Y-=y; } void sub(double x, double y, double z) { X-=x;Y-=y;Z-=z; } void sub(Vec v) { X-=v.X;Y-=v.Y;Z-=v.Z; } void mul(double p) { X*=p;Y*=p;Z*=p; } void div(double p) { if (p!=0) { X/=p;Y/=p;Z/=p; } else throw new Error("Vector division by zero in div("+p+");"); } void setLen(double l) { if (l==0) { set(0,0,0); } else { double len = len(); if (len!=0) { double fac = l/len; X*=fac; Y*=fac; Z*=fac; } else throw new Error("Vector division by zero - cannot setLen a nullVector"); } } double len() { return Math.sqrt(X*X+Y*Y+Z*Z); } double lenSq() { return (X*X+Y*Y+Z*Z); } void rotX(double rd) { double SIN=Math.sin(rd); double COS=Math.cos(rd); double yn=Y*COS-Z*SIN; double zn=Z*COS+Y*SIN; Y=yn; Z=zn; } void rotY(double rd) { double SIN=Math.sin(rd); double COS=Math.cos(rd); double xn=X*COS-Z*SIN; double zn=Z*COS+X*SIN; X=xn; Z=zn; } void rotZ(double rd) { double SIN=Math.sin(rd); double COS=Math.cos(rd); double xn=X*COS-Y*SIN; double yn=Y*COS+X*SIN; X=xn; Y=yn; } String toString() { return (nf((float)X,1,6)+","+nf((float)Y,1,6)+","+nf((float)Z,1,6)); } } Vec vecAdd(Vec a, Vec b) { return new Vec(a.X+b.X,a.Y+b.Y,a.Z+b.Z); } Vec vecSub(Vec a, Vec b) { return new Vec(a.X-b.X,a.Y-b.Y,a.Z-b.Z); } Vec vecMul(Vec a, double p) { return new Vec(a.X*p,a.Y*p,a.Z*p); } Vec vecDiv(Vec a, double p) { if (p!=0) return new Vec(a.X/p,a.Y/p,a.Z/p); else throw new Error("Vector division by zero in vecDiv("+a.toString()+","+p+");"); } void line(Vec a, Vec b) { line((float)a.X,(float)a.Y,(float)a.Z,(float)b.X,(float)b.Y,(float)b.Z); }