src/geo2d/tan/cp/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../ds/c/lib.hpp" | ||
| 4 | |||
| 5 | namespace tifa_libs { | ||
| 6 | |||
| 7 | // tagante points of point to circle | ||
| 8 | // maybe duplicate | ||
| 9 | template <class FP> | ||
| 10 | 265 | CEXP auto tan_CP(circle<FP> CR c, point<FP> CR p) NE { | |
| 11 | 265 | std::optional<ptt<point<FP>>> ret; | |
| 12 | 265 | point v = p - c.o; | |
| 13 | 265 | const FP x = v.norm2(), d = x - c.r * c.r; | |
| 14 |
2/2✓ Branch 1 taken 61 times.
✓ Branch 2 taken 204 times.
|
265 | if (is_neg(d)) return ret; |
| 15 | 204 | const point q1 = c.o + v * (c.r * c.r / x), q2 = v.do_rot90() * (c.r * std::sqrt(d) / x); | |
| 16 | // counter clock-wise | ||
| 17 | 204 | ret.emplace(q1 - q2, q1 + q2); | |
| 18 | 204 | return ret; | |
| 19 | } | ||
| 20 | |||
| 21 | } // namespace tifa_libs | ||
| 22 |