---------------------------------------------------------------------------*/ *Returns the Euclidean distance squared between p1 and p2 for all essential * dimensions. * @param k keys are in k-space * @param dim dimension descriptions (essential, circular, etc) * @param p1,p2 two different points in K-D space */
| 449 | * @param p1,p2 two different points in K-D space |
| 450 | */ |
| 451 | FLOAT32 DistanceSquared(int k, PARAM_DESC *dim, FLOAT32 p1[], FLOAT32 p2[]) { |
| 452 | FLOAT32 total_distance = 0; |
| 453 | |
| 454 | for (; k > 0; k--, p1++, p2++, dim++) { |
| 455 | if (dim->NonEssential) |
| 456 | continue; |
| 457 | |
| 458 | FLOAT32 dimension_distance = *p1 - *p2; |
| 459 | |
| 460 | /* if this dimension is circular - check wraparound distance */ |
| 461 | if (dim->Circular) { |
| 462 | dimension_distance = Magnitude(dimension_distance); |
| 463 | FLOAT32 wrap_distance = dim->Max - dim->Min - dimension_distance; |
| 464 | dimension_distance = MIN(dimension_distance, wrap_distance); |
| 465 | } |
| 466 | |
| 467 | total_distance += dimension_distance * dimension_distance; |
| 468 | } |
| 469 | return total_distance; |
| 470 | } |
| 471 | |
| 472 | FLOAT32 ComputeDistance(int k, PARAM_DESC *dim, FLOAT32 p1[], FLOAT32 p2[]) { |
| 473 | return sqrt(DistanceSquared(k, dim, p1, p2)); |
no outgoing calls
no test coverage detected