| 1255 | |
| 1256 | template <class Float> |
| 1257 | void ComputeProjectionX(size_t nproj, const Float* camera, const Float* point, |
| 1258 | const Float* ms, const int* jmap, Float* pj, int radial, |
| 1259 | int mt) { |
| 1260 | if (mt > 1 && nproj >= mt) { |
| 1261 | MYTHREAD threads[THREAD_NUM_MAX]; |
| 1262 | const size_t thread_num = std::min(mt, THREAD_NUM_MAX); |
| 1263 | for (size_t i = 0; i < thread_num; ++i) { |
| 1264 | size_t first = nproj * i / thread_num; |
| 1265 | size_t last_ = nproj * (i + 1) / thread_num; |
| 1266 | size_t last = std::min(last_, nproj); |
| 1267 | RUN_THREAD(ComputeProjectionX, threads[i], last - first, camera, point, |
| 1268 | ms + 2 * first, jmap + 2 * first, pj + 2 * first, radial); |
| 1269 | } |
| 1270 | WAIT_THREAD(threads, thread_num); |
| 1271 | } else { |
| 1272 | for (size_t i = 0; i < nproj; ++i, jmap += 2, ms += 2, pj += 2) { |
| 1273 | const Float* c = camera + jmap[0] * 16; |
| 1274 | const Float* m = point + jmap[1] * POINT_ALIGN; |
| 1275 | ///////////////////////////////////////////////////// |
| 1276 | Float p0 = c[4] * m[0] + c[5] * m[1] + c[6] * m[2] + c[1]; |
| 1277 | Float p1 = c[7] * m[0] + c[8] * m[1] + c[9] * m[2] + c[2]; |
| 1278 | Float p2 = c[10] * m[0] + c[11] * m[1] + c[12] * m[2] + c[3]; |
| 1279 | if (radial == 1) { |
| 1280 | Float rr = Float(1.0) + c[13] * (p0 * p0 + p1 * p1) / (p2 * p2); |
| 1281 | Float f_p2 = c[0] / p2; |
| 1282 | pj[0] = ms[0] / rr - p0 * f_p2; |
| 1283 | pj[1] = ms[1] / rr - p1 * f_p2; |
| 1284 | } else if (radial == -1) { |
| 1285 | Float rd = Float(1.0) + c[13] * (ms[0] * ms[0] + ms[1] * ms[1]); |
| 1286 | Float f_p2 = c[0] / p2 / rd; |
| 1287 | pj[0] = ms[0] - p0 * f_p2; |
| 1288 | pj[1] = ms[1] - p1 * f_p2; |
| 1289 | } else { |
| 1290 | pj[0] = ms[0] - p0 * c[0] / p2; |
| 1291 | pj[1] = ms[1] - p1 * c[0] / p2; |
| 1292 | } |
| 1293 | } |
| 1294 | } |
| 1295 | } |
| 1296 | |
| 1297 | template <class Float> |
| 1298 | void ComputeProjectionQ(size_t nq, const Float* camera, const int* qmap, |
no outgoing calls
no test coverage detected