public static float getModifiedValue(float value, Shade shade) {

    if (shade.getValue() == 500) {
      return value;
    }

    float indexFloat = ((float) shade.getValue()) / 100.0f;

    int indexFloor = (int) Math.floor(indexFloat);
    int indexCeil = (int) Math.ceil(indexFloat);

    int max = mValuePercentConversion.length - 1;
    int lowerIndex = Math.min(Math.max(indexFloor, 0), max);
    int upperIndex = Math.min(Math.max(indexCeil, 0), max);

    float lowerPercent = mValuePercentConversion[lowerIndex];
    float valuePercent;
    if (lowerIndex != upperIndex) {
      float upperPercent = mValuePercentConversion[upperIndex];
      float deltaPercent = upperPercent - lowerPercent;
      float deltaIndex = upperIndex - lowerIndex;
      valuePercent = lowerPercent + (deltaPercent / deltaIndex) * (indexFloat - (float) lowerIndex);
    } else {
      valuePercent = lowerPercent;
    }

    if (shade.getValue() < 500) {
      return value + ((1.0f - value) * valuePercent);
    } else {
      return value + (value * valuePercent);
    }
  }
Example #2
0
  public Greenhouse(Timer timer, Sun sun, int numTrays, int DLI) {
    this.numTrays = numTrays;
    setPointDLI = (double) DLI;
    trays = new ArrayList<Tray>();

    Lamp lamp = new Lamp();
    lamp.setPower(true);

    Shade shade = new Shade();
    shade.setPower(true);

    LightSensor lightSensor = new LightSensor(sun, lamp, shade, setPointDLI);
    timer.addTimeSubscriber(lightSensor);
  }
  private void generateShade() {

    DCHalfEdge topEdge =
        new DCHalfEdge(
            new CompPoint(xMainTop[0][1], yMainTop[0]), new CompPoint(xMainTop[0][0], yMainTop[0]));
    shade.addEdgeWithPartner(topEdge);

    // myParent.println("left edge");
    for (int j = 0; j < curveResolution - 1; j++) {

      DCHalfEdge prevEdge = shade.edges.get(shade.edges.size() - 1);
      double dx = xMainBottom[j][0] - xMainTop[j][0];
      double dy = yMainBottom[j] - yMainTop[j];
      double edgeHeight = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));

      double yTop = prevEdge.end.getY();
      double yBottom = prevEdge.end.getY() + edgeHeight;

      DCHalfEdge leftSide =
          new DCHalfEdge(
              new CompPoint(xMainTop[j][0], yTop), new CompPoint(xMainBottom[j][0], yBottom));
      shade.addEdgeWithPartner(leftSide);
    }

    DCHalfEdge prevBottomEdge = shade.edges.get(shade.edges.size() - 1);
    DCHalfEdge bottomEdge =
        new DCHalfEdge(
            new CompPoint(xMainBottom[curveResolution - 2][0], prevBottomEdge.end.getY()),
            new CompPoint(xMainBottom[curveResolution - 2][1], prevBottomEdge.end.getY()));
    shade.addEdgeWithPartner(bottomEdge);

    // myParent.println("right edge");
    for (int j = curveResolution - 2; j >= 0; j--) {

      DCHalfEdge prevEdge = shade.edges.get(shade.edges.size() - 1);
      double dx = xMainBottom[j][0] - xMainTop[j][0];
      double dy = yMainTop[j] - yMainBottom[j];
      double edgeHeight = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));

      double yTop = prevEdge.end.getY();
      double yBottom = prevEdge.end.getY() - edgeHeight;

      DCHalfEdge rightSide =
          new DCHalfEdge(
              new CompPoint(xMainBottom[j][1], yTop), new CompPoint(xMainTop[j][1], yBottom));
      shade.addEdgeWithPartner(rightSide);
    }
    shade.completePartners();
  }
 public static float getModifiedHue(float hue, Shade shade) {
   float s = (float) shade.getValue();
   if (s > 500) {
     // Initial calculations are based on hue being in the range [0.0-1.0]
     // java has the range [0.0-360.0] so we'll do a little conversion
     hue = hue / 360.0f;
     float hueAt900 = (1.003f * hue) - 0.016f;
     hue = ((hueAt900 - hue) / ((float) 900 - (float) 500)) * (s - (float) 500) + hue;
     return hue * 360.0f;
   } else {
     return hue;
   }
 }
  public static float getModifiedSaturation(float saturation, Shade shade) {
    if (shade.getValue() == 500) {
      return saturation;
    }

    if (shade.getValue() < 500) {
      // get the saturation target @ 50:
      // clamp to 0.0
      float f = (0.136f * saturation) - 0.025f;
      float satAt50 = Math.max(f, 0.0f);
      // lerp shade 500->900
      return ((saturation - satAt50) / (500 - 50)) * (shade.getValue() - 50) + satAt50;
    } else {
      // get the saturation target @ 900:
      // quick inaccurate version:
      // 110% of the base saturation (clamped to 1.0)
      //            CGFloat satAt900 = MIN(baseSaturation * 1.10, 1.0);
      // expensive(?) accurate version
      float satAt900 =
          Math.min((-1.019f * saturation * saturation) + (2.283f * saturation) - 0.281f, 1.0f);
      // lerp shade 500->900
      return ((satAt900 - saturation) / (900 - 500)) * (shade.getValue() - 500) + saturation;
    }
  }
  public DoublyConnectedEdgeList[] renderLamp() {

    /*need to calc width and height */
    shade = new Shade(0, maxHeight);
    rib = new Rib(0, maxHeight);
    bottomBase = new Base(0, 0, "bottom");
    topBase = new Base(0, 0, "top");

    calculateDimensions();
    generateRib();
    generateShade();

    shade.translate(myParent.width / 2, myParent.height / 2);

    // add notches
    rib.addNotches(notchWidth, notchHeight, ribNotchOffset, topCirclePos, bottomCirclePos);
    calculateDimensions();

    generateBases(ribNum);

    bottomBase.addNotches(notchWidth * 2, notchHeight, ribNotchOffset, ribNum, false);
    topBase.addNotches(notchWidth * 2, notchHeight, ribNotchOffset, ribNum, false);

    bottomBase.generateHole(bottomHoleWidth);

    topBase.generateHole(topHoleWidth);

    rib.translate(myParent.width / 2, 0);

    // return all parts

    Part[] borders = new Part[4];
    borders[0] = shade;
    borders[1] = rib;
    borders[2] = topBase;
    borders[3] = bottomBase;

    return borders;
  }