| |
| |
| #include "ext/SquarePotential.h" |
| #include <tmathutil.h> |
| #include <algorithm> |
| |
| using namespace std; |
| |
| |
| |
| void ToonzExt::SquarePotential::setParameters_(const TStroke *ref, double par, |
| double al) { |
| ref_ = ref; |
| par_ = par; |
| actionLength_ = al; |
| assert(ref_); |
| |
| strokeLength_ = ref->getLength(); |
| lengthAtParam_ = ref->getLength(par); |
| |
| |
| leftFactor_ = min(lengthAtParam_, |
| actionLength_ * 0.5); |
| |
| |
| rightFactor_ = min(strokeLength_ - lengthAtParam_, actionLength_ * 0.5); |
| |
| |
| |
| |
| range_ = 2.8; |
| } |
| |
| |
| |
| ToonzExt::SquarePotential::~SquarePotential() {} |
| |
| |
| |
| double ToonzExt::SquarePotential::value_(double value2test) const { |
| return this->compute_value(value2test); |
| } |
| |
| |
| |
| |
| double ToonzExt::SquarePotential::compute_shape(double value2test) const { |
| double x = ref_->getLength(value2test); |
| double shape = this->actionLength_ * 0.5; |
| if (isAlmostZero(shape)) shape = 1.0; |
| x = ((x - lengthAtParam_) * range_) / shape; |
| return x; |
| } |
| |
| |
| |
| double ToonzExt::SquarePotential::compute_value(double value2test) const { |
| |
| |
| |
| |
| |
| double x = 0.0; |
| double res = 0.0; |
| |
| |
| x = ref_->getLength(value2test); |
| |
| double tmp_al = actionLength_ * 0.5; |
| |
| |
| |
| |
| |
| |
| |
| if (leftFactor_ == 0.0) |
| x = 1.0 - x / tmp_al; |
| else if (rightFactor_ == 0.0) |
| x = (x - (strokeLength_ - tmp_al)) / tmp_al; |
| else { |
| if (x <= lengthAtParam_ && ((lengthAtParam_ - x) <= leftFactor_)) |
| x = (x - (lengthAtParam_ - leftFactor_)) / leftFactor_; |
| else if (x > lengthAtParam_ && ((x - lengthAtParam_) < rightFactor_)) |
| x = (rightFactor_ - (x - lengthAtParam_)) / rightFactor_; |
| else |
| x = -1; |
| } |
| |
| if (x < 0.0) return 0.0; |
| |
| |
| res = sq(x); |
| |
| return res; |
| } |
| |
| |
| |
| ToonzExt::Potential *ToonzExt::SquarePotential::clone() { |
| return new SquarePotential; |
| } |
| |
| |
| |
| |
| |