src/geo2d/rotcal/coverage_rect/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../ds/cvh/lib.hpp" | ||
| 4 | |||
| 5 | namespace tifa_libs { | ||
| 6 | |||
| 7 | // clang-format off | ||
| 8 | enum class CVHRECT : u8 { min_area, min_circum }; | ||
| 9 | // clang-format on | ||
| 10 | |||
| 11 | // Coverage rectangle with min circum | ||
| 12 | template <CVHRECT type, class FP> | ||
| 13 | 678 | CEXP polygon<FP> coverage_rect(cT_(cvh<FP>) ch) NE { | |
| 14 | 678 | cu32 n = ch.size(); | |
| 15 |
2/4tifa_libs::polygon<double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, double>(std::conditional<(sizeof (tifa_libs::cvh<double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<double>, tifa_libs::cvh<double> const&>::type):
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
tifa_libs::polygon<long double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, long double>(std::conditional<(sizeof (tifa_libs::cvh<long double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<long double>, tifa_libs::cvh<long double> const&>::type):
✗ Branch 0 not taken.
✓ Branch 1 taken 668 times.
|
678 | retif_((n == 0) [[unlikely]], ch); |
| 16 |
3/4tifa_libs::polygon<double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, double>(std::conditional<(sizeof (tifa_libs::cvh<double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<double>, tifa_libs::cvh<double> const&>::type):
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
tifa_libs::polygon<long double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, long double>(std::conditional<(sizeof (tifa_libs::cvh<long double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<long double>, tifa_libs::cvh<long double> const&>::type):
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 649 times.
|
678 | if (n == 1) return {{ch[0], ch[0], ch[0], ch[0]}}; |
| 17 |
3/4tifa_libs::polygon<double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, double>(std::conditional<(sizeof (tifa_libs::cvh<double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<double>, tifa_libs::cvh<double> const&>::type):
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
tifa_libs::polygon<long double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, long double>(std::conditional<(sizeof (tifa_libs::cvh<long double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<long double>, tifa_libs::cvh<long double> const&>::type):
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 626 times.
|
659 | if (n == 2) return {{ch[0], ch[0], ch[1], ch[1]}}; |
| 18 | 636 | FP ans = std::numeric_limits<FP>::max(); | |
| 19 | 636 | u32 r = 1, p = 1, q = 1, ans_i = 0, ans_r = 0, ans_p = 0, ans_q = 0; | |
| 20 |
4/4tifa_libs::polygon<double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, double>(std::conditional<(sizeof (tifa_libs::cvh<double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<double>, tifa_libs::cvh<double> const&>::type):
✓ Branch 0 taken 80 times.
✓ Branch 1 taken 10 times.
tifa_libs::polygon<long double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, long double>(std::conditional<(sizeof (tifa_libs::cvh<long double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<long double>, tifa_libs::cvh<long double> const&>::type):
✓ Branch 0 taken 4335 times.
✓ Branch 1 taken 626 times.
|
5051 | flt_ (u32, i, 0, n) { |
| 21 | 4415 | const auto ni = ch.next(i); | |
| 22 |
4/4tifa_libs::polygon<double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, double>(std::conditional<(sizeof (tifa_libs::cvh<double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<double>, tifa_libs::cvh<double> const&>::type):
✓ Branch 6 taken 110 times.
✓ Branch 7 taken 80 times.
tifa_libs::polygon<long double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, long double>(std::conditional<(sizeof (tifa_libs::cvh<long double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<long double>, tifa_libs::cvh<long double> const&>::type):
✓ Branch 6 taken 5413 times.
✓ Branch 7 taken 4335 times.
|
19876 | while (!is_neg(cross(ch.vs[i], ch.vs[ni], ch.vs[ch.next(r)]) - |
| 23 | 15461 | cross(ch.vs[i], ch.vs[ni], ch.vs[r]))) r = ch.next(r); | |
| 24 |
4/4tifa_libs::polygon<double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, double>(std::conditional<(sizeof (tifa_libs::cvh<double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<double>, tifa_libs::cvh<double> const&>::type):
✓ Branch 6 taken 90 times.
✓ Branch 7 taken 80 times.
tifa_libs::polygon<long double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, long double>(std::conditional<(sizeof (tifa_libs::cvh<long double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<long double>, tifa_libs::cvh<long double> const&>::type):
✓ Branch 6 taken 4289 times.
✓ Branch 7 taken 4335 times.
|
17588 | while (!is_neg(dot(ch.vs[i], ch.vs[ni], ch.vs[ch.next(p)]) - |
| 25 | 13173 | dot(ch.vs[i], ch.vs[ni], ch.vs[p]))) p = ch.next(p); | |
| 26 |
4/4tifa_libs::polygon<double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, double>(std::conditional<(sizeof (tifa_libs::cvh<double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<double>, tifa_libs::cvh<double> const&>::type):
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 70 times.
tifa_libs::polygon<long double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, long double>(std::conditional<(sizeof (tifa_libs::cvh<long double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<long double>, tifa_libs::cvh<long double> const&>::type):
✓ Branch 0 taken 626 times.
✓ Branch 1 taken 3709 times.
|
4415 | if (i == 0) q = p; |
| 27 |
4/4tifa_libs::polygon<double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, double>(std::conditional<(sizeof (tifa_libs::cvh<double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<double>, tifa_libs::cvh<double> const&>::type):
✓ Branch 6 taken 110 times.
✓ Branch 7 taken 80 times.
tifa_libs::polygon<long double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, long double>(std::conditional<(sizeof (tifa_libs::cvh<long double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<long double>, tifa_libs::cvh<long double> const&>::type):
✓ Branch 6 taken 5641 times.
✓ Branch 7 taken 4335 times.
|
20332 | while (!is_pos(dot(ch.vs[i], ch.vs[ni], ch.vs[ch.next(q)]) - |
| 28 | 15917 | dot(ch.vs[i], ch.vs[ni], ch.vs[q]))) q = ch.next(q); | |
| 29 | FP _; | ||
| 30 | if CEXP (type == CVHRECT::min_area) | ||
| 31 | 4415 | _ = cross(ch.vs[i], ch.vs[ni], ch.vs[r]) * | |
| 32 | 4415 | (dot(ch.vs[i], ch.vs[ni], ch.vs[p]) - dot(ch.vs[i], ch.vs[ni], ch.vs[q])) / | |
| 33 | 4415 | (ch.vs[i] - ch.vs[ni]).norm2(); | |
| 34 | else if CEXP (type == CVHRECT::min_circum) | ||
| 35 | _ = (cross(ch.vs[i], ch.vs[ni], ch.vs[r]) + | ||
| 36 | (dot(ch.vs[i], ch.vs[ni], ch.vs[p]) - dot(ch.vs[i], ch.vs[ni], ch.vs[q]))) / | ||
| 37 | (ch.vs[i] - ch.vs[ni]).abs(); | ||
| 38 |
4/4tifa_libs::polygon<double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, double>(std::conditional<(sizeof (tifa_libs::cvh<double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<double>, tifa_libs::cvh<double> const&>::type):
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 65 times.
tifa_libs::polygon<long double> tifa_libs::coverage_rect<(tifa_libs::CVHRECT)0, long double>(std::conditional<(sizeof (tifa_libs::cvh<long double>))<=((sizeof (unsigned long))*(2)), tifa_libs::cvh<long double>, tifa_libs::cvh<long double> const&>::type):
✓ Branch 0 taken 1545 times.
✓ Branch 1 taken 2790 times.
|
4415 | if (ans > _) ans = _, ans_i = i, ans_r = r, ans_p = p, ans_q = q; |
| 39 | } | ||
| 40 | 636 | point dir = line{ch[ans_i], ch[ch.next(ans_i)]}.direction(), vdir = rot90(dir); | |
| 41 | 636 | line li{ch[ans_i], ch[ans_i] + dir}, | |
| 42 | 636 | lp{ch[ans_p], ch[ans_p] + vdir}, | |
| 43 | 636 | lr{ch[ans_r], ch[ans_r] + dir}, | |
| 44 | 636 | lq{ch[ans_q], ch[ans_q] + vdir}; | |
| 45 | 636 | return {{ins_LL(li, lp), ins_LL(lp, lr), ins_LL(lr, lq), ins_LL(lq, li)}}; | |
| 46 | } | ||
| 47 | |||
| 48 | } // namespace tifa_libs | ||
| 49 |