LINUX.ORG.RU

Отношение расстояний с нормализацией без float и math.h

 


0

3

Как можно отсюда убрать необходимость во 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;
}
★★
Ответ на: комментарий от sambist

В вашем тесте p1 и p2 неподвижны, причём AB получается идёт ровно под 45 градусов. Это может сводить задачу к одному частному случаю и искажать результаты. Лучше вычислять не просто одну линию пикселей, а целую картинку. И картинок много разных со случайным расположением p1 и p2.

kvap
()
Ответ на: комментарий от sambist

Обобщение брезенхема заботает на кривых второго порядка (на эллипсах точно). Пруф, к сожалению, требует поиска. Расстояние менее 1 учитывается удвоенными приращениями --> выбор точки всегда однозначен.

pS
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.