1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Tài Liệu Giáo Khoa Chuyên Tin Quyển 3 - Tập 1 pptx

45 2K 14
Tài liệu được quét OCR, nội dung có thể không chính xác

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 45
Dung lượng 3,58 MB

Nội dung

Trang 1

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 3

Chuyé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 5

c1 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 6

e - 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 8

c) 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 9

Tổ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 10

Tí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 11

Về 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 12

e 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 13

Day đỉ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 14

a 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 17

3 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 18

Nhu 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 19

Thu 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 21

P.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 23

Ya

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 25

c) 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 26

e 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 30

ca 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 31

tuc 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 32

34 -

:⁄* 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 38

trà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 39

8.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 40

Ta 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) ;

Ngày đăng: 21/06/2014, 01:20

TỪ KHÓA LIÊN QUAN