Skip to content

Commit c76d373

Browse files
committed
Add the new math to ClosestPointOnThisAndSurface() and the special planar case in ClosestPointTo()
1 parent 0de8618 commit c76d373

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

src/srf/ratpoly.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -439,9 +439,14 @@ void SSurface::ClosestPointTo(Vector p, double *u, double *v, bool mustConverge)
439439
bu = (ctrl[1][0]).Minus(orig),
440440
bv = (ctrl[0][1]).Minus(orig);
441441
if((ctrl[1][1]).Equals(orig.Plus(bu).Plus(bv))) {
442+
443+
Vector n = bu.Cross(bv);
444+
Vector ty = n.Cross(bu).ScaledBy(1.0/bu.MagSquared());
445+
Vector tx = bv.Cross(n).ScaledBy(1.0/bv.MagSquared());
446+
442447
Vector dp = p.Minus(orig);
443-
*u = dp.Dot(bu) / bu.MagSquared();
444-
*v = dp.Dot(bv) / bv.MagSquared();
448+
*u = dp.Dot(bu) / tx.MagSquared();
449+
*v = dp.Dot(bv) / ty.MagSquared();
445450
return;
446451
}
447452
}
@@ -598,10 +603,14 @@ Vector SSurface::ClosestPointOnThisAndSurface(SSurface *srf2, Vector p) {
598603

599604
// Adjust our guess and iterate
600605
for(j = 0; j < 2; j++) {
606+
Vector n = tu[j].Cross(tv[j]);
607+
Vector ty = n.Cross(tu[j]).ScaledBy(1.0/tu[j].MagSquared());
608+
Vector tx = tv[j].Cross(n).ScaledBy(1.0/tv[j].MagSquared());
609+
601610
Vector dc = pc.Minus(cp[j]);
602-
double du = dc.Dot(tu[j]), dv = dc.Dot(tv[j]);
603-
puv[j].x += du / ((tu[j]).MagSquared());
604-
puv[j].y += dv / ((tv[j]).MagSquared());
611+
double du = dc.Dot(tx), dv = dc.Dot(ty);
612+
puv[j].x += du / tx.MagSquared();
613+
puv[j].y += dv / ty.MagSquared();
605614
}
606615
}
607616
if(i >= 10) {

0 commit comments

Comments
 (0)