計算幾何
阿新 • • 發佈:2020-07-29
向量定義及運算
struct Point { double x, y; }; // 可以當成點,也可以當成向量 Point operator + (Point a, Point b) { return (Point){a.x + b.x, a.y + b.y}; } // 向量加 Point operator - (Point a, Point b) { return (Point){a.x - b.x, a.y - b.y}; } // 向量減 Point operator * (double k, Point a) { return (Point){k * a.x, k * a.y}; } // 數量乘 double dot(Point a, Point b) { return a.x * b.x + a.y * b.y; } // 點乘 double cross(Point a, Point b) { return a.x * b.y - a.y * b.x; } // 叉乘,返回結果為模長 double disc(Point a) { return sqrt(dot(a, a)); } // 向量模長
求向量投影點
\(Prob\):給定三個點\(P_1,P_2,P_3\),確定\(\overrightarrow{P_1P_2}\)在\(\overrightarrow{P_1P_3}\)的投影點
\(Sol\):設投影點為\(P\),顯然有\(\overrightarrow{P_1P}=\lambda\overrightarrow{P_1P_2}\),根據關係
\[|\overrightarrow{P_1P}||\overrightarrow{P_1P_2}|=\lambda||\overrightarrow{P_1P_2}|^2=\overrightarrow{P_1P_2}\cdot\overrightarrow{P_1P_3} \]
解得\(\lambda=\dfrac{\overrightarrow{P_1P_2}\cdot\overrightarrow{P_1P_3}}{|\overrightarrow{P_1P_2}|^2}\)。最後代入\(\overrightarrow{P_1P}=\lambda\overrightarrow{P_1P_2}\),得到點\(P\)的座標
Point Projection(Point P1, Point P2, Point P3) { Point vec1 = P2-P1, vec2 = P3-P1; vec1 = dot(vec1, vec2) / dot(vec1, vec1) * vec1; return vec1 + P1; }