| 86 | |
| 87 | |
| 88 | float BzfRegion::getDistance(const fvec2& p, fvec2& nearest) const { |
| 89 | const size_t count = corners.size(); |
| 90 | float currentDistance = maxDistance; |
| 91 | float pointDistance; |
| 92 | |
| 93 | //compute distance from any edge |
| 94 | const float* p1 = corners[count - 1].get(); |
| 95 | const float* p2 = NULL; |
| 96 | fvec2 d; |
| 97 | fvec2 m; |
| 98 | float t; |
| 99 | float edgeSquareDist; |
| 100 | float x, y; |
| 101 | for (size_t c = 0; c < count; c++) { |
| 102 | p2 = corners[c].get(); |
| 103 | d[0] = p2[0] - p1[0]; |
| 104 | d[1] = p2[1] - p1[1]; |
| 105 | m[0] = p[0] - p1[0]; |
| 106 | m[1] = p[1] - p1[1]; |
| 107 | edgeSquareDist = d[0] * d[0] + d[1] * d[1]; |
| 108 | t = (m[0] * d[0] + m[1] * d[1]) / edgeSquareDist; |
| 109 | if (t <= 0) { |
| 110 | pointDistance = hypotf(m[0], m[1]); |
| 111 | x = p1[0]; |
| 112 | y = p1[1]; |
| 113 | } |
| 114 | else if (t >= 1) { |
| 115 | pointDistance = hypotf(m[0] - d[0], m[1] - d[1]); |
| 116 | x = p2[0]; |
| 117 | y = p2[1]; |
| 118 | } |
| 119 | else { |
| 120 | pointDistance = hypotf(m[0] - t * d[0], m[1] - t * d[1]); |
| 121 | x = p1[0] + t * d[0]; |
| 122 | y = p1[1] + t * d[1]; |
| 123 | } |
| 124 | if (pointDistance < currentDistance) { |
| 125 | currentDistance = pointDistance; |
| 126 | nearest[0] = x; |
| 127 | nearest[1] = y; |
| 128 | } |
| 129 | p1 = p2; |
| 130 | } |
| 131 | return currentDistance; |
| 132 | } |
| 133 | |
| 134 | |
| 135 | int BzfRegion::classify(const fvec2& e1, const fvec2& e2) const { |
no test coverage detected