Как можно отсюда убрать необходимость во float и math.h?
Чую, что можно не вычислять квадратный корень, а потом просто произвести какую-то простую операцию с результатом.
uint16_t SmlGradientRadialValue(SmlLine line, SmlPoint target)
{
/* ┌──────┐
┌────┘ └────┐
┌─┘ └─┐
┌─┘ └─┐
┌─┘ └─┐
│ │
│ __ Gradient line │
┌─┘ / └─┐
│ / A(x1, y1) │
│──────────────╴() │
│ │
└─┐ ┌─┘
│ │
│ T(tx, ty) │
└─┐ () ┌─┘
└─┐ ┌─┘
└─┐ B(x2, y2) ┌─┘
└─()─┐ ┌────┘
└──────┘
* Returns gradient value [SML_GRAD_MIN..SML_GRAD_MAX] from A to B relative
to the point T.
Solution:
I. If the target point is equal to A, return SML_GRAD_MIN
II. Calculate the AB & AT distances.
III. If AT is bigger than AB, return the SML_GRAD_MAX
IV. Return the of the AT length to AB length and normalise it. */
if ((target.x == line.p1.x) && (target.y == line.p1.y))
return SML_GRAD_MIN;
float AB = sqrt(SML_SQR(line.p1.x - line.p2.x) +
SML_SQR(line.p1.y - line.p2.y));
float AT = sqrt(SML_SQR(line.p1.x - target.x) +
SML_SQR(line.p1.y - target.y));
if (AT > AB)
return SML_GRAD_MAX;
return SML_GRAD_MAX * AT / AB;
}