@@ -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