156 lines
3.8 KiB
C++
156 lines
3.8 KiB
C++
|
#include "i_threejetvec.h"
|
||
|
#include "i_figureeight.h"
|
||
|
#include "i_spline.h"
|
||
|
#include "i_sphere.h"
|
||
|
|
||
|
ThreeJetVec Arc(ThreeJet u, ThreeJet v, double xsize, double ysize, double zsize) {
|
||
|
ThreeJetVec result;
|
||
|
u = u*0.25;
|
||
|
result.x = Sin (u) * Sin (v) * xsize;
|
||
|
result.y = Sin (u) * Cos (v) * ysize;
|
||
|
result.z = Cos (u) * zsize;
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Straight(ThreeJet u, ThreeJet v, double xsize, double ysize, double zsize) {
|
||
|
ThreeJetVec result;
|
||
|
u = u*0.25;
|
||
|
#if 0
|
||
|
u = (u) * (-0.15915494) + 1; /* 1/2pi */
|
||
|
#endif
|
||
|
result.x = Sin (v) * xsize;
|
||
|
result.y = Cos (v) * ysize;
|
||
|
result.z = Cos (u) * zsize;
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
ThreeJet Param1(ThreeJet x) {
|
||
|
double offset = 0;
|
||
|
x %= 4;
|
||
|
if (x > 2) { x = x+(-2); offset = 2; }
|
||
|
if (x <= 1) return x*2 + (x^2)*(-1) + offset;
|
||
|
else return (x^2) + x*(-2) + (2 + offset);
|
||
|
}
|
||
|
|
||
|
ThreeJet Param2(ThreeJet x) {
|
||
|
double offset = 0;
|
||
|
x %= 4;
|
||
|
if (x > 2) { x = x+(-2); offset = 2; }
|
||
|
if (x <= 1) return (x^2) + offset;
|
||
|
else return (x^2)*(-1) + x*4 + (-2 + offset);
|
||
|
}
|
||
|
|
||
|
static inline ThreeJet TInterp(double x) {
|
||
|
return ThreeJet(x,0,0);
|
||
|
}
|
||
|
|
||
|
ThreeJet UInterp(ThreeJet x) {
|
||
|
x %= 2;
|
||
|
if (x > 1)
|
||
|
x = x*(-1) + 2;
|
||
|
return (x^2)*3 + (x^3) * (-2);
|
||
|
}
|
||
|
|
||
|
#define FFPOW 3
|
||
|
ThreeJet FFInterp(ThreeJet x) {
|
||
|
x %= 2;
|
||
|
if (x > 1)
|
||
|
x = x*(-1) + 2;
|
||
|
x = x*1.06 + -0.05;
|
||
|
if (x < 0) return ThreeJet(0, 0, 0);
|
||
|
else if (x > 1) return ThreeJet(0, 0, 0) + 1;
|
||
|
else return (x ^ (FFPOW-1)) * (FFPOW) + (x^FFPOW) * (-FFPOW+1);
|
||
|
}
|
||
|
|
||
|
#define FSPOW 3
|
||
|
ThreeJet FSInterp(ThreeJet x) {
|
||
|
x %= 2;
|
||
|
if (x > 1)
|
||
|
x = x*(-1) + 2;
|
||
|
return ((x ^ (FSPOW-1)) * (FSPOW) + (x^FSPOW) * (-FSPOW+1)) * (-0.2);
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Stage0(ThreeJet u, ThreeJet v) {
|
||
|
return Straight(u, v, 1, 1, 1);
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Stage1(ThreeJet u, ThreeJet v) {
|
||
|
return Arc(u, v, 1, 1, 1);
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Stage2(ThreeJet u, ThreeJet v) {
|
||
|
return InterpolateVec(
|
||
|
Arc(Param1(u), v, 0.9, 0.9, -1),
|
||
|
Arc(Param2(u), v, 1, 1, 0.5),
|
||
|
UInterp(u));
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Stage3(ThreeJet u, ThreeJet v) {
|
||
|
return InterpolateVec(
|
||
|
Arc(Param1(u), v,-0.9,-0.9,-1),
|
||
|
Arc(Param2(u), v,-1, 1,-0.5),
|
||
|
UInterp(u));
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Stage4(ThreeJet u, ThreeJet v) {
|
||
|
return Arc(u, v, -1,-1, -1);
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Scene01(ThreeJet u, ThreeJet v, double t) {
|
||
|
return InterpolateVec(Stage0(u,v), Stage1(u,v), TInterp(t));
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Scene12(ThreeJet u, ThreeJet v, double t) {
|
||
|
return InterpolateVec(Stage1(u,v), Stage2(u,v), TInterp(t));
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Scene23(ThreeJet u, ThreeJet v, double t) {
|
||
|
t = TInterp(t) * 0.5;
|
||
|
double tt = (u <= 1) ? t : -t;
|
||
|
return InterpolateVec(
|
||
|
RotateZ(Arc(Param1(u), v, 0.9, 0.9,-1), ThreeJet(tt,0,0)),
|
||
|
RotateY(Arc(Param2(u), v, 1, 1, 0.5), ThreeJet(t,0,0)),
|
||
|
UInterp(u)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
ThreeJetVec Scene34(ThreeJet u, ThreeJet v, double t) {
|
||
|
return InterpolateVec(Stage3(u,v), Stage4(u,v), TInterp(t));
|
||
|
}
|
||
|
|
||
|
TwoJetVec BendIn(ThreeJet u, ThreeJet v, double t) {
|
||
|
t = TInterp(t);
|
||
|
return AddFigureEight(
|
||
|
Scene01(u, ThreeJet(0, 0, 1), t),
|
||
|
u, v, ThreeJet(0, 0, 0), FSInterp(u));
|
||
|
}
|
||
|
TwoJetVec Corrugate(ThreeJet u, ThreeJet v, double t) {
|
||
|
t = TInterp(t);
|
||
|
return AddFigureEight(
|
||
|
Stage1(u, ThreeJet(0, 0, 1)),
|
||
|
u, v, FFInterp(u) * ThreeJet(t,0,0), FSInterp(u));
|
||
|
}
|
||
|
TwoJetVec PushThrough(ThreeJet u, ThreeJet v, double t) {
|
||
|
return AddFigureEight(
|
||
|
Scene12(u,ThreeJet(0, 0, 1),t),
|
||
|
u, v, FFInterp(u), FSInterp(u));
|
||
|
}
|
||
|
TwoJetVec Twist(ThreeJet u, ThreeJet v, double t) {
|
||
|
return AddFigureEight(
|
||
|
Scene23(u,ThreeJet(0, 0, 1),t),
|
||
|
u, v, FFInterp(u), FSInterp(u));
|
||
|
}
|
||
|
|
||
|
TwoJetVec UnPush(ThreeJet u, ThreeJet v, double t) {
|
||
|
return AddFigureEight(
|
||
|
Scene34(u,ThreeJet(0, 0, 1),t),
|
||
|
u, v, FFInterp(u), FSInterp(u));
|
||
|
}
|
||
|
|
||
|
TwoJetVec UnCorrugate(ThreeJet u, ThreeJet v, double t) {
|
||
|
t = TInterp((t) * (-1) + 1);
|
||
|
return AddFigureEight(
|
||
|
Stage4(u,ThreeJet(0, 0, 1)),
|
||
|
u, v, FFInterp(u) * ThreeJet(t,0,0), FSInterp(u));
|
||
|
}
|