private XVector3 BisectionSearch(XVector3 origin, XVector3 end, float min, float max) { float mid = (min + max) / 2; XVector3 newEnd = end + mid * XVector3.Normalize(end - origin); float minDot = float.MaxValue; for (int i = 0; i < _verts.Length; i++) { float dot = XVector3.Dot(XVector3.Normalize(origin - newEnd), XVector3.Normalize(_verts[i] - newEnd)); if (dot < -_Epsilon) { return(BisectionSearch(origin, end, mid, max)); } if (minDot > dot) { minDot = dot; } } if (minDot > _Epsilon) { return(BisectionSearch(origin, end, min, mid)); } return(newEnd); }
private void GetReferencePoint() { bool assigned = false; float min = float.MaxValue; for (int i = 0; i < _verts.Length; i++) { int j = (i + 1) % _verts.Length; int k = (i + 2) % _verts.Length; int l = (i + 3) % _verts.Length; var ji = XVector3.Normalize(_verts[i] - _verts[j]); var jk = XVector3.Normalize(_verts[k] - _verts[j]); var ij = XVector3.Normalize(_verts[j] - _verts[i]); var il = XVector3.Normalize(_verts[l] - _verts[i]); var kj = XVector3.Normalize(_verts[j] - _verts[k]); var kl = XVector3.Normalize(_verts[l] - _verts[k]); float nextDot = XVector3.Dot(kj, kl); float dot = XVector3.Dot(ji, jk); float prevDot = XVector3.Dot(ij, il); if (dot > -_Epsilon && min > dot && (prevDot > -_Epsilon || nextDot > -_Epsilon)) { assigned = true; Start = _verts[j]; Corner = _verts[k]; min = dot; } } if (!assigned) { Start = _verts[0]; Corner = _verts[1]; } }
private int ExponentialSearch(XVector3 origin, XVector3 end, int step = 0) { var newEnd = end + Exp(step) * XVector3.Normalize(end - origin); for (int i = 0; i < _verts.Length; i++) { float dot = XVector3.Dot(XVector3.Normalize(origin - newEnd), XVector3.Normalize(_verts[i] - newEnd)); if (dot < 0) { return(ExponentialSearch(origin, end, step + 1)); } } return(step); }