diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp index ab641b3a36ffb1b42a12de7d443c7e6108486b7d..3a2ac54377a09262ad551df10115bb3dea4939ed 100644 --- a/Graphics/Geom.cpp +++ b/Graphics/Geom.cpp @@ -1,4 +1,4 @@ -// $Id: Geom.cpp,v 1.108 2006-08-13 02:46:53 geuzaine Exp $ +// $Id: Geom.cpp,v 1.109 2006-08-13 06:59:14 geuzaine Exp $ // // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // @@ -234,46 +234,50 @@ private: // when redraw events are fired in rapid succession if(!f->cross.size() && !CTX.threads_lock) { CTX.threads_lock = 1; - std::list<GVertex*> pts = f->vertices(); - if(pts.size()){ - SBoundingBox3d bb; - for(std::list<GVertex*>::iterator it = pts.begin(); it != pts.end(); it++){ - SPoint3 p((*it)->x(), (*it)->y(), (*it)->z()); - SPoint2 uv = f->parFromPoint(p); + std::list<GEdge*> edges = f->edges(); + SBoundingBox3d bb; + for(std::list<GEdge*>::iterator it = edges.begin(); it != edges.end(); it++){ + Range<double> t_bounds = (*it)->parBounds(0); + GPoint p[3] = {(*it)->point(t_bounds.low()), + (*it)->point(0.5 * (t_bounds.low() + t_bounds.high())), + (*it)->point(t_bounds.high())}; + for(int i = 0; i < 3; i++){ + SPoint2 uv = f->parFromPoint(SPoint3(p[i].x(), p[i].y(), p[i].z())); bb += SPoint3(uv.x(), uv.y(), 0.); } - GPoint v0 = f->point(bb.min().x(), bb.min().y()); - GPoint v1 = f->point(bb.max().x(), bb.min().y()); - GPoint v2 = f->point(bb.max().x(), bb.max().y()); - GPoint v3 = f->point(bb.min().x(), bb.max().y()); - const int N = 100; - for(int dir = 0; dir < 2; dir++) { - int end_line = 0; - SPoint3 pt, pt_last_good; - for(int i = 0; i < N; i++) { - double t = (double)i / (double)(N - 1); - double x, y, z; - if(dir){ - x = t * 0.5 * (v0.x() + v1.x()) + (1. - t) * 0.5 * (v2.x() + v3.x()); - y = t * 0.5 * (v0.y() + v1.y()) + (1. - t) * 0.5 * (v2.y() + v3.y()); - z = t * 0.5 * (v0.z() + v1.z()) + (1. - t) * 0.5 * (v2.z() + v3.z()); - } - else{ - x = t * 0.5 * (v0.x() + v3.x()) + (1. - t) * 0.5 * (v2.x() + v1.x()); - y = t * 0.5 * (v0.y() + v3.y()) + (1. - t) * 0.5 * (v2.y() + v1.y()); - z = t * 0.5 * (v0.z() + v3.z()) + (1. - t) * 0.5 * (v2.z() + v1.z()); - } - pt.setPosition(x, y, z); - if(f->containsPoint(pt)){ - pt_last_good.setPosition(pt.x(), pt.y(), pt.z()); - if(!end_line) { f->cross.push_back(pt); end_line = 1; } - } - else { - if(end_line) { f->cross.push_back(pt_last_good); end_line = 0; } - } + } + bb *= 1.1; + GPoint v0 = f->point(bb.min().x(), bb.min().y()); + GPoint v1 = f->point(bb.max().x(), bb.min().y()); + GPoint v2 = f->point(bb.max().x(), bb.max().y()); + GPoint v3 = f->point(bb.min().x(), bb.max().y()); + const int N = 100; + for(int dir = 0; dir < 2; dir++) { + int end_line = 0; + SPoint3 pt, pt_last_inside; + for(int i = 0; i < N; i++) { + double t = (double)i / (double)(N - 1); + double x, y, z; + if(dir){ + x = t * 0.5 * (v0.x() + v1.x()) + (1. - t) * 0.5 * (v2.x() + v3.x()); + y = t * 0.5 * (v0.y() + v1.y()) + (1. - t) * 0.5 * (v2.y() + v3.y()); + z = t * 0.5 * (v0.z() + v1.z()) + (1. - t) * 0.5 * (v2.z() + v3.z()); + } + else{ + x = t * 0.5 * (v0.x() + v3.x()) + (1. - t) * 0.5 * (v2.x() + v1.x()); + y = t * 0.5 * (v0.y() + v3.y()) + (1. - t) * 0.5 * (v2.y() + v1.y()); + z = t * 0.5 * (v0.z() + v3.z()) + (1. - t) * 0.5 * (v2.z() + v1.z()); + } + pt.setPosition(x, y, z); + if(f->containsPoint(pt)){ + pt_last_inside.setPosition(pt.x(), pt.y(), pt.z()); + if(!end_line) { f->cross.push_back(pt); end_line = 1; } + } + else { + if(end_line) { f->cross.push_back(pt_last_inside); end_line = 0; } } - if(end_line) f->cross.push_back(pt_last_good); } + if(end_line) f->cross.push_back(pt_last_inside); } // if we couldn't determine a cross, add dummy point so that // we won't try again