Skip to content

Commit 408128a

Browse files
committed
Avoid zero tangnet vectors on degenerate NURBS edges. Fixes #652
1 parent e42aa0f commit 408128a

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

src/srf/ratpoly.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ Vector SSurface::PointAt(double u, double v) const {
332332
return num;
333333
}
334334

335-
void SSurface::TangentsAt(double u, double v, Vector *tu, Vector *tv) const {
335+
void SSurface::TangentsAt(double u, double v, Vector *tu, Vector *tv, bool retry) const {
336336
Vector num = Vector::From(0, 0, 0),
337337
num_u = Vector::From(0, 0, 0),
338338
num_v = Vector::From(0, 0, 0);
@@ -364,6 +364,12 @@ void SSurface::TangentsAt(double u, double v, Vector *tu, Vector *tv) const {
364364

365365
*tv = ((num_v.ScaledBy(den)).Minus(num.ScaledBy(den_v)));
366366
*tv = tv->ScaledBy(1.0/(den*den));
367+
368+
// Tangent is zero at sungularities like the north pole. Move away a bit and retry.
369+
if(tv->Equals(Vector::From(0,0,0)) && retry)
370+
TangentsAt(u+(0.5-u)*0.00001, v, tu, tv, false);
371+
if(tu->Equals(Vector::From(0,0,0)) && retry)
372+
TangentsAt(u, v+(0.5-v)*0.00001, tu, tv, false);
367373
}
368374

369375
Vector SSurface::NormalAt(Point2d puv) const {

src/srf/surface.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ class SSurface {
335335
void PointOnCurve(const SBezier *curve, double *up, double *vp);
336336
Vector PointAt(double u, double v) const;
337337
Vector PointAt(Point2d puv) const;
338-
void TangentsAt(double u, double v, Vector *tu, Vector *tv) const;
338+
void TangentsAt(double u, double v, Vector *tu, Vector *tv, bool retry=true) const;
339339
Vector NormalAt(Point2d puv) const;
340340
Vector NormalAt(double u, double v) const;
341341
bool LineEntirelyOutsideBbox(Vector a, Vector b, bool asSegment) const;

0 commit comments

Comments
 (0)