Ho Huu Son - Ghuyen Nguyen Tat Thanh Kon Tum
Hồ Sĩ Đàm (Chủ biên]
Dễ Đức Đơng - Lê Minh Hồng - Trần Đỏ Hùng - Nguyễn Thanh Hùng
TUAY! [UfEIUI(G[=JUN SN
TIN HOG
Trang 2
MUC LUC
CHUYÊN ĐÈ 8 HÌNH HỌC TÍNH TỐN
I Một số khái niệm cơ bản sessgeeeseceeneeaseeniees `
_H Một số bài tốn cơ bản, .ccccs c2 tt riezrdrrae "
HI Một số bài tốn thơng dụng khác 5-c-c2caSccecseaccsea te | CHUYÊN ĐÈ 9 LÍ THUYÉT TRỊ CHƠI _
_lL Một số khái niệm - St nhàng kg hd nhấn ekgroưkg II _ Trị chợi tổ hợp cân bằng - - ¬ ¬ ce
HI Trị chơi hai người cĩ tổng điểm bằng 0 _ Ha xt re HH CHUYEN DE 10 THUẬT TỐN MƠ PHỎNG TỰ NHIÊN
GIẢI BÀI TỐN TĨI ƯU TO HOP |
I Bài tốn tối ưu tơ hợp PHM TAHT - L( PHEHSC Tore reo HHO See HET H RSET Ree P EEF ee Re ERS
Il Thuật tốn di truyền và tính tốn tiến hố
II Phương pháp tối ưu hĩa đàn kiến POOP ORES T EASES SHEE THEE PROT HEH ETO TOE PEEP REE O TOTP O RTE EET
HƯỚNG DẪN GIẢI BÀI TẬP set
18
Trang 3Chuyén ắ 8
.HÌNH HỌC TÍNH TỐN
_ Hình học tính tốn (computational geometry) là một nhánh của ngành khoa học máy tính, chuyên nghiên cứu về thuật tốn giải quyết các bài tốn liên quan tới các
đối tượng hình hợc Trong tốn học và cơng nghệ hiện đại, hình học tính tốn cĩ
ứng dụng khá rộng rãi trong các lĩnh vực về đỏ hoạ máy tính, thiết kế, mơ phỏng
Do giới hạn nội dưng của cuốn sách, chúng ta sẽ chỉ khảo sát một số bài tốn và thuật tốn căn bản Để giúp cho người đọc nhanh chĩng nắm bắt được ý tưởng và cài đặt thuật tốn, đa số cong thức: hình học được thừa nhận, khơng chứng minh
IL Một tsổ khái niệm cơ bản
- I Hé toa dé Đề-các
Trong mặt phẳng, chọn một điểm Ova hai vecto don vi (vectơ cĩ độ dài 7
vuơng gĩc với nhau Khi đĩ bộ ba (O, ÐĐ được gọi là hệ toạ độ Đề-các vuơng
gĩc (hay cịn gọi là một mục tiêu Ơclit hai chiều, mục tiêu trực chuẩn)
Đơn vị độ dài là một khái niệm quy ước, cĩ thể là cm, mm, inch Ràng buộc về
hal vecto i,j cé thé viét dudi dạng b biểu thức của tích vơ hướng (ích cham): =p=1vaty=0
“Ta cũng kí hiệu mục tiêu đĩ là Oxy với Ởx và aoyn la hai tia gốc O cĩ vectơ chỉ phương lan lượt là Ÿ và ÿ
Trang 4
Điểm O gọi là gốc toạ độ, đường thẳng € Ox được gọi là trục -hồnh và œ4 được gọi là trục tung
Trong kĩ thuật vẽ hình, haí vectơ Ÿ và ƒ thường được vẽ s sao o cho chiều quay tir? tới
7 ngược với chiều kim đồng hồ Ta gọi chiều quày từ vạdo# tới vectơ ƒ là chiều -
thuận, chiễu quay trái hay | ngược chiều kim đồng hỗ ‘(counterclockwise-cew) Ngược lại, ta gọi chiều quay từ vectơ tới vectơ † là chiều nghịch chiều quay phải hay chiều kim đơng hồ (clockwise- cw) |
2 Toa độ
Xét mặt phẳng trực chuẩn (0, zy, với một vectơ 7 bất ki của mặt ghẳng, tồn tại
duy nhất một cặp số thực (%; y) sao cho Ở = xÏ+ yy Cap sé (x;y) khi đĩ được
gọi là toa dé cha vectơ ÿ đối với mục tiêu đã cho, kí hiệu Ở = (z; y)
Các kết quả sau cĩ thé dé dang chứng minh bằng định nghĩa toạ độ:
e_ Vectơ Ÿ cĩ toạ độ (1;0) và vectơ ÿ cĩ toạ độ (0;1) _ -
e Nếu Ủ= (x„;y„) và Ở = (v;y,) thì ÿ = Ở khí a chị: khi x, = x, va
Yu = Vv: TT Ho
e Nếu = („;y„) và ở = (x„;y„) thì tơng vectơ Ủ + Ð = Ce + Xvi Vu + Vy)
và tích vơ hướng ï v= = XuXy + Wuyy ¬ e Néuv= G; y) và k € R thi kv = = * (kx; ky)
Trén mat phing trực chuẩn (0, ij) ta lay một điểm M, "khi đĩ toa độ (x; y) của
vectơ Ở OM được gọi là toạ độ của điểm M, kí hiệu M=(x; y) Ta cĩ mối liên hệ giữa toạ độ của vectơ và toạ độ của điểm:
Nếu M=(xw; Yu) va N= = (xwi Yn) thi MN = ON - OM = = (XN-: — XM: Yu - - Ym)
3 Đổi hệ toạ độ |
Cho hai hệ toạ độ trực chuẩn trên mặt phẳng: (0, 7) và (øz us) 7) Giả sử diém M cĩ toạ độ (x; y) đối với hệ toạ độ (ov ity] 7), bài tốn đặt ra là xác định toạ độ
điểm M đối với hệ toa độ (0, wD |
Gia sử trong hệ toạ .độ (0, ay) diém 0 = :ứ qỀ, vectơ' ẻ = a b), vecto
Trang 5c1 maf+b BD
¬
+,
Điểm M cĩ toạ độ (x; y) đối với hệ toạ độ (0 L,J yt _ — f + tite la |
OM =x + yy"
_ Suy ra | co e ¬ GIẢ ở
OM =00'+ 0" | 2
_ =pÏ+q]+zx(af+bj)+y(đÌ+dJ) (8.2)
= f(ax + cy + p) +ƒ(bx + đy + 4) |
Cong thức (8.2) cho biết rằng điểm M cĩ toạ độ (ax + cy +p; bx + dy +q) đối ˆ với hệ toa độ (0,1,7) Nếu ta gọi (Z; ÿ) là toạ độ điểm M đối với hệ toạ độ
(0, t ty) thì cơng thức (8.2) cĩ thể viết dưới dạng ma trận:
(5) ( 96 +() 83)
| Chú ý ys + Cơng thức đổi toa độ: |
steko mm | = bx + dy +4
Ta cĩ thể nhớ như sau cho dễ: các hệ số ở phương trình thứ nhất là hồnh độ của | ˆ ba vectơ v , Ụ và 00" trong khi các hệ số ở phương trình h thứ hai là ‘tung độ c của ba
| vecto đĩ | Oo |
_
_—# Xây dựng cơng thức biến đãi toa độ_
| Trong hinh hoc phẳng, một trong những kĩ thuật quan trọng là xây dựng cơng _thức biến đổi toạ độ cho các phép đồng đạng (tịnh tiến, quay, đối xứng trục,
¬_ vị tự ) Kĩ thuật chung cĩ thể mơ tả như sau:
e “Trên .hệ toạ độ trực chuân ban đầu (0, È,}), xác định điểm [= = : (1; 0y và
Trang 6e - Với một phép đồng dang f, ta thực hiện ƒ trên ba điểm Ø,¡,J để nhận được ˆ ba ảnh tương ứng của chúng theo thir ty là O,!,J' Từ đĩ xác định toạ độ
điểm 0 = (p; 4) vecto t’ = OT = (a;b) va vectơ J =O] = (c; d)
e Nhận xét rằng nếu điểm M cĩ toạ độ {x;y) đối với hệ toạ độ trực chuẩn đã cho (0,t,7) thì sau phép biến đơi + điểm M sẽ biến thành điểm M' cũng cĩ toạ độ (x; y) nhưng với hệ toa độ trực chuẩn trực chuẩn (o'r L,) J)
° Áp dụng cơng thức (8.2) hoặc (8.3) để xây dựng cơng thức toạ độc của điểm
—_ M theo hệ toạ độ ban đầu
a) Phép quay M’ = 9) Ƒ"'= (—sing;cosa)` J=(0;1) ,® M=(;y) L-—— — =osa; sin ø) 1s (1; 0),
Hinh 8.2 Phép quay ttm Ogĩc a
Ta xét phép quay quanh tâm Ø một gĩc @ 'Phép quay này giữ bất biển điểm 0, tức
là Ø = (0; 0), điểm ï = (1; 0) biến thành T = (cos ø ;sin 2), diém nJ= = (0;1) biến thành J= ( sin @ ; cos a) Như vậy:
: Ti Ø =(0;0);
" oT = (cosa; sina); _Ø7 = =(—sine; cos @)
Ap dung céng thire (8 2) hoặc: (8 3); phép quay thu 0 gĩc a sé bién diém (x;y) |
Trang 7(5)= (ine cosa )()
tức là:
Gfoxsmetpesa (8.4)
Trường hợp đặc biệt: |
Nếu gĩc @ =-90°, ta cé cos z = 0 và sỉn ø = 1 Cơng thức (8.4).trở thành #=—y
=X,
Nếu gĩc a = 180°, day la phép đối xứng tâm 0, cos œ = —l1và sin a=0 Céng | _ thức (8:4) trở thành;
=> oy,
b) Phép tinh tién
Ta xét phép tinh tiến theo vectơ (a; b) Phép tịnh tiến này biến điểm Ø = (0;0)
thành 0ˆ = (4; b) Điểm 7 = (1;0) biến thành ï (z + 1;b) và điểm J = (0; 1)
biến thành Ƒ =(ab+ 1) Như vậy:
0= (a;b);
Fe (1; 0);
07 = (0;1)
kp dụng cơng thức (8.2) hoặc (8.3), phép tịnh tiến theo vectơ (a; b) sẽ biến
điểm (x;y) thành điểm Œ ;ÿ),trong đĩ: ˆ -
0)~6 901 oO
#=x+a
=y+b
tức là:
Trang 8c) Phép quay quanh một điểm cho trước :
Cơng thức phép quay gĩc œ quanh một điểm A cĩ thể xây dựng bằng phương pháp tương tự trên, tuy nhiên ta cĩ thê làm theo cách sau:
Thực hiện phép tịnh tiến theo vectơ 4Ø, sau đĩ thực hiện phép quay tâm 0O gĩc @, rồi thực hiện tiếp phép tịnh tiến theo vectơ OA
Cong thức cụ thể như thế nào xin dành cho bạn đọc d) Phép vị tự
Đề thực hiện phép vi ty tam A = (xg yn) ti sdk, ta cĩ thể dùng phương pháp
như sau:
10
Tịnh tiến theo vecto AO: Điểm (x;y) sẽ biến thành điểm jy) thoả
mãn:
(ee x— Xa =y~ Ya:
Thực hiện phép vị tự tam O ti sé k Phép vi ty nay gitt bat bién diém 0, điểm ¡=(1;0) biến thành ¡ =(k;0), diém J = (0;1) biến thành _Ƒ = (0;k) Như vậy:
0= (0;0);
OT = (k; 0);
Ø7 = (0;k)
Áp dụng cơng thức (8.2) hoặc (8 3), sau phép vị tự tâm O tỉ số k, điểm
(x; y) sẽ biến thành điểm (x”;y") thoả mãn: {, = kx!
tỳ =kÿ
Cuối cùng, ta thực hiện phép tịnh tiến theo vectơ OA:
Trang 9Tổng hợp lại ta được:
(#5 k(x — x4) +4 8.6)
ÿ =kỚ — y4) + y4
5 Một số khái niệm khác
a) Tích chấm
Tích chấm (dot product) hay tích vơ hướng cua hai vecto và ở, ki higu ii ở là một số thực được tính bằng tích độ dài hai vectơ tỉ và nhân với cosin của gĩc ` xen giữa hai vectơ đĩ Gĩc xen giữa hai vecto này là gĩc c khơng định hướng, cĩ
số đo từ 0 tới Tt,
Hàm số cosin là hàm nghịch biến trong khoảng [0; x], né dat giá t trị lớn nhất bằng 1 khi gĩc giữa hai vectơ bằng 0 (hai vectơ cùng chiều), đạt giá trị nhỏ nhất bằng —1 khi gĩc giữa hai vectơ bằng m (hai vecto ngược chiều) và đạt giá trị 0
khi hai vectơ vuơng gĩc (trực giao)
Biểu thức của tích chấm giữa hai vecto 7 = (Xu; Yu) va B= (xy: yy) cĩ thể diễn
giải như sau: :
Ta cĩ:
= (x A (xt + yJ)
= uty 2 + uy J2 + (Xu, ` + 4z) i S¿ “ = (8.7)
= Xuẩy + W9
_ Cũng từ v định nghĩa tích chấm, ta Suy ra cơng thức tính cosin của gĩc hợp bởi hai vectơ tỉ = (Xu; Vu) va B= (xpi Vy):
&\ Ụ Xy + | Oe
COS đ = a mute ue (8.8)
- lal s Wl Vứä+ NS +98) a
Trang 10Tích vơ hướng cĩ thé coi như một độ đo về mức độ cùng chiều giữa hai vectơ Quan trọng hơn, nĩ là cơ sở để xây dựng các khái niệm về khoảng cách và gĩc
Vi dy néu A = (x43 ya) va B = (xg;yg) thì độ đài đoạn thang AB được tính
bằng: | |
VAB? = \[Œạ — xa)°Úg — Ya)”
b) Tích chéo - | |
Tich chéo (cross product) cia hai vectơ 1Í và ÿ, kí hiệu Ở x Ở là một số thực |
được tính bằng tích độ đài hai vecto % va Ở nhan voi sin của gĩc xen giữa hai
vectơ đĩ Gĩc xen giữa hai vectơ này là gĩc định hướng, cĩ số đo từ —zr tới 7,
số đo mang dấu đương nếu chiều quay từ ở tới ở là chiều thuận (ngược chiều
kim đồng hồ) và mang đấu âm nếu chiều quay từ t tới vila chiều nghịch (theo
chiều kim déng hd)
ala 4
Hinh 8.3 Gĩc cĩ hướng
Tích chéo là một khái niệm suy ra từ khái niệm tích cĩ hướng trong khơng gian vectơ Ơclit nhiều chiều Bằng các cơng cụ đại số tuyến tính, người ta đã chứng
minh được cơng thức của tích chéo giữa hai vectơ t = (xụ; y„) và Ở = (Xy;):
— XyVu = Yu Vp _ (8.9)
xỦ = Xu
cuc tức là giá trị của tích chéo băng định thức của ma trận G y,): 4 vi * r v ` a oe Xụ ‘xy
Ta cũng suy ra cơng thức tính sin của gĩc định hướng œz giữa hai vectơ
| t = (Yụ; Yu) và Ủ = (vi Yo):
| t x Ỷ = _Xu}y —Xyy¿
al el VGdz + y2GE + vả)
sina =
Trang 11Về mặt hình học, giá trị tuyệt đối của tích chéo i x ở là diện tích hình bình hành
OABC, trong dé Ola gốc toạ độ, OA = ủ, 0Ẻ = ư và 0B =ủ+ư
_ Tích chéo cĩ một ứng dụng quan trọng trong viéc khao sát chiều: Gia s sử ta đi từ điểm A sang điểm B theo đường thẳng và đi tiếp sang điểm C theo đường thắng, khi đĩ:
e Tích chéo AB x BC sẽ là số dương nếu chỗ ré tai Bla “rẽ trái” (hay nĩi - đúng hơn là bẻ gĩc ngược chiều kim đồng hd);
e Tích chéo 4B x Bẻ là số âm nếu chỗ rẽ tại B là “rẽ phải”;
e _ Tích chéo 4B x BC = 0 cĩ nghĩa là ba điểm 4, B,C thắng hang Hình 8 4 Rẽ trái và rẽ phải
Ta lấy ví dụ về một ứng dụng của tích chấm và tích chéo: Trên mặt phẳng, cho ba điểm A = (4:4) B= (xgi yg) va C = (xci Yc); hay cho biết điểm € cĩ nằm trên đoạn thẳng AB hay khơng _
Điều kiện cần và đủ để € nằm trên đoạn thẳng AB la: A,B,C thăng hàng và hai vectờ AC, BẺ khơng cùng hướng hoặc một trong, số chúng là vectơ 0 Điều u kiện này cĩ thể viết bởi
A x Bể = 0 và 3Ẻ.BẺ < <0
¢) Đường thắng
Cĩ nhiều cách biểu diễn: một đường thắng và do đĩ cĩ nhiều cách biểu diễn
đường thẳng trong máy tính Sau đây là một số cách biéu diễn thường được sử dụng khi giải quyết các bài tốn tin học:
e Dang: y = ax + ở Mỗi đường thắng được đặc trưng bởi một cặp hai hệ sé a và ở, tuy nhiên dạng biểu diễn này khơng thể hiện được các đường thing
song song với trục Ớy
-
Trang 12e Dang téng quat: ax + by = c Mỗi đường thẳng cĩ thể được biểu diễn bởi bộ ba hệ số (a, b, e) Đây vẫn là cách lưu trữ thơng dụng nhất do tính tổng quát -
va trực quan của nĩ (gần gũi với đồ thị hàm số) Vectơ pháp tuyến ?Ì(q; b) — cĩ thể được dùng để viết một phương trình đường thăng tương đương ngắn
| gon hon: ïi.OP = (a;b):(%; y) =ax + by =c voi moi P(x; y) nam trén
đường thẳng Dạng tong quát này cịn được kí hiệu là (ỉ, c)
e Dang tham số: (P, d), trong do P la mét diém trén đường thang cịn dla vecto chỉ phương của đường thẳng với toạ độ là: (-b; a) Nhu vay, mot
đường thắng được xác định bởi bộ bốn sé xo, yo, a va b trong dé (xo; yo) la
toạ độ điểm P cịn (~b; a) là toạ độ của vectơ đ Biểu diễn này cĩ ý nghĩa:
đường thắng là: tập các điểm cĩ toạ độ chính là toạ độ của vectơ OP + sd
Với mỌi s E R :
Chuyên đổi giữa các biểu diễn được thực hiện dựa trên biến đổi tương đương đại số, cùng với cơng thức chuyển đổi giữa vecto chi phuong d(— b; a) va vecto phap tuyén 7i(a; »”
d) Gĩc
Gĩc thể hiện sự khác nhau về hướng của các vectơ và được biểu diễn bởi một số
thực Gĩc cĩ nhiều đơn vị khác nhau: °, rad Trong lập trình, để giảm sai sé va
tăng tốc độ tính tốn, người ta tránh dùng arcsin, arcos mà thay vào đĩ bằng các | đại lượng cĩ cùng tính thứ tự như gĩc: sin/cos/tang cua mét gĩc cĩ thể được tính
nhanh hơn bằng tốn tử +, ~, *, / cĩ sẵn trong các ngơn ngữ lập trình
e) Đagiác
Đa giác là một đường gap khúc khép kín Trong lập trình, một đạp giác được lưu
bởi một dãy các đỉnh liên tiếp nhau 4, 4a, , Án,
Diện tích dai số của một đa giác khơng tự cắt cĩ thể được xác định bởi cơng
thức: -
5 - G ~1z)Œ + Ya) + G2 = #3)(y; + y3) liên + (Xn — %1) Yn + Yi)
is chinh 1a diện tích của đa giác
Trang 13Day đỉnh c của đa giác cĩ thể được lưu cùng hoặc ngược chiều kim đồng hồ Ta cĩ thê biết thứ tự lưu đỉnh nhờ dấu của S: S > 0 cĩ nghĩa là đỉnh của đa giác được liệt kê ngược chiều kim đồng hồ (và ngược lại)
Để hình dung cơng thức trên, ta cĩ thể dựng các đường thang đứng xuống trục hồnh Mỗi hạng tử sẽ là diện tích đại số của một hình thang thành phan Dién | tich cac hinh thang phía trên sẽ ngược dấu với các hình thang bên dưới, từ đĩ cho ta điện tích đại số của đa giác khi lay tổng của chúng
Nếu van phân vân về lời giải thiếu tính xây dựng trên, ta cĩ thể xây dựng lại cơng thức tính diện tích bằng cách khác: tính tơng diện tích các tam giác A424, A444, : , AvuÁa-i4„ Diện tích mỗi tam giác được tính bằng tích cĩ hướng của - hai vectơ 4;¡4,_; và A¡Á,, i=3:n n, do đĩ đây là diện tích cĩ dấu Tổng của các diện tích này sau khi rút gọn sé dua vé biểu thức trên đây và do đĩ cũng lí giải
tại sao Š lại là diện tích đại sé
Dưới đây là chương trình tính diện tích đa giác với khuơn dạng Input/Output nhu sau:
Input "
e Dịng đầu tiên chứa số định n cia đa giác (isns 10°);
eon dong tiép theo, dịng thứ í chứa hai số thực Xin Vi la toạ độ đỉnh ¡ của đa giác
| Output a | |
Chiều của đa giác (CCW/CW) và diện tích đa giác -:
Trang 14a POLYGONAREA PAS ¥ Tink diện tích đa ie (§MODE OBJFPC} program PolygonArea; uses Math; cĩ const maxN = 1000000; var
x, Vy! array [0 -maxN + 1) of Float; -i, n: Integer; s: Float;
begin
ReadLn (n}¿
for i := 1 to n đo 'ReadLn (x[i]„ y[iil)z- x{Ư0]-:= x[n]; xịn + 1] = x[1]z;
“s t= 0; ` ¬ “{
for ¡ := l1 tonn do | _ - s := s + vy[i] * (x[i - 1] - X[i + 1]);
if s > 0 then WriteLn('Polygon direction: CCW") else WriteLn('Polygon direction: CW");
WriteLn('Area = ', Abs (s) /2:0:4)¿ end ˆ ,
f) Đường trịn ẻ cac bu
Đường trịn (Ĩ; #) là tập hợp các điểm cách đều tâm O(x; y) một khoảng cách Ầ Đường trịn được hồn tồn xác định bởi bộ ba số (x, y,R)(R> 0)
II Một số bài tốn cơ bản
1 Biểu diễn tuyến tính
dé:
= pa+qb Hai sé p,q cd thé tinh bing cơng thức:
_éxb_ px
P=¬xp Dˆ
đxẻ Dy
1 axe dD’
16
Trang 15_s Nếu D=äx b * 0 thì cĩ duy nhất một cách biểu diễn tuyến tính vecto ẻ
_ qua hai vectơ đ và b (nghiệm (p; q) là duy nhất) _
e NếuD=0,hai Vectơ ở và b song song với nhau, khi đĩ: s (p;q)= (Nan;Nan) nếu ể Song song với cả đ và b:
a (p;q) = (Inf; Inf) nếu ể khơng song song với d va b
Ta viết hàm | ni
function SolveSLE(const a, b, c: TVector): TVector;
- nhận vào ba vectơ d, b, 2 và trả về một vectơ cĩ toa ¢ d6 (x; y) tuong ứng với hệ
số (p;, q) cần tìm:
function SolveSLE (const a, b, c: TVector): TVector; D: Float;
| begin
D i= a >< b; / “
Result := Vector ((c >< b)/D, (a >< c)/D); - 2
_ end; ca Sa |
2, Tim giao diém cua hai đường thang
Trén mat phang với hệ toạ độ Đề-các vuơng gĩc cho hai đường thẳng với
phương trình tong quát: - x `
Ax+ By + Cy = 0;
A2x + Boy + 2 = = 0
Bai toan dat ra la xác định giao điểm của hai đường thắng đã cho
Dat t= (Ay; Ao), p= (By; B2) và W = (— ~Œ; —€Œ¿), bài tốn trở thành bài tốn
biểu diễn vectơ W qua tổ hợp tuyến tính của hai vectơ tỉ và W |
w= x.U + y v
Việc cịn lại chỉ là biện luận cho giá tr] giao điểm tìm được
Trang 16-TPoint = “record `X, yi ‘Float; end; - TVector = TPoint;:
al, bl, cl, a2, b2, c2: Float;
p: TPoint;'
funetion Vector(x, y: Float): Tvector;
begin ,
Result.x := x; Result.y-:5 y;
end; an
WTich chéo của hai vectơ
Operator >< (const uw v: TVector): Float;
begin , tự
Result := u.x * v.V — u.V * V.x;
end;
/Biểu diễn tuyến tính
' function SolveSLE(const a, b, c: TVector):
var _D: Flioat; begin D:= a >< b; Result := Vector((c >< b)/D, (a >< c)/D); end; AChương trình chính BEGIN -
‘SetExcept ionMask { [Low (TFPUEXceptionMask) High (TFPUExceptionMask) ] ) ;
ReadLn (ai, bị, c1, a2; b2, c2);
“Tim giao điểm của hai đường thắng
pp != SolveSLE (Vector (al, a2), Vector (bl, b2), Vector(cl,c2));
if IsNan(p.x) then /Hai đường thăng trùng nhau -
_"Writehrn(* Two lines are coincident ' )
else if IsInfinite(p x) ‘then //Hai đường thăng song song
WriteLn('Two ‘Lines are parallel" )
else //Hgi đường thăng cĩ giao điểm duy nhất:
WriteLn (‘Intersection point (yp x:0: 4, w
Trang 173 Tìm giao điểm của hai đoạn thẳng
Bài tốn tiếp theo ta xét là cho bốn điểm A, B, C, D trên mặt phẳng, hãy cho biết
hai đoạn thắng AB và CD cĩ giao điểm duy nhất khơng, nếu cĩ cho biết toạ độ
giao điểm =
Hinh 8.6
Để tìm; giao điểm của hai đoạn thẳng 4B và CD ta cĩ thể:
e _ Viết phương trình tổng quát của hai đường thắng AB và CD;
—®_ Tìm giao điểm M của hai đường thẳng:
° Kiểm tra M cĩ năm trên đoạn thắng AB va trén doan thing CD hay khơng one trình của đường thẳng đi qua hai điểm phân biệt A= = (Xa; Ya) va
= (%pg; yg) là
(x — xa) * Úg — ~y4) = = L(y Ya)* (xe —X4)
Ta cĩ thể biến đổi phương trình trên về phương trình tổng quát Và sử dung t ham SolveSLE dé tim giao diém M cua hai đường thẳng ÁP và CD, sau đĩ kiểm tra M cĩ nằm trên hai đoạn thẳng AB và C D hay khơng
Cách làm này kéo theo nhiều phép tính Thơng hiệu quả, ta sẽ sử dụng cơng thức khác
Trang 18Nhu vay, ta chỉ cần tìm biểu diễn tuyến tính cua: AC qua AB va Be, sau khi cĩ
cặp số p, q; ta kiểm tra: điều kién p,q € l9, 1] và tính toạ độ giao điểm M theo
ecéngthte: -S tà `
0M = Ộ+pAB.-
Thuật tốn như sau: -
Input — A, B,C, D: TPoint;
r := SolveSLE(B - A, C ~ Dy, C - A);
if not InRange(r.x, 0, 1) or not InRange(r.y, 0, 1) then
Kiểm tra nghim [0, 1]
Output ô&â Khơng cĩ giao điểm uy nhất else
begin con
p:EA+ (B-A) * r.x;
Output © Giao điểm duy nhắt (px, Pp.-y) -`
end; :
4 Tìm giao điểm giữa một đoạn thẳng và một tỉa
Để tìm giao điểm duy nhất giữa đoạn thắng 4B và tỉa CD, ta cĩ thể sử dụng phương pháp tương tự như trên: Nếu M là giao điểm duy nhất của đoạn thắng
AB va tia CD thì sẽ tồn tại duy nhất một cặp số thực p,g, trong đĩ p € [0; 1],
q €[0;+0) saocho -
`
(7 - p AB
CM = qCD
Áp dụng thuật tốn như trước, chỉ cĩ điều sau khi tìm được cặp số p,q, ta khong
kiểm tra p,q € [0; 1] mà kiểm tra p € [0; 1] vả q >0
Cách tìm giao điểm của đường ‘thing AB với đường thắng CD, tia AB với tia CD, đường thắng AP với đoạn thẳng CD cĩ thể thực hiện theo cách tương tự, chỉ
._ cần sửa đổi phạm vi của tham số P.4 |
5 Pa gĩc giữa hai yecfơ ` `
«Bai tốn: Cho hai vectơ khác 0: % và ở Cần tìm sé do gĩc định hướng từ Ở tới
_Ỡ Số đo gĩc định hướng nằm trong phạm vi Ca 1; nÌ
Trang 19Thu vién math cung cap ham ArcTan2(y, +) trả về gĩc định hướng tạo bởi vectơ (1; 0) véi vecto (x; y) Ta cĩ thể sử dụng hàm này dé tinh gid t trị gĩc định hướng từ # tới ở bằng cách viết: ơn
| ArcTan2(ï xX B, UV)
_ Thủ tục như sau: ,
function Rad(const u, v: TVecto): Float;
begin _ Result := ArcTan2(u >< v, u * v); end; 6 Tính diện tích |
a) Dién tich tam giác
-_ Hình 8.7
Tuỳ thơng tin được cho mà ta SỬ r dụng cơng thức giải tích thích hợp dé tinh diện
tích tam giác: "¬ CS a `
- - Nếu biết độ dài một cạnh của tam giác là a và chiều cao tương ứng với
cạnh đĩ là ở thì diện tích tam giác cĩ thê tính bởi cơng thức:
ath `
- _ Nếu biết độ dài hai cạnh tam giác là b và.c, đồng thời gĩc xen giữa hai
cạnh đĩ là 4 thì diện tích tam giác cĩ thê tính bởi cơng thức:
bc sin A ¬
po |
“Nếu ta biết độ dai ba canh cua ‘tam giác lá a, Lb, c thì diện tích tam giác cĩ thể tính bởi cơng thức Hê-rơng:
š =vP(P.~ 8)(P — b)(p ~ ©), |
S=
to _“=
Trang 20
——=
trong đĩ p = —
- (nửa chu vi),
- Néu biét hai vecto AB va AC thi dién tich tam n giác cĩ thể tính bing c cơng
| thức tích chéo:
2E x AC |
Cơng thức này cĩ thể viết lại khi ta biết toạ độ ba điểm A = Gái VÀ), ộ
B = ặg;p) và C = (Xc;7c): |
S= (sn ă xe - ya) — (X¢ — *A)(ypg - 5| (8.10)
Chú ý rằng nếu bỏ dấu giá trị tuyệt đối, cơng thức tính điện tích ở trên sẽ cho giá
trị dương nếu hướng quay tir vecto AB toi vecto AC là hướng thuận Ngược lại, cơng thức sẽ cho giá trị âm nếu hướng quay tir vecto AB tới vecto AC la huéng
nghich
b) Diện tích da giác
“Trên mặt phẳng với hệ toạ độ Đẻ-các vuơng gĩc, cho đa giác P = P,P, «Ph, trong đĩ diém P; c6 toa 46 (x;;5;) BS sung thém diém Py = Py va điểm
Pav = = P,, khi d6 điện tích đa ee được t tinh theo cơng thức c (8 1 1):
t1 (8.11) = Hiền, ~#e2)| =1 _ Chứng minh
Giả sử rằng các đỉnh của đa giác được đánh số theo so hướng thuận (ngược chiều kim _ —_ đồng hồ), ta nối các điểm P,, Pz, Ph với sốc toạ độ Ø, được n tam giác:
ˆ Cụ dhẻ đà mắu tá đi dọc theo các cạnh của đa giác theơ thử tự P, P;, , fạ, P, thì phía tay trái là miền đa
a
Trang 21P.0P;, P,OP3, .g P,-19P, P,OP,
po
Q0:
ˆ Hình 8.8
Trong hình 8 8, ta xét một tứ giác với bồn đỉnh P, P;, P;, P„ Diện tích của tứ gác này cĩ thể tính bằng:
_.= —8a(P,0P,) — ~ 5q(P,0Ps) + Sa(P0P„) + Sa(P,0P,)
tức là diện tích đa giác cĩ thể tính qua các diện tích các tam giác S (P,0P,.:) Khi
một hạng tử S,(P,OP,41) xuất hiện trorig tổng, nĩ sẽ được mang dấu “+” nếu chiều
quay từ vectơ OP tới vectơ OP isa là hướng thuận, ngược lại, hạng tử này sẽ mang
dấu “-” Thật may mắn, giá trị (cĩ dấu) của các hang tr S, (P,OP,„+) cĩ thể tính 'bằng cơng thức tích chéo (8.9) nhưng bỏ dấu giá trị tuyệt đối Tức là điện tích (cĩ
dấu) của tam giác PO Peas sẽ được tính bang:
S4(P.OP 41) = 50K X OF va nhu vay ta cĩ cơng thức tính diện tích đa giác P:
~
-s=1@ OP, x OP, + OP; x Õ; + -+ OP, xØ )
(5 OOF) ơ _ (Đ12)
t=1 a ` a
(quy ue Psi = Py)
Khi các đỉnh của đa giác được đánh số theo chiều nghịch heo “chiều kim đồng - hỗ), bằng lập luận tương tự, ta cĩ cơng thức diện tích đa giác la
Ss 2Ơ OF x oF: | (8.13)
Tổng hợp lại, cơng thức tính diện tích đa giác cĩ thể viết thành:
Trang 22_ n i `
=3 [2,08 x OP as (8.14)
(=1
mà khơng cần quan tâm tới đa giác được đánh số theo chiều thuận hay chiều
_nghịch
Bây giờ ta sẽ sử aang tới toạ độ để xây dựng cơng thức tính diện tích đa giác dựa trên các toạ độ đinh Vectơ OP cé- toa độ i 3⁄2) dựa vào cơng thức toạ độ của tích chéo, ta cĩ: sai =1 Sou xia) t=1 2l tơ - Xi) : : , (8.15) " 1 =2
Việc chứng minh đẳng thức thứ hai cĩ thể sử dụng vài phép biến đổi đại số Ở đây ta cĩ thể hình dung như sau: Do cơ chế quay vịng số thứ tự (đỉnh 0 trùng với đỉnh
n và đỉnh + 1 trùng với định 1), với mỗi đỉnh í sẽ cĩ đúng một hạng tử †Z¡_1y¡ và một hạng tử Xia xuất hiện trong tổng Ài~3(X(Zi+t — #¡+4⁄() Ta co thé _ ghép hai hạng tử này lại với thừa số chung Ye
Nếu như việc ‘tinh dang | thức thứ nhất edn 2n phép nhân thì ở đẳng thức thứ hai ta chỉ cần n phép nhân mà thơi (s6 phép cộng và phép trừ khơng thay đổi) Chính vì
vậy, đẳng thức thứ hai hiệu quả hơn khi lập trình tính điện tích đa giác a Chú ý: Khi sử dụng cơng thức (8:11): -
24
Ta cĩ thể xác định: phép đánh số các đỉnh đa giác là thuận hạy nghịch dựa vào cơng thức tính diện tích: Bỏ dấu giá trị tuyệt đối trong cơng thức (8.11), khi đĩ $ > 0 tương ứng với phép đánh : số thuận và S < 0 tương ứng với phép đánh số nghịch ˆ
Đường biên đa giác phải | là một đường gấp khúc khép kín, khơng tự cắt Cơng thức (8.11) sẽ sai nếu dữ liệu vào khơng thoả mãn điều kiện này
Trang 23Ya
Hình 8.2
Cơng thức (8 11) sẽ tính được diện tích miền mặt phẳng giới hạn bởi đường gấp _ khúc này là 0, tuy nhiên trên thực té thi diện tích miễn này | là 0 > _
c) Diện tích đường cong
Trên mặt phăng cho € là một đường cong khép kín, | Khong we cắt, trơn ting
khúc, ‹ cĩ 'ĩ phương trình tham số: ca 7
y= =0) với £ € Ta, BỊ, x(a)= x(b) va y(a) = y(b)
Ta cĩ thể hình dung khi t chay tir a toi b thi các điểm (x(t); y(t)) vé ra trén mat
phang trực chuẩn một đường cong khép kín khơng tự cắt C Đường cong C trơn
từng khúc tức là ta cĩ thể chia khoảng [z; b] thành một số đếm được các khoảng
con mà trên mỗi khoảng con đĩ, các đạo hàm x(t) va y'(t) là các ham lién tục _ Khi đĩ, diện tích của miền mặt phẳng Ð giới hạn bởi đường cong ( € cĩ thể tính
qua một hệ quá của cơng thức Green trong giải tích hàm:
mm "
3 5 | 4 xdy — ye
_: (8.16)
s[ (x(y'(0) ~ y(9z'())át c
Chú jy: Cơng thức (8.16) cho kết quả là diện tích cĩ dấu của miền D (là số âm nêu miền D được định hướng nghịch) Cĩ thể thêm vào cơng thức dấu giá trị - tuyệt đối nếu chỉ cần biết điện tích
Trang 24-_ Thực ra cơng thức tính diện tích đa giác mà ta trình bày ở mục trước chỉ là
trường hợp riêng của cơng thức (8.16) Việc chứng minh cơng thức (8.16) cần phải sử dụng nhiều kiến thức của tốn cao cấp, ta chỉ cần nhớ và áp dụng
Ví đụ: Xét đường trịn tam O ban kính R, đường trịn này cĩ phương trình tham số = =Rcost y=Rsint với t € [0; 27] | Áp dụng cơng thức (8.16), ta cĩ diện tích hình trịn: 1 21m , 1 2 S=5 (R? cos’ t t +R? sin} t)dt = 3k dt = nR? 0 ~ , ¬ : 0
HH Một số bài tốn thơng dụng khác
_1 Tam giác
Xét một tam giác xác định bởi toạ độ ba đỉnh là ba điểm AA x; 4.y), BB Xx} By), C(C.x; C.y} Kí hiệu a, b, c 1a d6 dài ba cạnh của tam- giác 4BC
a) Đường trịn ngoại tiếp tam giác
- Tâm đường trịn ngoại tiếp tam giác 48C là giao điểm của hai đường trung trực thuộc hai cạnh của tam giác Đường trung trực của cạnh 4B được xác định thơng qua trung điểm M (Ae) cua cạnh 4 AB và vecto chỉ phương là vectơ pháp tuyến của đường thắng AB
b) Đường phân giác |
Đường phân giác của gĩc AB c được xác định thơng qua dạng biểu diễn (P, d) trong đĩ P chính là điểm B cịn vectơ đ xác định theo cơng thức sau:
4 BA Be = t+
[Ba] [BC]
Trang 25c) Duong trịn nội tiếp tam giác |
Tam của đường trịn nội tiếp tam giác 4BC cĩ thể xác định bằng cách tim giao | điểm của hai đường phân giác -Tuy nhiên, ta cĩ thể sử dụng cơng thức tốn học để xác định toa do tâm của đường trịn nội tiếp chính là toạ độ của vecto:
a.0A +b OB +c OC
a+b+c
trong dé Ola gốc toa độ.-
Bán kính đường trịn nội tiếp bằng
| _ 25 |
nS atbtc
với S la dién tích tam giác
2 Kiểm tra điểm nằm trong ẩa giác
Bài tốn Trên' mặt phẳng với hệ toạ độ Đề-các vuơng gĩc, cho đa giác P = P,P, P, va mét điểm A Hãy cho biết điểm A cĩ nằm trong đa giác hay khơng
| Thuật tốn
Néu A thuộc một cạnh đa giác thì kết luận ngay A nằm trong đa giác Nếu khơng,
từ điểm A, xác định một tia gốc A khơng đi qua đỉnh nào của đa giác, gọi tỉa này là tia AB Cĩ nhiều cách chọn tia này, chăng hạn như chọn ngẫu nhiên m + 1 tia
đơi một khác nhau, khi đĩ chắc chắn sẽ cĩ một tia khơng đi qua đỉnh nào của đa | giác Tuy nhiên trên thực tế, phương pháp thực dụng tỏ ra hiệu quá hơn: sinh
ngẫu nhiên một tia, nếu tia đĩ đi qua một đỉnh của đa giác thì sinh ngẫu nhiên
một tia khác và thử lại |
Nếu tỉa AB cắt cạnh da giác một số lẻ lần thì điểm A năm trong đa giác, ngược
lại thì điểm A nim ngồi đa giác
Tất cả những kĩ thuật tìm giao điểm, xác định tia đã được nĩi đến trong các bài
trước, ta chỉ tơng hợp lại các kĩ thuật này dé ° lêp trình \ giải bài tốn điểm nằm trong đa giác
ae |
Trang 26e n dịng tiếp theo, dịng thứ í chứa hai số thực x¿, y¡ là toạ độ định P; của đa giác
Output |
-_ Cho biết điểm 4 cĩ nằm trong đa giác P hay khơng? ƯM PTINPOLYGON, PAS v Kiểm tra điển tờ,
{$MODE OBJFPC}
program PointInPolygon;
uses Math;
const
maxN = 1000000; epsilon = 1E-6;
type ˆ cĩ TPoint = record x, y: Float; end; TVector = TPoint; var th p: array[1 maxN + 1] of TPoint; n: Integer; A, B: TPoint; Inside: Boolean;
function Vector(x, y: Float): Tvector;
begin
Result.x := x; Result.y := y;
‘| end; củ mm
/Pháp trừ vectơ x , "
operator ~ (const u, vi: TVector): TVector;
begin — ch "¬
Result.x := u.x + v.x;
Result.y := u.y.r vey?
end;
| /Tich chdm cia hai vecta
operator * (const u, v:.TVeetor}: Float; - FO Hoo begin : `
Result := u.x * V,x + U.V * V.V;
end; So cà
/Tich chéo của haivedd =
operator >< (const u, vi TVector) +: Float;
begin °
Result t= u.x * v.y -u.y * V,X;
end; | ee
Trang 27
procedure Enter; var i: Integer;
begin
ReadLn(n, A.x, A.y);
for i := 1 ton do with p[i] do begin ReadLn(x, y); end; ˆ p[n + 1] := p[1]; end;
Kiểm tra điểm nằm trên đoạn thẳng ;
function OnSegment (const P, 0: TPoint): Boolean;
begin ˆ ;
Result := IsZero(P >< Q, epsilon) and (P * @ <= 0) end; Tạo tia procedure MakeRay; var OK: Boolean; i: Integer; begin repeat ` „ 1 OK ;= True; B.x := Random; B.y := Raridom;
for i := 1 ton do oe `
af IsZero((B - A) >< p[i], epsilon) then begin Tra ‘ OK := False; Break; end; until OK; end;
/Biểu diễn tuyến tính
function SolveSLE(const a, b, c: TVectơ): TVectơ;
var D: Float;
begin
“Do i= a >< bp /
Result := Vecto((¢ >< b)/D, (a >< ©)/D);”
end;
' /Kiểm tra tia cắt cạnh đa giác
Ẩfunction Cut (consat C, D: TPoint): Boolean; —
var r: TVectơ; Tơ ^ sở
Trang 28
begin
r := SolveSLE(B - A, C - D, C - A);
Result := (r.x >= 0) and InRange(r.y, 0, 1);
end; ,
function Check: Boolean;
var i: Integer;
begin `
for i := 1 ton do - if OnSegment (p{il, b[l + 11) then Exit (True);
MakeRay; a ` _Result := False; `
for i := 1 ton do :
` 3£ Cut (p[i], Đ[1 st 1)) then Result := not Result; end;
//Chương trình chính BEGIN
SetExcept ionMask { [Low (TFEUExcept ionMask) High (TFPUExceptionMask) J); Enter;
_ if Check then WriteLn('Inside the polygon") else WriteLn(' Outside the polygon');
END
3 Tim hai diém gan nhat
Cho một tập điểm Q (cĩ thé tring nhau) Tim cặp điểm trong Q cĩ khoảng cách nhỏ nhất
Nếu kiểm tra tắt cả các cặp điểm t ta sẽ cĩ một thuật tốn với độ phức tạp O(N’) Thuật tốn sau đây cĩ dé phirc tap O(MlogN) giải quyết vấn đề bằng cách chia
để trị Với một bài tốn kích thước N, ta dua vé thuật tốn giải hai bài tốn nhỏ
kích thước 2 >› và kết hợp kết quả trong thời gian O(N)
Q duge biểu diễn bởi hai mảng đã sắp xếp X (theo hồnh độ) và Ÿ (theo tung độ) Thuật tốn như sau:
Bước ï Dùng một đường thắng đứng đ, ta cĩ thể chia đơi € thành Ĩ\ và Q; Các điểm nằm đúng trên đ cĩ thể phân bĩ tuỳ ý sao cho Œ¡ và Q; cân bằng | Bước 2 Gọi đệ quy tìm khoảng cách ngắn nhất đ¡ trong Gì và a, trong 2 Dat
do = min(d},d2)
Bước 3 Kết qua trả về sẽ là dp, hoặc một giá trị nhỏ hơn dy néu tồn tại một điểm
trong Ớ¡ và một điểm trong Q2 cĩ khoảng cách nhỏ hon do Các điểm như
Trang 29_ vậy chỉ cĩ thể nằm trong khoảng cách đ¿ từ đường thẳng đ Tìm tập hợp
Oo các điểm thoả mãn đường thắng đĩ, cùng với Pq tương ứng của bo Bước 4 Với mỗi điểm P; trong Qo, ta xét khả năng P; la đầu mút phía trên của
_cặp điểm gần nhau nhất Như vậy, điểm cịn lại phải nằm trong hình
chữ nhật đọ x 2d; cĩ cạnh trên đi qua P; Hình chữ nhật này cĩ tối đa
bốn điểm trong Ợ¡ và bốn điểm trong @; Do đĩ nĩ cĩ tối đa tám điểm _
trong Qo Nhu vay, ta chi can kiém tra khoang cách của P, đến bảy điểm
theo sau nĩ trong Yo :
Bước 5 Trả về khoảng cách ngăn nhất tìm được
Tại bước 2, ta can Xi, %, Ni, Y2 tương ứng cho Or, Q; Các mảng này cĩ thể
_ được sinh ra trong thời gian O(N)
- Tại bước 3, Yo cũng được sinh Ta trong O(N) bing cách đọc tuần tự mảng Y va loai ra các điểm cách xa đ
Các bước 1, 2, 3, 4 đảm bảo chỉ phí xử ử lí OW) tại ï mỗi ¡ lần đệ quy, từ đĩ cho ta thuật tốn cĩ 4 phúc tạp O(NlogN)
dy dy ¬ [ Khơng thể đưa ` thêm một điểm
} nao vào bên
4 trong mà vẫn
đảm bảo khoảng ,
._ _,| cách tối thiểu đọ
Hình 8.10 Khoảng cách đái thiếu " — 8————},
Mink hog Do cac diém trong Or cĩ khoảng cách tối thiểu do, từ P, trở xuống chỉ
cĩ tơi đa bốn điểm thuộc về OW ¬
4 Một số j thủ tục cơ bản a) Kiểm SOát sai số '
Trang 30ca nhitng phép cộng và nhân số thực ¢ trên máy tính cũng phải chịu sai số ở chữ số cĩ nghĩa cuối cùng
Sai số trong các phép tính cĩ thể dẫn tới nhiều phiền tối, vì thế phải cĩ phương pháp đê kiêm sốt sai số này trong q trình trính tốn Kinh nghiệm chung là: e Nếu dữ liệu vào là các số nguyên, ta cố gắng sử dụng các phép tỉ tính tốn số
- nguyên đến chừng nào cịn cĩ thể được :
e Nếu bắt buộc phải tính tốn số thực, trong một : số trường hợp ta cần phải dự kiến sai số tính tốn Chăng hạn, chọn một hằng số e đủ nhỏ (chang han € = 107°), sau đĩ thay vì so sánh p = q; ta viết |p — q| <€
vi dụ, ta sẽ viét ham OnSegment(xA, yA,xB,yB,xC, yC) đề kiêm tra xem diém
= (x€; y€) cĩ nằm trên đoạn thăng AB với A= GA; yA), B= = G8; yB) hay ` khơng
Const epsilon = 1E-6; /
function onSeginent (xA, yA, xB, YB, x€, vC: Float): Boolean;
var TU sa : :
xl, yl, x2, y2: Float;
begin ‘
x1 := xC - XA; yl := yC - yA; “xl, yl) = vecta AC x2 := xC - xB; y2 := yC - yB; /(x2, y2) = vecto BC Result := l
(Abs(xi * y2 - x2 * yl) < epsilon) and
: (xl * x2 + yl * y2 < 0)
end;
Việc kiểm sốt sai số 5 khong phải lúc nào cũng cần thực hiện Cụ thể trong trường hợp trên, ta chỉ kiểm sốt sai số trong phép so sánh AC x BC = Oma khéng can kiém sốt sai số trong phép so sinh AC.BC < 0 Li do là bởi vì hàm OnSegmert bản thân nĩ đã cĩ sai số (nếu điểm € năm rất sát đoạn thắng AB nhưng khơng năm trên đoạn thang AB, hàm vẫn cĩ thể trả về giá trị True) và sai
số của phép so sánh 4C BỂ < 0 được tính luơn vào sai số của hàm
b) Các thủ tục, hàm thường dùng
Trang 31tuc 1 này giúp ban tránh được những sai sĩt đáng t tiếc và giúp bạn cài đặt nhanh các thuật tốn cho bài tốn hĩnh học
Type Real=Extended;
TPoint=Record
x,y:real;
end; /
Const_Eps: Real=le-3;
ZeroPnt: TPoint=(X:0; Y:0);
/* so sánh hai số thực */ :
Function RealEq(Coenst a, b: làng: _Beolean; Begin
RealEq:=Abs (a-b) <= Eps; End; ‘ , cu Ta
Function RealMax (Const a, b:Real) :Real; Begin
If RealMore (a, b) Then RealMax: =a Else RealMax: =b; End;
/* Kiém tra hai điểm trùng nhau */
Eunction EqPoint (Const A, 8: TPoint) :Boolean;
Begin — i
EqPdint: =RealEq (A X,- B x) And RealEq(A.y, B.y); End;
| 7* Khoảng cách hai diém */
Function Dist (Const A, Bị TPoint): ‘Real;
Begin
Dist:=Sqrt (Sqr (A x=B.x)+Sqr (A y-B.y));
-.| Bnd;
/* Téng vecta */
“Type TVecCart=TPoint;
Procedure AssVecCart (Const a, b:TVecCart;Var c:TVecCart); Begin c.X:=a.xtb.x; C.Vy:=a,y+b.y; End; /* Tich v6 huéng */
Function’ SkMulCart (Const a, b: TvecCart): : Real; ‘Begin
SkMulCart: =a +x*b, xta v*b Vị End; - Type TVecPol=Record yst, angle:Real End;
Trang 3234 -
:⁄* Gĩc với trục Ox, đo bằng rađian */ ST hài ¬ J Function GetAngle (Const x, y:Real):Real;
Var rs, c:Real;
Begin : + rs:=Sgrt (Sdr (x)+Sqr (y));
1£ RealEq(rs, 0) Then GetAngle:=0 Else
Begin
c:=x/rs; ; ˆ If RealEq(c, 0) ‘Then c:=Pi/2
Else c:=ArcTan(Sqrt (Abs(1-Sqr(c)))/c);
If RealLess(c, 0) Then c:=Pitc;
If RealLess(y, 0) Then c:=2*Pi-c;
GetAngle:=c; Si TC ˆ
End; End;
/* tog dé Dé-cac chuyén sang toa đĩ cuc*/
Procedure CartToPol {Const a:TVecCart;Var b:TVecPol);
Begin ,
b rs:=Sqrt (Sgr (a:x) +§qr (a V) ) ¡
b.angle:=GetAngle(a.x, a.V}; End;
| /* Toa dé cuc chuyén sang tog dé Đề-các*/
Procedure PolToCart (Const a: TVecPol; Var b: TVecCart) ;
Begin _ b.x:=a.rs*cos (a.ang1e) ; b.y:=a.rs*sin(a.angle); End; Type: TLine=Record _ ‘A,B, C:Real; End; vở h
/* Viết phương trình đường thẳng di ¢ qua hai diém */
Procedure Point2ToLine (Const v, w: ‘Tpoint; Var L: TLine) j
Trang 33
7 * Hai đường thẳng cĩ khác phương hay khơng */
Function CrossLine (Const L1,L2: Tháng): ‘Boolean; Var st: Real;
Begin
st:=L1.A*L2.B=L2.A*L1.B;
CrossLine:=Not Realkq(st, 0); nd; -
/* Giaa điểm hai đường thẳng */ /
Procedure Line2ToPoint (Const L1,L2: TLine; Var P: TPoint) ; Var st:Real; Begin st:=L1.A*L2,.B-L2.A*L1.B; P.X:=(L1.C*L2.B-L2.C*Lq.B)/st; P.Y:=(L1.A*L2.C-L2.A*L1.C)/st; End; , |
⁄* Tìm giao điểm hai đường thẳng /
Procedure FindPointCross (Const fL, £R, SL, sR: TPoint; Var rs: :TPoint) ; Var Li, L2:TLine;
Begin Su cu
Point2ToLine (£L, £R, L1); Point2ToLine (sL, sR, L2) ;
If CrossLine(L1,L2) Then Line2ToPoint (Ll, L2,rs) Else rs:=ZeroPnt;
| End; ¬
⁄* lnput: 2 đoạn thắng nằm trên cùng đường thẳng ` Nhiệm vụ: Kiểm tra vị trí tương đối
Output: 0: cĩ 1 điểm chung; 2: cĩ 1 đoạn chung; 1: khơng giao nhau -
v⁄
Function SegmLineCross (Const £L,£R,sL,sR: Tpoint): :Byta; Vạr Minf, Maxf,Mins,Maxs: ‘Real;
Begin
Mint: =RéalMin (Dist (£L, ZeroPnt) , Dist (ER, ZeroPnt));_ a Maxf; '=RealMax (Dist (£L, ZeroPnt), Dist (£R, ZeroPnt));
Mins:=RealMin (Dist (sL, ZeroPnt), Dist (sR, ‘ZeroPnt));
Maxs:=RealMax (Dist (sL, ZeroPnt) , Dist (sR, ZeroPnt) ).;
If RealEq(Minf,Maxs) or RealEq(Maxf,Mins)
Then SegmLineCross: =0 " re Else bị | , _— If RealMore (Mins, Maxf) Or RealNore (Mint, Maxs) |
Then SegmLineCross:=1 -Else SegmLineCross:=2;
End;
Trang 34
_36
7* Kiém tra đoạn thẳng cắt nhau : ụ
- Thuật tốn: tìm giao điểm, sau đĩ kiểm tra giao điểm nằm trên đoạn thing
Trả về một số nguyên đánh số các trường hợp vị trí tương đối đoạn thẳng-đoạn thẳng
Hai đoạn thẳng cắt nhau sẽ trả về 7
*/
Eunction SegmCross (Const f£L, £R, sb, sR :TPoint);
Var rs: TPoint; Li, L2:TLine; Begin Point2ToLine(fL, £R,L1); Point2ToLine (sL, sR,L2) ; TỂ CrossLine(L1, L2) Then Begin Line2ToPoint (L1,L2, rs) If EqPoint(rs,fL) Or EqPoint (rs, £R)
Or EqPoint (rs, sL) (Or EqPoint (xs, sR)
Then ‘SégmCross: =5 sử Else
If AtSegm(fL, £R, rs) And AtSegm (s1, sR,rs) Then SegmCross:=7
Else ,
If AtSegm(fL,fR,rs) Or AtSegm (SL, SR,rs) Then SegmCross:=6
Else SegmCross:=4; _Etnd
Else
If EqPoint(L1.A*L2, B,L2 .A*L1 B)
And Not (EqPoint (L1.C,L2.C)
Then SegmCross:=3 _
Else SegmCross:=SegmLineCross(fL, fR,sL,sR); End;
/* Đường thẳng vuơng gĩc */ -
Procedure PerLine (Const n:TLine; Const P:TPoint;Var L: -TLine); Begin
L.A:=n B; L.B:=n.A;
L.C:=L.A*P.X-L BYP, Y?
End;
/* Khoảng cách từ một điểm đến một đường thing *⁄
Function Dist PointToLine (Const P:TPoint;Const L: Thine): Real; Begin
DistPointToLine :=
Abs ((L A*P.x+L B*P, ytL ©)) *Sqrt (Sar (1 A)+Sqr(L B));-
End;
Trang 35
/* Kiém tra điêu kiện bắt dang thức tam giác */
Function IsTrian(Const a,b,c:Redl):Boolean; `
Begin
IsTrian:=RealMore(atb,c) And RealMore (a+c,b)
: And RealMore (b+c; a);
End;
/* Dién tich tam gide bằng cơng thức Hê-rơng *⁄
Function Sq(a,b,c: Réal) :Real;
| Var p: Real;
Begin
p:=(atbt+c)/2; Sq:=Sqrt (p* (p-a) * (p~b) *(p-e))z
End;
⁄* Diện tích tam giác khi biết toa độ ba đỉnh */
‘Function SquareTrian (Const pl,p2,p3:TPoint) ;
Begin cĩ ¬
SquareTrian := Abs(p1.x*(p2.y-p3 y) ~p1 v* (p2.x-p3.x) —
+(p2.x*p3.y-p3.x*p2.y))/2);
End; ¬
/* Chiều cao tam giác ứng với cạnh a *⁄
Function GetHeight (Const a,b,c: Real): Real;
Var p: Real;
Begin ,
pi= (a†b+c) /2z GetHeight:=2*Sqrt (p* (p-a).* (p-b) * (p-c) ) /a; End; c2
/* Tim độ đài trung tuyến ”
Function GetMed (Const a,b,c: Real): Real; Begin ý
GetMed:=Sqrt (2* (b*b+e* c)~a*a) /2; End;
/* D6 dai đường Dhan giác xuất " từ một đừnh tới cạnh đái điện cĩ độ dài bằng ‹ a*
Eunetion GetBis (Conat a,b, e: Real),: :Real; -
Var p: Real; ‘
Begin _ : TY
P:= (a+b+c) /2; GetBis :=2+Bart (b*c cápt (p~a) ) ⁄ (b+c);
| End;- : `
| /* Bán kính đường trịn nội tiếp */
Function GetRadins (Const a, b, C: Real): Real; Var.p: :Real¿ ~ rộ " :
Begin
p:=(atbt+c) /2; GetRadIns: =Sqrt ( tp~a) * (p-b) * (p- -e) /p);
End; -
%
Trang 36
/* Bán kinh đường trịn ngoại tiếp */
Eunction GetRadExt (Const a,b,c: Real) : Real; Var p:Real;
Begin
p:=(atbt+c) /2; ˆ
GetRadExt: marbte/ (4*Sazt (p* (p+ a) *{ p-b)*(p-c)));
End; |
/* Kiém tra 1 da gidc khéng tu cdt */
Function IsPoligonSimple -
' (Const | A:Array Of TPoint;Const N:Word): Boolean;
Var i,j: Integer;
pp: Boolean; -
Begin
PP: =True; 1:=1;
While (i<=N-1l) And pp Do: Begin ˆ ~
j:=itl;
While (j<=N) And pp De Begin ¬ oo ,
_ Case SegmCross (ALi], Alit1]1, A{31, A331) Mod N_
Of 0,2,6,7: ppt=False; End; , I1nc(3); End; Inc(i); End; IsPoligonSimple:=pp; End; —
‘c) Thu vien Math va céc hang số khơng xác định
Free Pascal cung cấp thư viện Math để hỗ trợ cho các phép tính tốn học chuyên dụng Ngồi một hệ thống phong phú các thủ tục và hàm, thư viện Math cung cấp ba hằng số đặc biệt Nan, Infinite va NegInfinite
38
Nan tương ứng với một số thực khơng xác định (Not a 'Numbe), trong thư
viện Math, hằng Nan được khai báo bằng 0.0/0.0 TC |
Infinite tuong img véi-hang s6 thyc +00, phép chia một số thực đương cho
Trang 37` N egInfinite tương ứng với hằng số thực — —œ, ; phép chia một số › thực âm
cho 0 sẽ cho kết quả bằng NegInfinite a '
Ví dụ đoạn chương trình sau: "
| program TestDiv0; _ uses math; " var ¬— | Xr Vị z: Float; | zero: Float = 0; begin oe s
SetExceptionMask ( [Low ( (TEPUExcept ionMask) »High (TFPUExceptionMask) ]);
x := O/zero; oe
Vÿ ;= 1/zero; z := ~2/zero;
Writeln(x); /hnra Nan -WriteLn (y); Mn va + Inf
WriteLn(z Zz); //In ra -Inf end -
Ba hằng số này rất tiện dụng trong việc lập trình các bài tốn hình học, chẳng
hạn khi tìm giao điểm của hai đường thăng, nếu hai đường thẳng đĩ trùng nhau, ta cĩ thể gán toa độ giao điểm la JON: an; Nan), cịn nếu hai đường thang song
song với nhau, ta cĩ thé gan ‘toa độ giao điểm là (Infinite; Infinite) Chương
_ trình chính chỉ việc gọi hàm để lấy toạ độ giao điểm, sau đĩ kiểm tra các toạ độ
cĩ khác Nan và khác Infi inite hay khơng để xử lí tiếp
Những chú ý sau rất quan trọng khi sử dụng các hằng Nan, Inifinite va
NegInfinite: :
Chứ ý:
os Việc chia cho-0 để lấy hằng Nan, Infin inite, Neginfi inite, Cũng như việc
` SƠ sánh trực tiếp với các hằng số này, chỉ thực hiện được trong lúc chạy
- (run-time) nếu ta đặt lại thiết lập: trong bộ đồng xử lí tốn học bằng lệnh:
‘SetExceptionMask ( [Low (TFPUExceptionMask) .High (TFPUExceptionMask) ]) ;- - Việc chia trực tiếp cho 0, gắn, so sánh các hằng Nan, Infinite, _ Neginfinite với một biến số thực chỉ được phép viết khi dịch: chương
trinh ở chế độ {$R-,@-}, tức là tất cả các chế độ kiểm tra tràn phạm vi và
tràn số học phải được tắt Tuy nhiên, › Việc, tắt bồn tồn chế độ kiểm tra
Trang 38tràn phạm vi và tràn số học cĩ thé rất nguy hiểm và khĩ gỡ tối, vì vậy ta nên làm theo cách khác như sau:
e Sử một biến zøro gắn bằng 0 và thực hiện phép chia cho zero o thay vi chia cho 0, kĩ thuật này nhằm đánh lừa trình biên dịch
e Khơng so sánh trực tiếp một biểu thức số thực với các hằng Nan, Infinite, NegInf inite mà sử dụng các hàm cung cấp sẵn trong
thư viện Math: -
_w Hàm ïsNan(x):Boolean: Kiếm tra số thực x 06 õ phải bằng Nan hay khơng
_ « Ham IsInifinite(x): Boolean: Kiểm tra số thực x cĩ phải bằng
_ Iƒimite hay NegInifimite hay khơng
w Hàm ïsZero(%,t): Boolean: Kiểm tra x = 0, cụ thê là |x| cĩ nhỏ
hơn e hay khơng, hàm này cĩ thể dùng để xử lí sai s6 € 1a sai số chấp nhận do người dùng tuỳ chọn
d) Thu vién Matrix
Trong các bài tốn ví du, chúng tơi chỉ sử đụng thư viện Math để hỗ trợ cho việc tính tốn được ngắn gọn Nếu muốn thực hiện các tính tốn hình học phức tập, -_ trên khơng gian nhiều chiều, bạn cĩ thể sử dung thém thu viện Matrix Thư viện _ nảy cung cấp các phép tốn thao tác trực tiếp trên các vecto và ma trận: tính tích
mạ trận, nghịch đảo ma trận, định thức của ma tran v.v
Hiện tại, các thuật tốn trong thư viện Matrix vẫn là những thuật tốn tuần tự
Tuy nhiên trong tương lai, sẽ cĩ những phiên bản với thuật tốn song song, sử
dụng kĩ thuật đa xử lí để tăng tốc quá trình tính tốn Một số dự án đang viết lại
thư viện Matrix, dùng sức mạnh của hàng nghìn GPU trong card dé hoa dé tinh _ tốn thay vì sử đụng CPU, các phép tốn ra trận được tăng tốc lên hàng trăm
lần và các chương trình sử dụng thư viện này theo đĩ cũng được tăng lên đáng
kế | Jy
Bal tập -
8.1 Trên mặt phẳng cho một tam giác và một đoạn thắng Tính độ đài của đoạn
Trang 398.2 8.3
8.4
8.5
8.6
Trên mặt phẳng cho hai tam giác Tính diện tích phần chung cua hai tam
Cho hai hình chữ nhật với các cạnh song song với hệ trục toạ độ Mỗi hình
chữ nhật xác định bởi toạ độ hai đỉnh đối Tìm diện tích phần mặt phẳng
được phủ bởi hại hình chữ nhật và điện tích phần chung của chúng
Trên mặt phẳng cho X điểm Tìm hai điểm xa nhau nhất trong N điểm đĩ Gợi ý: Hai điểm cần tìm là hai đỉnh của đa giác bao lơi
Trên mặt phẳng cho N điểm Hãy phân hoạch N điểm thành K tp Si, Spy Sk sao cho đường kính lớn nhất của K tập là nhỏ nhất, trong đĩ đường kính
của tập 5; là khoảng cách lớn nhất giữa các cặp đỉnh thuộc ŠS, _ _
Trên mặt phăng cho M điểm đơi một khác nhau Hãy tìm hai trong X điểm
sao cho đường thắng đi qua hai điểm đĩ chia mặt phẳng thành hai phân ma _ số điểm thuộc hai nửa mặt phẳng lệch nhau it nhất
8.7.Ồ 8 8,
Trén mat phẳng cho X điểm Hãy: tìm tập ít nhất các đường thẳng sao cho mỗi điểm trong N điểm đã cho thuộc ít nhất một đường thang
Trén mat phẳng cho N điểm Hãy noi N điểm thành một mạng liên thơng _ bằng các đoạn thắng nỗi các cặp điểm sao cho tong độ đài các đoạn thắng | duoc nối là nhỏ nhất -
8.9, Trên mặt phẳng chơ N hình chữ nhật CĨ Các cạnh s song song với hai trục toạ độ Hình thứ ¡ xác định bởi hai đỉnh đối (x„ yj) và (z„ f) Toạ độ các
| | điểm là nguyên; cĩ giá trị tuyệt đối khơng vượt quá 10Ÿ Khi tơ các hình
chữ nhật này bằng một màu xanh, ta nhận được một số phân mặt phẳng
a được tơ màu xanh Tính tổng độ dài các đường bao quanh các vùng màu
| xanh _8.10 Tâm nhìn
Trén mat phẳng cho N doan thing a <A< 1000), Toạ độ các đầu mút của
_ Các đoạn thắng là các số nguyên khơng âm khơng vượt quá 20000 Các đường ‘thang’ thu duoc bing cách kéo dai các đoạn thắng đã cho luơn cắt hai trục toạ
độ và hai giao điểm cùng gốc toạ độ tạo thành một t tam giác vuơng cân,
¬ Khơng c cĩ hai đoạn thẳng nào giao nhau
‘
Trang 40Ta noi mét doan thang la nhin thấy được từ gốc toa độ Ø, néu tim được
điểm X trên nĩ sao cho đoạn thăng OX khơng cắt bất cứ đoạn nào khác trong số các đoạn thẳng đã cho
Hãy viết chương trình đếm số đoạn thắng nhìn thy được từ gốc toạ độ Input: Vào từ tỆp VPOTN?.TNP:
° Dịng đầu tiên chứa số đoạn thắng Ne
e Mỗi một trong số M dịng tiếp theo chứa bốn số nguyên khơng âm 3, ị, 12 và 1}, phân cách nhau bởi dau cach, trong d6 (X41, Y¡) là toạ độ của đầu mút thứ nhất cịn đu, †2 là toa độ của đầu mút thứ hai của
đoạn thắng tương ứng TS
Output: Ghi ra trên một dịng của tệp VEOTNT, our số đoạn thắng nhìn thay
được từ gốc toạ độ _
Vi du:
VPOINT.INP VPOINT OUT
4 * _ " + “ ` 3 3 43 11 5 | : 14 1 10 5 10 14 20-4 5 6 - 10 1
8.11 Khơi phục đa giác
Bờm vẽ trên mặt phẳng một hình đa giác tổng quát (đường gấp khúc khép s kín khơng tự cắt) với các cạnh song song Với các trục toạ độ và các đỉnh cĩ _ toạ độ nguyên Sau đĩ, vì vơ ý Bờm đã xố mất tất cả các cạnh thẳng đứng (cạnh song song với trục tung) của đa giác Bạn hãy tìm cách từ những thơng tin cịn lại trên hình vẽ giúp Bờm tính diện tích của đa giác đã vẽ
ban đầu l
Input: Vào từ tệp văn bản EơLYGO me: —
eo Dong dau tiên chứa là số cạnh nằm ngang (cạnh song song \ với trục
42
hồnh) của đa: giác đã chỏ (Ns 1000) ;