summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/path.cc
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-03-27 22:27:57 +0000
committerKarl Berry <karl@freefriends.org>2019-03-27 22:27:57 +0000
commit9121faed0cf54a08882acf41120cf28fc3a32998 (patch)
treefe7f0c5e9ed02fe4a1fc389c27c88750c2807e43 /Build/source/utils/asymptote/path.cc
parentb8e24fbf964b4030f68a8484a53d405869693266 (diff)
asy 2.48 sources
git-svn-id: svn://tug.org/texlive/trunk@50622 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/path.cc')
-rw-r--r--Build/source/utils/asymptote/path.cc46
1 files changed, 24 insertions, 22 deletions
diff --git a/Build/source/utils/asymptote/path.cc b/Build/source/utils/asymptote/path.cc
index dce0cef63c5..a5988b425bc 100644
--- a/Build/source/utils/asymptote/path.cc
+++ b/Build/source/utils/asymptote/path.cc
@@ -18,11 +18,11 @@
namespace camp {
-const double Fuzz=1000.0*DBL_EPSILON;
-const double BigFuzz=10.0*Fuzz;
-const double Fuzz2=Fuzz*Fuzz;
-const double sqrtFuzz=sqrt(Fuzz);
-const double fuzzFactor=10.0;
+const double Fuzz2=1000.0*DBL_EPSILON;
+const double Fuzz=sqrt(Fuzz2);
+const double Fuzz4=Fuzz2*Fuzz2;
+const double BigFuzz=10.0*Fuzz2;
+const double fuzzFactor=100.0;
const double third=1.0/3.0;
@@ -49,8 +49,8 @@ inline pair sqrt1pxm1(pair x)
quadraticroots::quadraticroots(double a, double b, double c)
{
// Remove roots at numerical infinity.
- if(fabs(a) <= Fuzz*(fabs(b)+fabs(c)*Fuzz)) {
- if(fabs(b) > Fuzz*fabs(c)) {
+ if(fabs(a) <= Fuzz2*fabs(b)+Fuzz4*fabs(c)) {
+ if(fabs(b) > Fuzz2*fabs(c)) {
distinct=quadraticroots::ONE;
roots=1;
t1=-c/b;
@@ -65,7 +65,7 @@ quadraticroots::quadraticroots(double a, double b, double c)
} else {
double factor=0.5*b/a;
double denom=b*factor;
- if(fabs(denom) <= Fuzz*fabs(c)) {
+ if(fabs(denom) <= Fuzz2*fabs(c)) {
double x=-c/a;
if(x >= 0.0) {
distinct=quadraticroots::TWO;
@@ -160,7 +160,7 @@ cubicroots::cubicroots(double a, double b, double c, double d)
static const double fiftyfourth=1.0/54.0;
// Remove roots at numerical infinity.
- if(fabs(a) <= Fuzz*(fabs(b)+fabs(c)*Fuzz+fabs(d)*Fuzz2)) {
+ if(fabs(a) <= Fuzz2*(fabs(b)+fabs(c)*Fuzz2+fabs(d)*Fuzz4)) {
quadraticroots q(b,c,d);
roots=q.roots;
if(q.roots >= 1) t1=q.t1;
@@ -169,7 +169,7 @@ cubicroots::cubicroots(double a, double b, double c, double d)
}
// Detect roots at numerical zero.
- if(fabs(d) <= Fuzz*(fabs(c)+fabs(b)*Fuzz+fabs(a)*Fuzz2)) {
+ if(fabs(d) <= Fuzz2*(fabs(c)+fabs(b)*Fuzz2+fabs(a)*Fuzz4)) {
quadraticroots q(a,b,c);
roots=q.roots+1;
t1=0;
@@ -184,11 +184,11 @@ cubicroots::cubicroots(double a, double b, double c, double d)
double b2=b*b;
double Q=3.0*c-b2;
- if(fabs(Q) < Fuzz*(3.0*fabs(c)+fabs(b2)))
+ if(fabs(Q) < Fuzz2*(3.0*fabs(c)+fabs(b2)))
Q=0.0;
double R=(3.0*Q+b2)*b-27.0*d;
- if(fabs(R) < Fuzz*((3.0*fabs(Q)+fabs(b2))*fabs(b)+27.0*fabs(d)))
+ if(fabs(R) < Fuzz2*((3.0*fabs(Q)+fabs(b2))*fabs(b)+27.0*fabs(d)))
R=0.0;
Q *= ninth;
@@ -797,10 +797,10 @@ void intersections(std::vector<double>& T, const path& g, const pair& z,
size_t m=r.size();
for(size_t j=0 ; j < m; ++j) {
double t=r[j];
- if(t >= -Fuzz && t <= 1.0+Fuzz) {
+ if(t >= -Fuzz2 && t <= 1.0+Fuzz2) {
double s=i+t;
if((g.point(s)-z).abs2() <= fuzz2) {
- if(cycles && s >= n-Fuzz) s=0;
+ if(cycles && s >= n-Fuzz2) s=0;
T.push_back(s);
}
}
@@ -846,7 +846,7 @@ void lineintersections(std::vector<double>& T, const path& g,
double d=dy*z0.getx()-dx*z0.gety()+det;
std::vector<double> r;
if(max(max(max(a*a,b*b),c*c),d*d) >
- Fuzz2*max(max(max(z0.abs2(),z1.abs2()),c0.abs2()),c1.abs2()))
+ Fuzz4*max(max(max(z0.abs2(),z1.abs2()),c0.abs2()),c1.abs2()))
roots(r,a,b,c,d);
else r.push_back(0.0);
if(endpoints) {
@@ -859,9 +859,9 @@ void lineintersections(std::vector<double>& T, const path& g,
size_t m=r.size();
for(size_t j=0 ; j < m; ++j) {
double t=r[j];
- if(t >= -Fuzz && t <= 1.0+Fuzz) {
+ if(t >= -Fuzz2 && t <= 1.0+Fuzz2) {
double s=i+t;
- if(cycles && s >= n-Fuzz) s=0;
+ if(cycles && s >= n-Fuzz2) s=0;
T.push_back(s);
}
}
@@ -891,7 +891,7 @@ void intersections(std::vector<double>& S, std::vector<double>& T,
for(size_t i=0; i < n; ++i) {
double s=S1[i];
double t=dot(g.point(s)-p,factor);
- if(t >= -Fuzz && t <= 1.0+Fuzz) {
+ if(t >= -Fuzz2 && t <= 1.0+Fuzz2) {
S.push_back(s);
T.push_back(t);
}
@@ -953,8 +953,7 @@ void add(double& s, double& t, std::vector<double>& S, std::vector<double>& T,
void intersections(std::vector<double>& S, path& g,
const pair& p, const pair& q, double fuzz)
{
- double fuzz2=max(fuzzFactor*fuzz,Fuzz);
- fuzz2=fuzz2*fuzz2;
+ double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2);
std::vector<double> S1;
lineintersections(S1,g,p,q,fuzz);
size_t n=S1.size();
@@ -968,8 +967,7 @@ bool intersections(double &s, double &t, std::vector<double>& S,
{
if(errorstream::interrupt) throw interrupted();
- double fuzz2=max(fuzzFactor*fuzz,Fuzz);
- fuzz2=fuzz2*fuzz2;
+ double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2);
Int lp=p.length();
if(((lp == 1 && p.straight(0)) || lp == 0) && exact) {
@@ -999,6 +997,9 @@ bool intersections(double &s, double &t, std::vector<double>& S,
// Overlapping bounding boxes
--depth;
+ fuzz *= 2.0;
+ double fuzz2=max(fuzzFactor*fuzz*fuzz,Fuzz2);
+
if((maxp-minp).length()+(maxq-minq).length() <= fuzz || depth == 0) {
if(single) {
s=0.5;
@@ -1240,6 +1241,7 @@ bool checkcurve(const pair& z0, const pair& c0, const pair& c1,
{
if(depth == 0) return true;
--depth;
+
if(insidebbox(z0,c0,c1,z1,z)) {
const pair m0=0.5*(z0+c0);
const pair m1=0.5*(c0+c1);