src/geo2d/ds/t/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../ang_pp/lib.hpp" | ||
| 4 | #include "../../cross/lib.hpp" | ||
| 5 | #include "../../dis/pp/lib.hpp" | ||
| 6 | #include "../../dot/lib.hpp" | ||
| 7 | |||
| 8 | namespace tifa_libs { | ||
| 9 | |||
| 10 | template <class FP> | ||
| 11 | struct triangle { | ||
| 12 | point<FP> A, B, C; | ||
| 13 | |||
| 14 | CEXP triangle() = default; | ||
| 15 | 188628 | CEXP triangle(point<FP> CR a, point<FP> CR b, point<FP> CR c) NE : A(a), B(b), C(c) {} | |
| 16 | CEXP triangle(FP a_x, FP a_y, FP b_x, FP b_y, FP c_x, FP c_y) NE : A(a_x, a_y), B(b_x, b_y), C(c_x, c_y) {} | ||
| 17 | |||
| 18 | 284 | friend auto& operator>>(istream_c auto& is, triangle& t) NE { return is >> t.A >> t.B >> t.C; } | |
| 19 | ✗ | friend auto& operator<<(ostream_c auto& os, triangle CR t) NE { return os << t.A << ' ' << t.B << ' ' << t.C; } | |
| 20 | friend CEXP bool operator==(triangle CR l, triangle CR r) NE { return l.A == r.A && l.B == r.B && l.C == r.C; } | ||
| 21 | // (a, b, c) | ||
| 22 | 326 | CEXP pt3<FP> edges() CNE { return {dist_PP(B, C), dist_PP(C, A), dist_PP(A, B)}; } | |
| 23 | // (A, B, C) | ||
| 24 | 24 | CEXP pt3<FP> angles() CNE { return {abs(ang_PP(C - A, B - A)), abs(ang_PP(A - B, C - B)), abs(ang_PP(A - C, B - C))}; } | |
| 25 | 177 | CEXP point<FP> trilinears(FP x, FP y, FP z) CNE { | |
| 26 | 177 | auto [a, b, c] = edges(); | |
| 27 | 177 | x *= a, y *= b, z *= c; | |
| 28 | 177 | return (A * x + B * y + C * z) / (x + y + z); | |
| 29 | } | ||
| 30 | 8 | CEXP point<FP> barycentrics(FP u, FP v, FP w) CNE { return (A * u + B * v + C * w) / (u + v + w); } | |
| 31 | 141 | CEXP FP area() CNE { return abs(cross(A, B, C)) / 2; } | |
| 32 | ND CEXP bool is_acute() CNE { return is_pos(dot(A, B, C)) && is_pos(dot(B, C, A)) && is_pos(dot(C, A, B)); } | ||
| 33 |
6/6✓ Branch 2 taken 53428 times.
✓ Branch 3 taken 5499 times.
✓ Branch 6 taken 48250 times.
✓ Branch 7 taken 5178 times.
✓ Branch 10 taken 5281 times.
✓ Branch 11 taken 42969 times.
|
58927 | ND CEXP bool is_right() CNE { return is_zero(dot(A, B, C)) || is_zero(dot(B, C, A)) || is_zero(dot(C, A, B)); } |
| 34 |
6/6✓ Branch 2 taken 132041 times.
✓ Branch 3 taken 42655 times.
✓ Branch 6 taken 95575 times.
✓ Branch 7 taken 36466 times.
✓ Branch 10 taken 36648 times.
✓ Branch 11 taken 58927 times.
|
174696 | ND CEXP bool is_obtuse() CNE { return is_neg(dot(A, B, C)) || is_neg(dot(B, C, A)) || is_neg(dot(C, A, B)); } |
| 35 | }; | ||
| 36 | |||
| 37 | } // namespace tifa_libs | ||
| 38 |