Revision: 55947
http://sourceforge.net/p/brlcad/code/55947
Author: phoenixyjll
Date: 2013-07-03 06:33:43 +0000 (Wed, 03 Jul 2013)
Log Message:
-----------
Values of 3D and 2D spaces should have different tolerances. And consider the
2D tolerance when merging.
Modified Paths:
--------------
brlcad/trunk/src/libbrep/intersect.cpp
Modified: brlcad/trunk/src/libbrep/intersect.cpp
===================================================================
--- brlcad/trunk/src/libbrep/intersect.cpp 2013-07-03 05:56:48 UTC (rev
55946)
+++ brlcad/trunk/src/libbrep/intersect.cpp 2013-07-03 06:33:43 UTC (rev
55947)
@@ -652,9 +652,11 @@
const ON_Interval* curveB_domain)
{
if (intersection_tolerance <= 0.0)
- intersection_tolerance = 0.001;
+ intersection_tolerance = CCI_DEFAULT_TOLERANCE;
if (overlap_tolerance <= 0.0)
overlap_tolerance = 2*intersection_tolerance;
+ double t1_tolerance = intersection_tolerance;
+ double t2_tolerance = intersection_tolerance;
Subcurve rootA, rootB;
if (!build_curve_root(curveA, curveA_domain, rootA))
@@ -662,6 +664,16 @@
if (!build_curve_root(curveB, curveB_domain, rootB))
return 0;
+ // We adjust the tolerance from 3D scale to respective 2D scales.
+ double l = rootA.m_curve->BoundingBox().Diagonal().Length();
+ double dl = curveA_domain ? curveA_domain->Length() :
curveA->Domain().Length();
+ if (!ON_NearZero(l))
+ t1_tolerance = intersection_tolerance/l*dl;
+ l = rootB.m_curve->BoundingBox().Diagonal().Length();
+ dl = curveB_domain ? curveB_domain->Length() : curveB->Domain().Length();
+ if (!ON_NearZero(l))
+ t2_tolerance = intersection_tolerance/l*dl;
+
typedef std::vector<std::pair<Subcurve*, Subcurve*> > NodePairs;
NodePairs candidates, next_candidates;
if (rootA.Intersect(rootB, intersection_tolerance))
@@ -712,8 +724,8 @@
lineB.ClosestPointTo(lineA.from, &startA_on_B);
lineB.ClosestPointTo(lineA.to, &endA_on_B);
- if (startB_on_A > 1+intersection_tolerance || endB_on_A <
-intersection_tolerance
- || startA_on_B > 1+intersection_tolerance || endA_on_B
< -intersection_tolerance)
+ if (startB_on_A > 1+t1_tolerance || endB_on_A <
-t1_tolerance
+ || startA_on_B > 1+t2_tolerance || endA_on_B <
-t2_tolerance)
continue;
double t_a1, t_a2, t_b1, t_b2;
@@ -886,7 +898,7 @@
for (int i = 0; i < overlap.Count(); i++) {
bool merged = false;
for (int j = 0; j < pending.Count(); j++) {
- if (pending[j].m_a[1] < overlap[i].m_a[0] - intersection_tolerance)
{
+ if (pending[j].m_a[1] < overlap[i].m_a[0] - t1_tolerance) {
pending[j].m_A[0] = curveA->PointAt(pending[j].m_a[0]);
pending[j].m_A[1] = curveA->PointAt(pending[j].m_a[1]);
pending[j].m_B[0] = curveB->PointAt(pending[j].m_b[0]);
@@ -896,9 +908,12 @@
j--;
continue;
}
- if (overlap[i].m_a[0] < pending[j].m_a[1] + intersection_tolerance)
{
+ if (overlap[i].m_a[0] < pending[j].m_a[1] + t1_tolerance) {
ON_Interval interval_1(overlap[i].m_b[0], overlap[i].m_b[1]);
ON_Interval interval_2(pending[j].m_b[0], pending[j].m_b[1]);
+ interval_1.MakeIncreasing();
+ interval_1.m_t[0] -= t2_tolerance;
+ interval_1.m_t[1] += t2_tolerance;
if (interval_1.Intersection(interval_2)) {
// Need to merge
merged = true;
@@ -925,8 +940,8 @@
for (int i = 0; i < points.Count(); i++) {
int j;
for (j = 0; j < overlap_events; j++) {
- if (points[i].m_a[0] > x[j].m_a[0] - intersection_tolerance
- && points[i].m_a[0] < x[j].m_a[1] + intersection_tolerance)
+ if (points[i].m_a[0] > x[j].m_a[0] - t1_tolerance
+ && points[i].m_a[0] < x[j].m_a[1] + t1_tolerance)
break;
}
if (j == overlap_events)
@@ -1091,9 +1106,12 @@
const ON_Interval* surfaceB_vdomain)
{
if (intersection_tolerance <= 0.0)
- intersection_tolerance = 0.001;
+ intersection_tolerance = CSI_DEFAULT_TOLERANCE;
if (overlap_tolerance <= 0.0)
overlap_tolerance = 2*intersection_tolerance;
+ double t_tolerance = intersection_tolerance;
+ double u_tolerance = intersection_tolerance;
+ double v_tolerance = intersection_tolerance;
// We need ON_BrepFace for get_closest_point().
// This is used in point-surface intersections, in case we build the
@@ -1111,6 +1129,19 @@
if (!build_surface_root(surfaceB, surfaceB_udomain, surfaceB_vdomain,
rootB))
return 0;
+ // We adjust the tolerance from 3D scale to respective 2D scales.
+ double l = rootA.m_curve->BoundingBox().Diagonal().Length();
+ double dl = curveA_domain ? curveA_domain->Length() :
curveA->Domain().Length();
+ if (!ON_NearZero(l))
+ t_tolerance = intersection_tolerance/l*dl;
+ l = rootB.m_surf->BoundingBox().Diagonal().Length();
+ dl = surfaceB_udomain ? surfaceB_udomain->Length() :
surfaceB->Domain(0).Length();
+ if (!ON_NearZero(l))
+ u_tolerance = intersection_tolerance/l*dl;
+ dl = surfaceB_vdomain ? surfaceB_vdomain->Length() :
surfaceB->Domain(1).Length();
+ if (!ON_NearZero(l))
+ v_tolerance = intersection_tolerance/l*dl;
+
typedef std::vector<std::pair<Subcurve*, Subsurface*> > NodePairs;
NodePairs candidates, next_candidates;
if (rootB.Intersect(rootA, intersection_tolerance))
@@ -1275,7 +1306,7 @@
// cos_angle != 0, otherwise the curve and the plane are
parallel.
double distance = plane.DistanceTo(line.from);
double line_t = distance/cos_angle/line.Length();
- if (line_t > 1.0 + intersection_tolerance)
+ if (line_t > 1.0 + t_tolerance)
continue;
ON_3dPoint intersection = line.from +
line.Direction()*line_t;
ON_2dPoint uv;
@@ -1438,19 +1469,25 @@
for (int i = 0; i < overlap.Count(); i++) {
bool merged = false;
for (int j = 0; j < pending.Count(); j++) {
- if (pending[j].m_a[1] < overlap[i].m_a[0] - intersection_tolerance)
{
+ if (pending[j].m_a[1] < overlap[i].m_a[0] - t_tolerance) {
x.Append(pending[j]);
pending.Remove(j);
j--;
continue;
}
- if (overlap[i].m_a[0] < pending[j].m_a[1] + intersection_tolerance)
{
+ if (overlap[i].m_a[0] < pending[j].m_a[1] + t_tolerance) {
ON_Interval interval_u1(overlap[i].m_b[0], overlap[i].m_b[2]);
ON_Interval interval_u2(pending[j].m_b[0], pending[j].m_b[2]);
ON_Interval interval_v1(overlap[i].m_b[1], overlap[i].m_b[3]);
ON_Interval interval_v2(pending[j].m_b[1], pending[j].m_b[3]);
+ interval_u1.MakeIncreasing();
+ interval_u1.m_t[0] -= u_tolerance;
+ interval_u1.m_t[1] += u_tolerance;
+ interval_v1.MakeIncreasing();
+ interval_v1.m_t[0] -= v_tolerance;
+ interval_v1.m_t[1] += v_tolerance;
if (interval_u1.Intersection(interval_u2) &&
interval_v1.Intersection(interval_v2)) {
- // if the uv rectangle of them intersects, it's consider
overlap.
+ // if the uv rectangle of them intersects, it's consider
overlap.
merged = true;
if (overlap[i].m_a[1] > pending[j].m_a[1]) {
pending[j].m_a[1] = overlap[i].m_a[1];
@@ -1475,8 +1512,8 @@
for (int i = 0; i < points.Count(); i++) {
int j;
for (j = 0; j < overlap_events; j++) {
- if (points[i].m_a[0] > x[j].m_a[0] - intersection_tolerance
- && points[i].m_a[0] < x[j].m_a[1] + intersection_tolerance)
+ if (points[i].m_a[0] > x[j].m_a[0] - t_tolerance
+ && points[i].m_a[0] < x[j].m_a[1] + t_tolerance)
break;
}
if (j == overlap_events)
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits