[Helix] Move spoke calculation to separate routine
authorShaheen Gandhi <shaheen@fb.com>
Mon, 19 Aug 2013 03:18:10 +0000 (20:18 -0700)
committerShaheen Gandhi <shaheen@fb.com>
Tue, 20 Aug 2013 07:18:30 +0000 (00:18 -0700)
ShaheenGandhi.pde

index a11d9caffbcbf5b4e81710610dbd7d1a56b449cf..09f513f383d484f9379806685f017c7d725d691a 100644 (file)
@@ -134,24 +134,24 @@ class HelixPattern extends SCPattern {
 
   private final BasicParameter helix1On = new BasicParameter("H1ON", 1);
   private final BasicParameter helix2On = new BasicParameter("H2ON", 1);
-
   private final BasicParameter basePairsOn = new BasicParameter("BPON", 1);
-  private final BasicParameter spokePeriodParam = new BasicParameter("SPPD", 0.40);
-  private final BasicParameter spokePhaseParam = new BasicParameter("SPPH", 0.25);
 
   private static final float helixCoilPeriod = 100;
   private static final float helixCoilRadius = 45;
   private static final float helixCoilGirth = 20;
   private static final float helixCoilRotationPeriod = 10000;
 
+  private static final float spokePeriod = 40;
+  private static final float spokeGirth = 10;
+  private static final float spokePhase = 10;
+  private static final float spokeRadius = 35; // helixCoilRadius - helixCoilGirth*.5f;
+
   public HelixPattern(GLucose glucose) {
     super(glucose);
 
     addParameter(helix1On);
     addParameter(helix2On);
     addParameter(basePairsOn);
-    addParameter(spokePhaseParam);
-    addParameter(spokePeriodParam);
 
     PVector origin = new PVector(100, 50, 45);
     PVector axis = new PVector(1,0,0);
@@ -171,15 +171,32 @@ class HelixPattern extends SCPattern {
       PI,
       helixCoilRotationPeriod);
   }
+  
+  private color calculateSpokeColor(final color h1c, final color h2c, final PVector pt) {
+    // Find the closest spoke's t-value and calculate its
+    // axis.  Until everything animates in the model reference
+    // frame, this has to be calculated at every step because
+    // the helices rotate.
+    float t = h1.getAxis().getTValue(pt) + spokePhase;
+    float spokeAxisTValue = floor(((t + spokePeriod/2) / spokePeriod)) * spokePeriod;
+    PVector h1point = h1.pointOnToroidalAxis(spokeAxisTValue);
+    PVector h2point = h2.pointOnToroidalAxis(spokeAxisTValue);
+    PVector spokeVector = PVector.sub(h2point, h1point);
+    spokeVector.normalize();
+    Line spokeLine = new Line(h1point, spokeVector);
+    float spokeLength = PVector.dist(h1point, h2point);
+    // TODO(shaheen) investigate why h1.getAxis().getPointAt(spokeAxisTValue) doesn't quite
+    // have the same value.
+    PVector spokeCenter = PVector.add(h1point, PVector.mult(spokeVector, spokeLength/2.f));
+    PVector pointOnSpoke = spokeLine.projectPoint(pt);
+    float b = ((PVector.dist(pt, pointOnSpoke) < spokeGirth) && (PVector.dist(pointOnSpoke, spokeCenter) < spokeRadius)) ? 100.f : 0.f;
+    return color(100, 80.f, b);
+  }
 
   void run(int deltaMs) {
     boolean h1on = helix1On.getValue() > 0.5;
     boolean h2on = helix2On.getValue() > 0.5;
     boolean spokesOn = (float)basePairsOn.getValue() > 0.5;
-    float spokePeriod = (float)spokePeriodParam.getValue() * 100 + 1;
-    float spokeGirth = 10;
-    float spokePhase = (float)spokePhaseParam.getValue() * spokePeriod;
-    float spokeRadius = helixCoilRadius - helixCoilGirth*.5f;
 
     h1.step(deltaMs);
     h2.step(deltaMs);
@@ -188,40 +205,7 @@ class HelixPattern extends SCPattern {
       PVector pt = new PVector(p.x,p.y,p.z);
       color h1c = h1.colorOfPoint(pt);
       color h2c = h2.colorOfPoint(pt);
-
-      // Find the closest spoke's t-value and calculate its
-      // axis.  Until everything animates in the model reference
-      // frame, this has to be calculated at every step because
-      // the helices rotate.
-      float t = h1.getAxis().getTValue(pt) + spokePhase;
-      float spokeAxisTValue = floor(((t + spokePeriod/2) / spokePeriod)) * spokePeriod;
-      PVector h1point = h1.pointOnToroidalAxis(spokeAxisTValue);
-      PVector h2point = h2.pointOnToroidalAxis(spokeAxisTValue);
-      PVector spokeVector = PVector.sub(h2point, h1point);
-      spokeVector.normalize();
-      Line spokeLine = new Line(h1point, spokeVector);
-      float spokeLength = PVector.dist(h1point, h2point);
-      // TODO(shaheen) investigate why h1.getAxis().getPointAt(spokeAxisTValue) doesn't quite
-      // have the same value.
-      PVector spokeCenter = PVector.add(h1point, PVector.mult(spokeVector, spokeLength/2.f));
-      PVector spokeStart = PVector.add(spokeCenter, PVector.mult(spokeLine.getVector(), -spokeRadius));
-      PVector spokeEnd = PVector.add(spokeCenter, PVector.mult(spokeLine.getVector(), spokeRadius));
-      float spokeStartTValue = spokeLine.getTValue(spokeStart);
-      float spokeEndTValue = spokeLine.getTValue(spokeEnd);
-      PVector pointOnSpoke = spokeLine.projectPoint(pt);
-      float projectedTValue = spokeLine.getTValue(pointOnSpoke);
-      float percentage = constrain(PVector.dist(pointOnSpoke, spokeStart) / spokeLength, 0.f, 1.f);
-      float b = ((PVector.dist(pt, pointOnSpoke) < spokeGirth) && (PVector.dist(pointOnSpoke, spokeCenter) < spokeRadius)) ? 100.f : 0.f;
-
-      color spokeColor;
-
-      if (spokeStartTValue < spokeEndTValue) {
-        spokeColor = lerpColor(h1c, h2c, percentage);
-      } else {
-        spokeColor = lerpColor(h2c, h1c, percentage);
-      }
-
-      spokeColor = color(hue(spokeColor), 80.f, b);
+      color spokeColor = calculateSpokeColor(h1c, h2c, pt);
 
       if (!h1on) {
         h1c = color(0,0,0);