Real l = a*tl*tl*tl + b*tl*tl + c*tl + d;
Real u = a*tu*tu*tu + b*tu*tu + c*tu + d;
if ((l < 0 && u < 0) || (l > 0 && u > 0))
- return;
+ Debug("Discarding segment (no roots) l = %f (%f), u = %f (%f)", tl, l, tu, u);
+ //return;
bool negative = (u < l); // lower point > 0, upper point < 0
+ Debug("%ft^3 + %ft^2 + %ft + %f is negative (%f < %f) %d", a,b,c,d,u,l, negative);
while (tu - tl > delta)
{
Real t(tu+tl);
Real tu(max);
Real tl(min);
vector<Real> turns(SolveQuadratic(a*3, b*2, c));
- //Debug("%u turning points", turns.size());
+ Debug("%u turning points", turns.size());
for (unsigned i = 1; i < turns.size(); ++i)
{
tu = turns[i];
tu = max;
CubicSolveSegment(roots, a, b, c, d, tl, tu,delta);
return roots;
- /*
- Real maxi(100);
- Real prevRes(d);
- for(int i = 0; i <= 100; ++i)
- {
- Real x(i);
- x /= maxi;
- Real y = a*(x*x*x) + b*(x*x) + c*x + d;
- if (((y < Real(0)) && (prevRes > Real(0))) || ((y > Real(0)) && (prevRes < Real(0))))
- {
- //Debug("Found root of %fx^3 + %fx^2 + %fx + %f at %f (%f)", a, b, c, d, x, y);
- roots.push_back(x);
- }
- prevRes = y;
- }
- return roots;
- */
}
/**
{
return pair<Real,Real>(0, 1);
}
- Real a = (3*(p1-p2) + p3 - p0);
- Real b = 2*(p2 - 2*p1 + p0);
+ Real a = ((p1-p2)*3 + p3 - p0);
+ Real b = (p2 - p1*2 + p0)*2;
Real c = (p1-p0);
if (a == 0)
{
return pair<Real, Real>(t, t);
}
//Debug("a, b, c are %f, %f, %f", Float(a), Float(b), Float(c));
- if (b*b - 4*a*c < 0)
+ if (b*b - a*c*4 < 0)
{
//Debug("No real roots");
return pair<Real, Real>(0,1);