CHUYÊN ĐỀ: "PHƯƠNG PHÁP GIẢI MỘT SỐ BÀI TOÁN HÌNH HỌC TRONG TIN HỌC" Để có thể giúp học sinh dễ dàng tiếp thu, giải quyết những dạng bài toán đó tôi đã tìm hiểu và viết chuyên đề “Phương
NỘI DUNG
Một số khái niệm cơ bản
1.1 Điểm trên hệ trục tọa độ Oxy
Cho điểm M(x,y) như hình vẽ, x được gọi là hoành độ, y được gọi là tung độ của điểm M trong hệ trục tọa độ Đề Các Oxy, khi đó:
- Giả sử x,y là số nguyên, khi đó biểu diễn điểm
M trong máy tính có thể dùng một trong hai cách sau: typedef pair Point; struct Point
- Khoảng cách giữa 2 điểm A x y ( , A A ) và B x y ( , B B ), hoặc độ dài của vecctor
AB⃗⃗⃗⃗⃗ được tính bằng: d AB x A x B 2 y A y B 2 double dist(Point A,Point B)
1.2 Đường thẳng Đường thẳng trong mặt phẳng xác định khi biết 2 điểm A, B phân biệt nằm trên đường thẳng đó Khi đó đường thẳng được xác định là tập hợp các điểm M(x,y) sao cho: AM t AB (x M x A ;y M y A ) t x( B x A ;y B y A )
Nếu t1 thì M nằm ngoài AB về phía B
1.3 Tích chéo, tích vô hướng của 2 vector
1.3.1 Tích chéo của hai vector:
Tích chéo của 2 vector u (x y u , u ) và v x y v , v
(tích chéo là khái niệm được suy ra từ khái niệm tích có hướng trong không gian vector Ơclit nhiều chiều): u v u v v u u v w u v x y x y x x y y
Giá trị của nó được xác định bằng định thức của ma trận vector u và v, hay có thể tính bằng công thức |u v|, kết hợp với phép nhân của độ dài ||u|| và ||v|| cùng với sin của góc định hướng giữa chúng Góc định hướng giữa hai vector, ký hiệu là (u, v), có số đo từ 0 đến 180 độ, và giá trị lượng giác của nó, cụ thể là sin(u, v), thể hiện mức độ lệch pha giữa hai vector Công thức này giúp xác định mối liên hệ và góc cạnh giữa các vector trong không gian vector.
Tích chéo được sử dụng để xác định chiều quay từ điểm u đến v, cụ thể là chiều quay phải hoặc trái Khi tích chéo có giá trị dương, chiều quay từ u đến v là quay trái, như trong hình vẽ minh họa Ngược lại, nếu tích chéo có giá trị âm, chiều quay là quay phải Khi tích chéo bằng 0, tức là điểm u và v thẳng hàng Hàm `int ccw(Point A, Point B, Point C)` thường được dùng trong các thuật toán tính toán về đồ thị và hình học để xác định hướng quay của ba điểm này.
{ double t=(B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x); if (t>0) return 1; //quay trai if (ta; a+c>b Diện tích tam giác được tính thông qua tích có hướng của vector như sau:
S ABC AB AC AB AC double sTriangle(Point A, Point B, Point C)
Dựa vào diện tích tam giác, ta có thể tính khoảng cách từ điểm C đến đường thẳng d đi qua điểm A, B như sau:
CH AB AB double dist2(Point A, Point B, Point C)
1.3.5 Đa giác Đa giác là một đường gấp khúc khép kín Trong lập trình, một đa giác được lưu bởi một dãy các đỉnh liên tiếp nhau A1, A2, … , AN Khi đó diện tích đại số của một đa giác không tự cắt được định bởi công thức sau:
Nếu S>0 thì ta đã liệt kê các đỉnh theo chiều ngược chiều kim đồng hồ
Nếu S0) or ((P.y-A.y) * (P.y-B.y)>0) then Exit ; thuoc_doan =True;
Một số bài toán hình học
2.1 Dạng 1 Mối quan hệ giữa điểm, đoạn thẳng, đa giác
Phương pháp giải bài toán hình học này tập trung vào việc xác định vị trí tương đối của điểm so với các yếu tố hình học như đường thẳng, tia và đoạn thẳng, dựa trên kiến thức hình học cơ bản đã trình bày Đây là dạng bài toán hình học đơn giản nhất, dễ dàng áp dụng các quy tắc và định lý để xác định mối quan hệ không gian Các bước giải gồm xác định vị trí của điểm so với đường thẳng, tia hoặc đoạn thẳng nhằm đưa ra kết luận chính xác về mối liên hệ của chúng trong không gian hình học.
* Vị trí tương đối giữa điểm và đoạn thẳng, đường thẳng và tia
Để kiểm tra điểm M(x₀, y₀) có nằm trên đường thẳng đi qua hai điểm A(xA, yA) và B(xB, yB), ta cần xác định xem M có thỏa mãn phương trình đường thẳng hoặc không Để kiểm tra M có thuộc đoạn thẳng AB hay không, ta cần đảm bảo M nằm trên đường thẳng này và nằm trong giới hạn của đoạn nối A và B Cuối cùng, để xác định M có thuộc tia AB hay không, ta kiểm tra xem M có nằm trên đường thẳng qua A và B, đồng thời nằm về phía A so với B hoặc ngược lại Các bước kiểm tra này giúp xác định chính xác vị trí của M so với đường thẳng, đoạn thẳng, và tia AB, đáp ứng tiêu chuẩn về tính chất hình học và tối ưu trong SEO.
• Phương pháp: Đặt F(X,Y) = (yA-yB)X + (xB-xB)Y + (xAyB - xByA)
- Điểm M thuộc đường thẳng AB khi F(x0,y0) = 0
- Điểm M thuộc đoạn thẳng AB khi: F(x0,y0)=0 và Min(xA,xB) ≤ x0
≤Max(xA,xB) và Min(yA,yB) ≤ y0 ≤ Max(yA,yB)
- Điểm M thuộc tia AB khi F(x0,y0) = 0 và có nghĩa là M phải thoả mãn điều kiện: F(x0,y0) = 0 và (x0-xA)(xB-xA)≥0 và (y0-yA)(yB-yA) ≥0
Điểm thuộc đa giác là vấn đề xác định xem một điểm đã cho, A(xA, yA), có nằm trong đa giác không tự cắt A1A2 AN hay không Đặc biệt, nếu điểm A nằm trên các cạnh của đa giác, ta xem như điểm đó thuộc đa giác Để giải quyết, ta sử dụng phương pháp kiểm tra bội số góc hoặc kiểm tra các phép tính định hướng con trỏ, đảm bảo tính chính xác trong các trường hợp điểm nằm trên cạnh Các đỉnh của đa giác đều có tọa độ nguyên, giúp đơn giản hóa các phép tính toán trong quá trình xác định vị trí của điểm so với đa giác Phương pháp này hiệu quả cho các đa giác không tự cắt để xác định chính xác vị trí điểm A trong vùng giới hạn của đa giác.
- Lưu toạ độ các đỉnh đa giác vào mảng A
- Kiểm tra xem điểm A có trùng với đỉnh đa giác
- Kiểm tra xem điểm A có nằm trên cạnh đa giác
Tìm giao điểm của tia Ax với các cạnh của đa giác là bước quan trọng để xác định vị trí của tia Ax trong không gian hình học Trong đó, tia Ax được xác định song song với trục Ox và hướng theo phần dương của trục hoành, giúp dễ dàng tính toán và xác định giao điểm chính xác Nếu tia Ax chứa đoạn thẳng cạnh của đa giác, ta xem như tia Ax có một điểm chung với cạnh đó, đảm bảo tính đúng đắn trong quá trình xác định vị trí Việc tìm giao điểm này là cơ sở để kiểm tra xem tia Ax có cắt các cạnh của đa giác hay không, qua đó xác định các điểm giao quan trọng trong giải toán hình học không gian.
+ Giả sử điểm A(x0,y0), chọn điểm B(xb,yb) với xb=x0+1,yb=y0
+ Kiểm tra tia AB có cắt đoạn thẳng CD bằng cách:
Bước 1: Tìm giao điểm N của 2 đường thẳng AB và CD a1=yb-ya; b1=xa-xb; c1=ya*xb-xa*yb; a2=yd-yc; b2=xc-xd; c2=yc*xd-xc*yd;
Xác định: Nếu D ≠0 thì toạ độ giao điểm là N(Dx/D,Dy/D)
Bước 2: Kiểm tra N có thuộc tia AM và đoạn thẳng CD hay không
- Điểm N thuộc đoạn thẳng CD khi: Min(xC,xD) ≤xN ≤ Max(xC,xD) và Min(yC,yD) ≤ yN ≤ Max(yC,yD)
- Điểm N thuộc tia AB khi có nghĩa là N phải thoả mãn điều kiện: (xN-xA)(xB-xA) ≥0 và (yN-yA)(yB-yA) ≥0
- Kiểm tra tia AB chưa cạnh CD hay không bằng cách: (yc=yd)and(yc=yo)
- Đếm số giao điểm, nếu số giao điểm lẻ thì A thuộc đa giác
* Đếm số điểm có toạ độ nguyên thuộc đa giác
Để xác định số điểm với tọa độ nguyên nằm trong hoặc trên biên của đa giác, cần xem xét tất cả các điểm có tọa độ nguyên trong phạm vi của đa giác đã cho Các đỉnh của đa giác được liệt kê theo thứ tự theo chiều kim đồng hồ, giúp dễ dàng xác định các biên và tính diện tích Ý tưởng chính là sử dụng phương pháp kiểm tra tất cả các điểm nguyên trong phạm vi xác định của đa giác để đếm số điểm thỏa mãn điều kiện nằm trong hoặc trên biên Phương pháp này đảm bảo tính chính xác và tối ưu cho đa giác có số đỉnh từ 3 đến gần 10.000, với tọa độ trong khoảng [-10^6, 10^6].
- Xác định số điểm có toạ độ nguyên: Sđ=round(abs(a/2)+b/2+1)
Bài 1: Tập hợp các điểm
Độ lồi của một tập hợp các điểm trên mặt phẳng là kích thước của tập con lớn nhất tạo thành một đa giác lồi Nhiệm vụ của bạn là xây dựng một tập hợp gồm n điểm với độ lồi chính xác là m, trong đó không có ba điểm nằm trên cùng một đường thẳng Đầu vào bao gồm hai số nguyên n và m, thỏa mãn các điều kiện 3 ≤ m ≤ 100 và m ≤ n² Nếu không có giải pháp hợp lệ, bạn cần in ra "-1"; ngược lại, hãy xuất ra n cặp tọa độ nguyên phù hợp với yêu cầu, trong đó các tọa độ không vượt quá |10^8|.
#include using namespace std; int main()
Nguồn: https://codeforces.com/problemset/problem/306/D
Nam yêu thích các đa giác lồi, đặc biệt là những đa giác có tất cả các góc bằng nhau và tất cả các mặt đều khác nhau Anh ấy muốn được vẽ bất kỳ đa giác lồi nào phù hợp với số lượng đỉnh đã cho, đảm bảo các đặc điểm về góc và mặt của đa giác đúng theo sở thích.
Input: Đầu vào chứa một số nguyên n ( 3 ≤ n ≤ 100 ) - số lượng các đỉnh đa giác Output:
Dữ liệu gồm n dòng, mỗi dòng chứa tọa độ (x_i, y_i) của các đỉnh đa giác theo thứ tự ngược chiều kim đồng hồ Các tọa độ này không vượt quá 10^6 về giá trị tuyệt đối, đảm bảo độ chính xác trong phạm vi này Độ dài các cạnh của đa giác nằm trong khoảng [1, 1000], không nhất thiết phải là số nguyên, phù hợp với giới hạn này Quá trình kiểm tra bao gồm so sánh các mặt và góc của đa giác với độ chính xác 10^-3 để xác định các tính chất hình học Trong trường hợp không có giải pháp thỏa mãn các điều kiện đề ra, hãy in ra "No solution".
#include using namespace std; int main()
{ int n; scanf("%d",&n); if(n> n; for ( int i = 1; i > P[i].x >> P[i].y;
{ float g, dx, dy; dx = p2.x - p1.x; dy = p2.y - p1.y; if ( dx == 0) if ( dy > 0) g = PI/2; else g = 3*PI/2; else
{ g = atan(abs(dy)/abs(dx)); if ( dx < 0) if ( dy > 0) g = PI - g; else g = PI + g; else if ( dy < 0) g = 2*PI - g;
//Tim deim co tung do nho nhat j = 1; for ( i = 2; i