Fix floating point divisions by zero when ground route has no bridge
This commit is contained in:
parent
aec0c4a0dc
commit
add0f89728
@ -125,8 +125,11 @@ struct Beam_ { // Defines a set of rays displaced along a cone's surface
|
|||||||
Beam_(const Ball &src_ball, const Ball &dst_ball)
|
Beam_(const Ball &src_ball, const Ball &dst_ball)
|
||||||
: src{src_ball.p}, dir{dirv(src_ball.p, dst_ball.p)}, r1{src_ball.R}
|
: src{src_ball.p}, dir{dirv(src_ball.p, dst_ball.p)}, r1{src_ball.R}
|
||||||
{
|
{
|
||||||
r2 = src_ball.R
|
r2 = src_ball.R;
|
||||||
+ (dst_ball.R - src_ball.R) / distance(src_ball.p, dst_ball.p);
|
auto d = distance(src_ball.p, dst_ball.p);
|
||||||
|
|
||||||
|
if (d > EPSILON)
|
||||||
|
r2 += (dst_ball.R - src_ball.R) / d;
|
||||||
}
|
}
|
||||||
|
|
||||||
Beam_(const Vec3d &s, const Vec3d &d, double R)
|
Beam_(const Vec3d &s, const Vec3d &d, double R)
|
||||||
@ -542,7 +545,7 @@ Vec3d check_ground_route(
|
|||||||
|
|
||||||
if (brhit_dist < bridge_len) {
|
if (brhit_dist < bridge_len) {
|
||||||
ret = (source.pos + brhit_dist * dir);
|
ret = (source.pos + brhit_dist * dir);
|
||||||
} else {
|
} else if (down_l > 0.) {
|
||||||
// check if pillar can be placed below
|
// check if pillar can be placed below
|
||||||
auto gp = Vec3d{bridge_end.x(), bridge_end.y(), gndlvl};
|
auto gp = Vec3d{bridge_end.x(), bridge_end.y(), gndlvl};
|
||||||
double end_radius = wideningfn(
|
double end_radius = wideningfn(
|
||||||
@ -565,6 +568,8 @@ Vec3d check_ground_route(
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = Vec3d{bridge_end.x(), bridge_end.y(), bridge_end.z() - gnd_hit_d};
|
ret = Vec3d{bridge_end.x(), bridge_end.y(), bridge_end.z() - gnd_hit_d};
|
||||||
|
} else {
|
||||||
|
ret = bridge_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -709,6 +714,9 @@ GroundConnection deepsearch_ground_connection(Ex policy,
|
|||||||
{
|
{
|
||||||
double gndlvl = ground_level(sm);
|
double gndlvl = ground_level(sm);
|
||||||
auto wfn = [end_radius, gndlvl](const Ball &src, const Vec3d &dir, double len) {
|
auto wfn = [end_radius, gndlvl](const Ball &src, const Vec3d &dir, double len) {
|
||||||
|
if (len < EPSILON)
|
||||||
|
return src.R;
|
||||||
|
|
||||||
Vec3d dst = src.p + len * dir;
|
Vec3d dst = src.p + len * dir;
|
||||||
double widening = end_radius - src.R;
|
double widening = end_radius - src.R;
|
||||||
double zlen = dst.z() - gndlvl;
|
double zlen = dst.z() - gndlvl;
|
||||||
|
Loading…
Reference in New Issue
Block a user