| 23 | return asin(cross(b - a, c - b) / abs(b - a) / abs(c - b)); } |
| 24 | double angle(P(p)) { return atan2(imag(p), real(p)); } |
| 25 | point perp(P(p)) { return point(-imag(p), real(p)); } |
| 26 | double progress(P(p), L(a, b)) { |
| 27 | if (abs(real(a) - real(b)) < EPS) |
| 28 | return (imag(p) - imag(a)) / (imag(b) - imag(a)); |