@@ -1228,13 +1228,23 @@ LNLib::UV LNLib::NurbsSurface::GetParamOnSurface(const LN_NurbsSurface& surface,
12281228 param = temp;
12291229 double u = param.GetU ();
12301230 double v = param.GetV ();
1231- if (MathUtils::IsAlmostEqualTo (u, 0.0 ))
1231+
1232+ if (MathUtils::IsLessThan (u, minUParam))
1233+ {
1234+ param = UV (minUParam, param.GetV ());
1235+ }
1236+ if (MathUtils::IsGreaterThan (u, maxUParam))
1237+ {
1238+ param = UV (maxUParam, param.GetV ());
1239+ }
1240+
1241+ if (MathUtils::IsLessThan (v, minVParam))
12321242 {
1233- param = UV (0 , param.GetV () );
1243+ param = UV (param.GetU (), minVParam );
12341244 }
1235- if (MathUtils::IsAlmostEqualTo (v, 0.0 ))
1245+ if (MathUtils::IsGreaterThan (v, maxUParam ))
12361246 {
1237- param = UV (param.GetU (), 0.0 );
1247+ param = UV (param.GetU (), maxUParam );
12381248 }
12391249 counters++;
12401250 }
@@ -2810,23 +2820,27 @@ double LNLib::NurbsSurface::ApproximateArea(const LN_NurbsSurface& surface, Inte
28102820 double halfV = (startV + endV) / 2.0 ;
28112821 XYZ halfStart = GetPointOnSurface (reSurface, UV (startU, halfV));
28122822 XYZ halfEnd = GetPointOnSurface (reSurface, UV (endU, halfV));
2823+
28132824 double totalWidth = halfStart.Distance (halfEnd);
2814- int count = floor (totalWidth / Constants::DistanceEpsilon);
2825+ int intervals = 20 ;
2826+ double delta = totalWidth / intervals;
28152827
28162828 XYZ start1 = GetPointOnSurface (reSurface, UV (startU, startV));
28172829 XYZ start2 = GetPointOnSurface (reSurface, UV (startU, endV));
28182830 double startLength = start1.Distance (start2);
28192831
2820- int size = (count / 2.0 ) + 1 ;
28212832 std::vector<double > odds;
28222833 std::vector<double > evens;
28232834
2824- for (int i = 1 ; i < count; i++)
2835+ XYZ dir = (halfEnd - halfStart).Normalize ();
2836+
2837+ for (int i = 1 ; i < intervals; i++)
28252838 {
2826- XYZ current = halfStart + (halfEnd - halfStart). Normalize () * Constants::DistanceEpsilon * i;
2839+ XYZ current = halfStart + dir * delta * i;
28272840 UV uv = GetParamOnSurface (reSurface, current);
2828- XYZ point1 = GetPointOnSurface (reSurface, UV (uv.GetU (), startV));
2829- XYZ point2 = GetPointOnSurface (reSurface, UV (uv.GetU (), endV));
2841+ double u = uv.GetU ();
2842+ XYZ point1 = GetPointOnSurface (reSurface, UV (u, startV));
2843+ XYZ point2 = GetPointOnSurface (reSurface, UV (u, endV));
28302844 double length = point1.Distance (point2);
28312845
28322846 if (i % 2 == 0 )
@@ -2843,7 +2857,7 @@ double LNLib::NurbsSurface::ApproximateArea(const LN_NurbsSurface& surface, Inte
28432857 XYZ end2 = GetPointOnSurface (reSurface, UV (endU, endV));
28442858 double endLength = end1.Distance (end2);
28452859
2846- area = Integrator::Simpson (startLength, endLength, odds, evens, Constants::DistanceEpsilon );
2860+ area = Integrator::Simpson (startLength, endLength, odds, evens, delta );
28472861 break ;
28482862 }
28492863 case IntegratorType::GaussLegendre:
0 commit comments