thanks to Sirisian wrote, i adopted it a bit to my code for proximity sensor for neural network:
// convenient mapping for neural network distance sensor;
scalar get_distance_inverse_squared(const point& qp, const point& d, const segment& s) {
auto s0s1 = s[1] - s[0];
auto s0qp = qp - s[0];
auto dd = d[0] * s0s1[1] - d[1] * s0s1[0];
if (dd != 0) {
auto r = (s0qp[1] * s0s1[0] - s0qp[0] * s0s1[1]) / dd;
auto s = (s0qp[1] * d[0] - s0qp[0] * d[1]) / dd;
if (r >= 0 && s >= 0 && s <= 1) {
// inverselinear squareinverse of distance, always less than 1.0
return scalar(1) / (r*rr + 1);
}
}
return 0; // infinitely far, parallel, etc, no signal
}