| 1196 | |
| 1197 | template <class Float> |
| 1198 | void ComputeProjection(size_t nproj, const Float* camera, const Float* point, |
| 1199 | const Float* ms, const int* jmap, Float* pj, int radial, |
| 1200 | int mt) { |
| 1201 | if (mt > 1 && nproj >= mt) { |
| 1202 | MYTHREAD threads[THREAD_NUM_MAX]; |
| 1203 | const size_t thread_num = std::min(mt, THREAD_NUM_MAX); |
| 1204 | for (size_t i = 0; i < thread_num; ++i) { |
| 1205 | size_t first = nproj * i / thread_num; |
| 1206 | size_t last_ = nproj * (i + 1) / thread_num; |
| 1207 | size_t last = std::min(last_, nproj); |
| 1208 | RUN_THREAD(ComputeProjection, threads[i], last - first, camera, point, |
| 1209 | ms + 2 * first, jmap + 2 * first, pj + 2 * first, radial); |
| 1210 | } |
| 1211 | WAIT_THREAD(threads, thread_num); |
| 1212 | |
| 1213 | } else { |
| 1214 | for (size_t i = 0; i < nproj; ++i, jmap += 2, ms += 2, pj += 2) { |
| 1215 | const Float* c = camera + jmap[0] * 16; |
| 1216 | const Float* m = point + jmap[1] * POINT_ALIGN; |
| 1217 | ///////////////////////////////////////////////////// |
| 1218 | Float p0 = c[4] * m[0] + c[5] * m[1] + c[6] * m[2] + c[1]; |
| 1219 | Float p1 = c[7] * m[0] + c[8] * m[1] + c[9] * m[2] + c[2]; |
| 1220 | Float p2 = c[10] * m[0] + c[11] * m[1] + c[12] * m[2] + c[3]; |
| 1221 | |
| 1222 | if (radial == 1) { |
| 1223 | Float rr = Float(1.0) + c[13] * (p0 * p0 + p1 * p1) / (p2 * p2); |
| 1224 | Float f_p2 = c[0] * rr / p2; |
| 1225 | pj[0] = ms[0] - p0 * f_p2; |
| 1226 | pj[1] = ms[1] - p1 * f_p2; |
| 1227 | } else if (radial == -1) { |
| 1228 | Float f_p2 = c[0] / p2; |
| 1229 | Float rd = Float(1.0) + c[13] * (ms[0] * ms[0] + ms[1] * ms[1]); |
| 1230 | pj[0] = ms[0] * rd - p0 * f_p2; |
| 1231 | pj[1] = ms[1] * rd - p1 * f_p2; |
| 1232 | } else { |
| 1233 | pj[0] = ms[0] - p0 * c[0] / p2; |
| 1234 | pj[1] = ms[1] - p1 * c[0] / p2; |
| 1235 | } |
| 1236 | } |
| 1237 | } |
| 1238 | } |
| 1239 | |
| 1240 | template <class Float> |
| 1241 | void ComputeProjectionX(size_t nproj, const Float* camera, const Float* point, |
no outgoing calls
no test coverage detected