1. 程式人生 > 實用技巧 >計算幾何

計算幾何

向量定義及運算

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;
}