Hình học (Geometry) – Phần 1

Đỗ Thị Hồng Ngát 20/12/2023

 

Hình học – Phần 1: Vector, điểm, đoạn thẳng, đường thẳng và các khái niệm liên quan

 

Lý thuyết hình học là một trong những kiến thức được dùng tương đối phổ biến trong một số kỳ thi như: HSGQG, ICPC,… Do kiến thức về hình học tương đối nhiều, nên ở phần này mình sẽ chỉ đề cập tới những khái niệm cơ bản nhất liên quan tới các đối tượng, công thức cơ bản liên quan đến hình học.

Để giải quyết những bài toán liên quan tới hình học, ta thường phải dựa vào những tính toán cụ thể, đặc biệt là những công thức toán học trong hình học giải tích.

Ở bài này, mình chỉ đề cập tới những khái niệm cơ bản nhất liên quan tới chương này là vector, đường thẳng, điểm và đoạn thẳng. Nếu đã nắm chắc phần này rồi, bạn hoàn toàn có thể skip bài này và đi tới các phần tiếp theo.

1. Vector

Cho đoạn thẳng \(AB\). Nếu ta chọn \(A\) làm điểm đầu, \(B\) làm điểm cuối thì đoạn thẳng \(AB\) có hướng từ \(A\) đến \(B\). Hay nói cách khác, vector có thể được hiểu là đoạn thẳng có hướng. Ký hiệu: \(\overrightarrow{AB}\)

ảnh.png
Hình trên biểu diễn vector \(\overrightarrow{AB}\).

Qua đó, độ dài vector \(\overrightarrow{AB}\) chính là độ dài đoạn thẳng \(AB\). Ký hiệu: \(|\overrightarrow{AB}|\) = \(AB.\)

Trong trục tọa độ Descartes, độ dài vector \(\overrightarrow{AB}\) được tính như sau:

Cho 2 điểm \(A(x_{A}, y_{A})\), \(B(x_{B}, y_{B})\). Ta có:

\(|\overrightarrow{AB}|\) \(=\) \(\sqrt{(x_{A} – x_{B})^2 + (y_{A} – y_B)^2}\)

Chứng minh:

ảnh.png

Theo định lý Pitago, ta có: \(AB = |\overrightarrow{AB}| = \sqrt{(AH^2 + BH^2)}\). \((*)\)

Bên cạnh đó, dễ thấy: \(AH = |x_A – x_B|\) và \(BH = |y_A – y_B|\). \((**)\)

Thay \((*)\) vào \((**)\) suy ra điều phải chứng minh.

Tiếp theo, mình sẽ nhắc tới các phép toán liên quan tới vector.

a. Phép cộng vector

Định nghĩa: Cho 2 vector \(\overrightarrow{a}\) và \(\overrightarrow{b}.\) Lấy điểm \(A\) tùy ý, vẽ \(\overrightarrow{AB}\) = \(\overrightarrow{a}\). Từ điểm \(B\), vẽ \(\overrightarrow{BC} = \overrightarrow{b}\). Vector \(\overrightarrow{AC}\) thu được chính là tổng của 2 vector \(\overrightarrow{AB}\) và \(\overrightarrow{BC}.\) Ký hiệu: \(\overrightarrow{AB} + \overrightarrow{BC} = \overrightarrow{AC}\).

image.png

Ngoài định nghĩa, ta còn có thể sử dụng quy tắc hình bình hành để xác định tổng của 2 vector.

Quy tắc hình bình hành phát biểu như sau: Nếu \(ABCD\) là hình bình hành, thì \(\overrightarrow{AB}\) + \(\overrightarrow{AD}\) = \(\overrightarrow{AC}\).

image.png

Chứng minh:

  • Do \(\overrightarrow{AD}\) = \(\overrightarrow{BC}\), mà theo định nghĩa ta có: \(\overrightarrow{AB}\) + \(\overrightarrow{BC}\) = \(\overrightarrow{AC}\) nên \(\overrightarrow{AB}\) + \(\overrightarrow{AD}\) = \(\overrightarrow{AC}\) (điều phải chứng minh).

b. Phép trừ vector

Trước khi tìm hiểu về phép trừ vector, ta cần biết về khái niệm vector đối.

Cho vector \(\overrightarrow{a}\). Vector có cùng độ dài và ngược hướng với \(\overrightarrow{a}\) được gọi là vector đối của \(\overrightarrow{a}\), ký hiệu là \(-\overrightarrow{a}\). Mỗi vector đều có vector đối của chính nó, chẳng hạn như vector đối của \(\overrightarrow{AB}\) chính là \(\overrightarrow{BA},\) cũng đồng nghĩa với \(\overrightarrow{BA} = -\overrightarrow{AB}\).

Qua đó, ta có định nghĩa: Cho 2 vector \(\overrightarrow{a}\) và \(\overrightarrow{b}.\) Ta gọi hiệu 2 vector \(\overrightarrow{a}\) và \(\overrightarrow{b}\) chính là tổng giữa 2 vector \(\overrightarrow{a}\) và \(-\overrightarrow{b}.\) Ký hiệu: \(\overrightarrow{a} – \overrightarrow{b}.\)

Dựa theo định nghĩa trên, ta có kết luận sau: Với 3 điểm \(A\), \(B\), \(C\) bất kỳ, ta luôn có: \(\overrightarrow{AB} – \overrightarrow{AC} = \overrightarrow{CB}.\)

image.png

c. Tích vô hướng giữa 2 vector

Định nghĩa: Cho 2 vector \(\overrightarrow{a}\) và \(\overrightarrow{b}.\) Tích vô hướng của 2 vector \(\overrightarrow{a}\) và \(\overrightarrow{b}\) là một số, và được xác định như sau:

\(\overrightarrow{a}⋅\overrightarrow{b} = |\overrightarrow{a}|⋅|\overrightarrow{b}|⋅cos(\overrightarrow{a}, \overrightarrow{b}).\)

Bên cạnh đó, ta có biểu thức tọa độ của tích vô hướng như sau: Trên mặt phẳng tọa độ \((O, \overrightarrow{i}, \overrightarrow{j})\) 2 vector \(\overrightarrow{a} = (a_1, a_2)\) và \(\overrightarrow{b} = (b_1, b_2).\) Ta có: \(\overrightarrow{a}⋅\overrightarrow{b} = a_1a_2 + b_1b_2\).

Từ 2 định nghĩa trên, ta có:

Độ dài của vector: Cho vector \(\overrightarrow{a} = (a_1, a_2)\). Độ dài của vector \(\overrightarrow{a}\) được tính bằng công thức sau:

\(|\overrightarrow{a}|= \sqrt{a_1^2 + a_2^2}\)

Góc giữa 2 vector: Cho \(\overrightarrow{a}(x_A, y_A)\) và \(\overrightarrow{b}(x_B, y_B)\) khác vector \(\overrightarrow{0}\), ta có:

\(cos(\overrightarrow{a}, \overrightarrow{b}) = \frac{\overrightarrow{a}⋅\overrightarrow{b}}{|\overrightarrow{a}|⋅|\overrightarrow{b}|} = \frac{a_1b_1 + a_2b_2}{\sqrt{a_1^2 + a_2^2}⋅\sqrt{b_1^2 + b_2^2}}\)

2. Điểm, đoạn thẳng và đường thẳng

a. Khái niệm

  •  Điểm: Được xét bằng một cặp số nguyên là tọa độ của điểm đó trong hệ trục tọa độ Descartes. Ta có thể khai báo điểm như sau:
struct Point {
    int x, y;
};

 

  •  Đoạn thẳng: Là một cặp điểm được nối với nhau bởi một phần của đường thẳng.
struct Line_Segment {
    Point p1, Point p2;
};

 

  •  Đường thẳng: Thường được biểu diễn dưới dạng tổng quát \(ax + by + c = 0\) hoặc \(y = ax + b\) hoặc \(ax + by = c,\) có thể được xác định khi đi qua 2 điểm nào đó.
struct Straight_Line {
    double a, b, c;
};

 

b. Công thức cơ bản

  • Khoảng cách giữa 2 điểm trên một mặt phẳng: Cho 2 điểm \(A, B\) lần lượt có tọa độ \((x_A, y_A),(x_B, y_B)\). Khoảng cách giữa 2 điểm \(A\) và \(B\) được tính như sau: \(d = \sqrt{(x_A – x_B)^2 + (y_A – y_B)^2}\)
  • Khoảng cách từ một điểm \(M(x_M, y_M)\) đến đường thẳng \(d\) có phương trình tổng quát \(ax + by + c = 0\): \(h_{(M, d)} = \frac{|ax_M + by_M + c|}{\sqrt{a^2 + b^2}}\).
  • Kiểm tra xem điểm \(M\) có nằm giữa điểm \(A\) và \(B\) hay không: Cho 3 điểm \(A(x_A, y_A), B(x_B, y_B), C(x_C, y_C)\), nếu \(M\) nằm giữa \(A\) và \(B\) thì phải thỏa mãn 1 trong 2 điều kiện sau:
    • \((x_A – x_M) ⋅ (x_M – x_B) > 0\)
    • \((y_A – y_M) ⋅ (y_M – y_B) > 0\)

image.png

  • Phương trình đường thẳng đi qua 2 điểm \(A(x_A, y_A), B(x_B, y_B)\):\(\frac{x – x_A}{x_B – x_A} =\frac{y – y_A}{y_B – y_A}\)⇔ Ta có thể đưa về dạng phương trình tổng quát như sau:\((y_A – y_B)x + (x_B – x_A)y + (x_Ay_B – x_By_A) = 0.\)

image.png

  •  Vị trí tương đối giữa 2 đường thẳng: Ta có 2 phương trình đường thẳng như sau:
      • \(d_1: a_1x + b_1y = c_1\)
      • \(d_2: a_2x + a_2y = c_2\)
        Ta tính các công thức sau:

        • \(d = a_1b_2 – a_2b_1\)
        • \(dx = c_1b_2 – c_2b_1\)
        • \(dy = a_1c_2 – a_2c_1\)
      • Nếu \(d = 0\) và \(dx = 0\) và \(dy = 0\) nghĩa là 2 đoạn \(d_1\) và \(d_2\) trùng nhau.
      • Nếu \(d = 0\) và \(dx\) và \(dy\) đều khác 0 thì \(d_1\) song song với \(d_2\).
      • Nếu \(d\) khác \(0\) thì 2 đường thẳng cắt nhau tại: \(x = dx/d\), \(y = dy/d\).
  • Hai đoạn thẳng giao nhau: Cho 2 đoạn thẳng được xác định bởi \(d_1: A(x_A, y_A), B(x_B, y_B)\) và \(d_2: C(x_C, y_C), D(x_D, y_D)\). Kiểm tra xem 2 đoạn thẳng có thể giao nhau hay không?
    Để giải quyết bài toán này, ta có 2 cách:

    • Cách 1: Tìm giao điểm của 2 đường thẳng \(AB\) và \(CD\). Sau đó kiểm tra xem liệu chúng có thuộc đồng thời cả 2 đoạn thẳng \(AB\) và \(CD\) hay không.
    • Cách 2: Xây dựng 2 phương trình đi qua \(AB(F)\) và \(CD(G)\). Nếu \(AB\) cắt \(CD\) thì \(C,\) \(D\) nằm 2 phía của đường thẳng \(AB\) tức là \(F(x_C, y_C)⋅F(x_D, y_D) < 0\). Còn nếu \(CD\) cắt \(AB\) thì \(A,\) \(B\) nằm về 2 phía của đường thẳng \(CD\) tức là \(G(x_A, y_A)⋅G(x_B, y_B) < 0.\)
      Tóm lại, để đoạn thẳng \(AB\) giao đoạn thẳng \(CD\) thì ta cần có:
      • \(F(x_C, y_C)⋅F(x_D, y_D) < 0\)
      • \(G(x_A, y_A)⋅G(x_B, y_B) < 0\)

3. Vận dụng

Nguồn bài: Phương trình đường phân giác – VNOI

Phân tích bài toán

image.png

  •  Ta có thể đưa bài toán trên về dạng như sau: Cho tam giác \(ABC\), đã biết độ dài của cạnh \(AB, AC, BC\). Gọi \(D\) là giao của đường phân giác góc \(BAC\) và \(BC\). Tìm tọa độ đỉnh \(D\).
  • Theo định lý đường phân giác, ta có: \(\frac{DB}{DC} = \frac{AB}{AC}\)
    → \(DB = \frac{AB}{AC} ⋅ DC\)
    → \(\overrightarrow{DB} = -\frac{AB}{AC} ⋅ \overrightarrow{DC}\)
  • Gọi tọa độ \(D(x_D, y_D)\)
    • \(\overrightarrow{DB} = (x_B – x_D, y_B – y_D)\)
    • \(\overrightarrow{DC} = (x_C – x_D, y_C – y_D)\)
  • Thay vào phương trình trên, ta sẽ giải được tọa độ của \(D\) từ tọa độ \(A\) và \(D\). Và từ đây, ta sẽ tìm được phương trình đường thẳng thỏa mãn dữ kiện đề bài.

Code mẫu

#include<bits/stdc++.h>
using namespace std;

#define int long double

struct Point {
    int x, y;
};

Point X, Y, Z, D;

int get(Point &A, Point &B) {
    return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
}
// tìm khoảng cách khi cho trước tọa độ A và B

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    cin >> X.x >> X.y >> Y.x >> Y.y >> Z.x >> Z.y;
    int xy = get(X, Y), yz = get(Y, Z), xz = get(Z, X);
    int tmp = xy/xz;
    D.x = (Y.x + tmp * Z.x)/(tmp + 1);
    D.y = (Y.y + tmp * Z.y)/(tmp + 1);
    // tính tọa độ điểm D với D là giao của phân giác trong góc BAC với BC
    cout << setprecision(6) << fixed << X.y - D.y << " " << D.x - X.x << " " << X.x * D.y - D.x * X.y;
    return 0;
}

4. Luyện tập

Đây là một số bài tập luyện tập trong sách Competitive Programming Basic của Code Dream, đăng ký mua ngay để được luyện tập nhiều dạng bài về thuật toán khác, chấm bài online tại http://oj.codedream.edu.vn

Unable to display PDF file. Download instead. 

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *