HyCodeYourTale
classpublicPriority 3

InterpolatedCurve

com.hypixel.hytale.builtin.hytalegenerator.framework.math.InterpolatedCurve

implements Double2DoubleFunction

2

Methods

2

Public Methods

6

Fields

1

Constructors

Constructors

public
InterpolatedCurve(double positionA, double positionB, double smoothTransition, Double2DoubleFunction functionA, Double2DoubleFunction functionB)

Methods

Public Methods (2)

public
double get(double x)
public
double transitionCurve(double ratio)

Fields

Private/Package Fields (6)

privatedouble distance
privateDouble2DoubleFunction functionA
privateDouble2DoubleFunction functionB
privatedouble positionA
privatedouble positionB
privatedouble smoothTransition

Inheritance

Parent
Current
Interface
Child

Use mouse wheel to zoom, drag to pan. Click nodes to navigate.

Source Code

package com.hypixel.hytale.builtin.hytalegenerator.framework.math;

import it.unimi.dsi.fastutil.doubles.Double2DoubleFunction;
import javax.annotation.Nonnull;

public class InterpolatedCurve implements Double2DoubleFunction {
   @Nonnull
   private final Double2DoubleFunction functionA;
   @Nonnull
   private final Double2DoubleFunction functionB;
   private final double positionA;
   private final double positionB;
   private final double distance;
   private final double smoothTransition;

   public InterpolatedCurve(
      double positionA, double positionB, double smoothTransition, @Nonnull Double2DoubleFunction functionA, @Nonnull Double2DoubleFunction functionB
   ) {
      if (!(smoothTransition < 0.0) && !(smoothTransition > 1.0)) {
         this.smoothTransition = smoothTransition;
         this.positionA = Math.min(positionA, positionB);
         this.positionB = Math.max(positionA, positionB);
         this.distance = positionB - positionA;
         this.functionA = functionA;
         this.functionB = functionB;
      } else {
         throw new IllegalArgumentException();
      }
   }

   public double get(double x) {
      if (x < this.positionA) {
         return this.functionA.get(x);
      } else if (x > this.positionB) {
         return this.functionB.get(x);
      } else if (this.distance == 0.0) {
         return (this.functionA.get(x) + this.functionB.get(x)) * 0.5;
      } else {
         double bRatio = this.transitionCurve((x - this.positionA) / this.distance);
         double aRatio = 1.0 - bRatio;
         return aRatio * this.functionA.get(x) + bRatio * this.functionB.get(x);
      }
   }

   public double transitionCurve(double ratio) {
      double a = ratio * 3.141592653589793;
      double v = Math.cos(a);
      v++;
      v /= 2.0;
      v = 1.0 - v;
      return v * this.smoothTransition + ratio * (1.0 - this.smoothTransition);
   }
}