19 Vector3D dir1 = invTrans.linear() * direction;
22 double tan2Alpha = bounds().tanAlpha() * bounds().tanAlpha(),
23 A = dir1.x() * dir1.x() + dir1.y() * dir1.y() -
24 tan2Alpha * dir1.z() * dir1.z(),
25 B = 2 * (dir1.x() * point1.x() + dir1.y() * point1.y() -
26 tan2Alpha * dir1.z() * point1.z()),
27 C = point1.x() * point1.x() + point1.y() * point1.y() -
28 tan2Alpha * point1.z() * point1.z();
40 auto qe = intersectionSolver(gctx, position, direction);
43 if (qe.solutions == 0) {
49 qe.first * qe.first < qe.second * qe.second ? qe.first : qe.second;
50 Vector3D solution = position + path * direction;
53 ? Intersection::Status::onSurface
54 : Intersection::Status::reachable;
57 if (bcheck and not isOnSurface(gctx, solution, direction, bcheck)) {
58 status = Intersection::Status::missed;
69 auto qe = intersectionSolver(gctx, position, direction);
72 if (qe.solutions == 0) {
77 Vector3D solution1 = position + qe.first * direction;
80 ? Intersection::Status::onSurface
81 : Intersection::Status::reachable;
83 if (bcheck and not isOnSurface(gctx, solution1, direction, bcheck)) {
84 status1 = Intersection::Status::missed;
88 Vector3D solution2 = position + qe.first * direction;
91 ? Intersection::Status::onSurface
92 : Intersection::Status::reachable;
93 if (bcheck and not isOnSurface(gctx, solution2, direction, bcheck)) {
94 status2 = Intersection::Status::missed;
103 bool check1 = status1 != Intersection::Status::missed or
104 (status1 == Intersection::Status::missed and
105 status2 == Intersection::Status::missed);
107 if ((check1 and qe.first * qe.first < qe.second * qe.second) or
108 status2 == Intersection::Status::missed) {
110 if (qe.solutions > 1) {
115 if (qe.solutions > 1) {
120 return cIntersection;