Bài 63: Góc & Phép Quay¶
Tác giả: FPTOJ Team
Nội dung tham khảo từ: CP-Algorithms, VNOI Wiki
1. Góc giữa hai vector¶
1.1 Dùng atan2¶
Hàm atan2(y, x) trả về góc (radian) từ trục \(x\) dương đến vector \((x, y)\), trong khoảng \((-\pi, \pi]\).
1.2 Dùng dot product¶
2. Phép quay điểm¶
2.1 Quay quanh gốc tọa độ¶
Quay điểm \((x, y)\) một góc \(\theta\):
Minh họa trực quan (Phép quay điểm quanh gốc tọa độ):

2.2 Quay quanh điểm bất kỳ¶
Quay điểm \(P\) quanh tâm \(O\) góc \(\theta\):
3. Phép quay 90°¶
3.1 Quay 90° ngược chiều kim đồng hồ (CCW)¶
\((x, y) \to (-y, x)\)
3.2 Quay 90° theo chiều kim đồng hồ (CW)¶
\((x, y) \to (y, -x)\)
4. Ứng dụng: Điểm đối xứng qua trục¶
4.1 Đối xứng qua trục tung \(Oy\)¶
\((x, y) \to (-x, y)\)
4.2 Đối xứng qua trục hoành \(Ox\)¶
\((x, y) \to (x, -y)\)
4.3 Đối xứng qua đường thẳng任意¶
Xem Bài 61 - phần reflectPoint.
5. Kiểm tra điểm nằm trong góc¶
5.1 Bài toán¶
Cho 3 điểm \(O, A, B\). Kiểm tra điểm \(P\) có nằm trong góc \(\angle AOB\) không.
5.2 Ý tưởng¶
Sử dụng cross product để kiểm tra \(P\) nằm cùng phía \(A\) và \(B\) so với \(O\).
6. Xoay hình học¶
6.1 Xoay đa giác¶
Xoay toàn bộ đa giác quanh tâm \(O\) góc \(\theta\):
6.2 Ứng dụng: Bài toán minimum bounding rectangle¶
Xoay đa giác các góc khác nhau để tìm hình chữ nhật bao nhỏ nhất.
7. Bài tập luyện tập¶
Bài 1: Quay điểm¶
Đề bài: Cho điểm \(P(x,y)\) và góc \(\theta\) (độ). Quay \(P\) quanh gốc tọa độ một góc \(\theta\) ngược chiều kim đồng hồ.
Input: 3 số thực \(x, y, \theta\) \((|x|,|y| \leq 10^4, 0 \leq \theta \leq 360)\)
Output: Tọa độ điểm sau khi quay, làm tròn 4 chữ số thập phân.
Ví dụ:
| Input | Output |
|---|---|
1 0 90 |
0.0000 1.0000 |
1 1 45 |
-0.0000 1.4142 |
Lời giải
\(x' = x\cos\theta - y\sin\theta\), \(y' = x\sin\theta + y\cos\theta\). Đổi \(\theta\) từ độ sang radian.
Bài 2: Góc giữa 2 vector¶
Đề bài: Cho 2 vector \(A(x_1,y_1)\) và \(B(x_2,y_2)\). Tính góc giữa chúng (độ).
Input: 4 số thực \(x_1, y_1, x_2, y_2\)
Output: Góc giữa 2 vector (độ), làm tròn 4 chữ số thập phân.
Ví dụ:
| Input | Output |
|---|---|
1 0 0 1 |
90.0000 |
1 0 1 1 |
45.0000 |
Lời giải
\(\theta = \arccos\left(\frac{A \cdot B}{|A| \cdot |B|}\right)\), đổi sang độ.
Bài 3: Điểm đối xứng¶
Đề bài: Cho điểm \(P(x,y)\) và đường thẳng \(Ax + By + C = 0\). Tìm điểm đối xứng của \(P\) qua đường thẳng.
Input: 5 số thực \(x, y, A, B, C\)
Output: Tọa độ điểm đối xứng, làm tròn 4 chữ số thập phân.
Ví dụ:
| Input | Output |
|---|---|
1 0 1 -1 0 |
0.0000 1.0000 |
0 0 1 0 -3 |
6.0000 0.0000 |
Lời giải
Chiếu \(P\) lên đường thẳng \(H\), rồi \(P' = 2H - P\).
Bài 4: Kiểm tra quay¶
Đề bài: Cho 3 điểm \(A, B, C\) theo thứ tự. Xác định \(C\) nằm bên trái, bên phải, hay thẳng hàng so với vector \(AB\).
Input: 6 số thực \(x_A, y_A, x_B, y_B, x_C, y_C\)
Output: LEFT, RIGHT, hoặc COLLINEAR.
Ví dụ:
| Input | Output |
|---|---|
0 0 1 0 0 1 |
LEFT |
0 0 1 0 0 -1 |
RIGHT |
0 0 1 0 2 0 |
COLLINEAR |
Lời giải
Tính cross product \((B-A) \times (C-A)\). Dương = trái, âm = phải, 0 = thẳng hàng.