Giải bài toán pascal bằng pp hình học

34 1.1K 17
Giải bài toán pascal bằng pp hình họ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

PHƯƠNG PHÁP GIẢI TOÁN HÌNH HỌC BẰNG NNLT PASCAL I. KHÁI NIỆM HÌNH HỌC VÀ CÁC ĐỐI TƯỢNG HÌNH HỌC CƠ BẢN 1. Khái niệm hình học Đa số các thuật toán đều tập trung vào văn bản và các con số, chúng được thiết kế và xử lý sẵn trong phần lớn các môi trường lập trình. Đối với các bài toán hình học thì tình huống khác hẳn, ngay cả các phép toán sơ cấp trên điểm và đoạn thẳng cũng có thể là một thách thức về tính toán. Các bài toán hình học thì dễ hình dung một cách trực quan nhưng chính điều đó lại có thể là một trở ngại. Nhiều bài toán có thể giải quyết ngay lập tức bằng cách nhìn vào một mảnh giấy nhưng lại đòi hỏi những chương trình không đơn giản. VÝ dô: Bµi to¸n kiÓm tra mét ®iÓm cã n»m trong ®a gi¸c hay kh«ng? 2. Đối tượng hình học cơ bản. Trong các bài toán tin học thuộc loại hình học có 3 đối tượng cơ bản là: Điểm, đoạn thẳng và đa giác. - Điểm: Được xác định là cặp (x,y) trong hệ toạ độ đề các. - Đoạn thẳng: Là cặp điểm được nối với nhau bằng một phần của đường thẳng. - Đa giác: Là dãy các điểm mà 2 điểm liên tiếp nối với nhau bởi đoạn thẳng và điểm đầu nối với điểm cuối tạo thành đường gấp khúc khép kín. 3. Dữ liệu lưu trữ các đối tượng hình học cơ bản Type point = record x,y: integer; end; Line = record p1,p2: point; end; Var Polygon: Array[0 Nmax] of Point; II. MỘT SỐ PHÉP TOÁN CƠ BẢN 1. Vị trí tương đối của điểm so với đường thẳng, tia và đoạn thẳng Bài toán 1: Cho điểm M(x 0 ,y 0 ), A(x A ,y A ), B(x B ,y B ). Yêu cầu: a) Kiểm tra M có thuộc đường thẳng đi qua 2 điểm A, B hay không? b) Kiểm tra M có thuộc đoạn thẳng AB hay không c) Kiểm tra M có thuộc tia AB hay không • Phương pháp: Đặt F(X,Y) = (y A -y B )X + (x B -x A )Y + (x A y B - x B y A ) - Điểm M thuộc đường thẳng AB khi F(x 0 ,y 0 ) = 0 - Điểm M thuộc đoạn thẳng AB khi: F(x 0 ,y 0 )=0 và Min(x A ,x B ) ≤ x 0 ≤ Max(x A ,x B ) và Min(y A ,y B ) ≤ y 0 ≤ Max(y A ,y B ) 1 - Điểm M thuộc tia AB khi F(x 0 ,y 0 ) = 0 và ABkAM = có nghĩa là M phải thoả mãn điều kiện: F(x 0 ,y 0 ) = 0 và (x 0 -x A )(x B -x A ) ≥ 0 và (y 0 -y A )(y B -y A ) ≥ 0 • Chương trình: var xa,ya,xb,yb,xo,yo:real; procedure nhap; begin repeat write('nhap toa do diem A:'); readln(xa,ya); write('nhap toa do diem B:'); readln(xb,yb); until (xa<>xb) or (ya<>yb); write('nhap toa do diem M:'); readln(xo,yo); end; {=============} Function F(xo,yo:real):real; begin F:= (ya-yb)*xo+(xb-xa)*yo +(xa*yb - xb*ya); end; {=============} Function Max(a,b:real):Real; begin if a>b then Max:=a else Max:=b; end; {=============} Function Min(a,b:real):Real; begin if a>b then Min:=b else Min:=a; end; {====Kiem tra M thuoc duong thang, doan thang, tia===} Begin nhap; if F(xo,yo)=0 then writeln('M thuoc duong thang AB') else writeln('M ko thuoc duong AB'); if (F(xo,yo)=0) and (min(xa,xb)<=xo) and (xo<=max(xa,xb)) and (min(ya,yb)<=yo) and (yo<=max(ya,yb)) then writeln('M thuoc doan thang AB') else writeln('M khong thuoc doan thang AB'); if (F(xo,yo)=0) and ((xo-xa)*(xb-xa)>=0) and ((yo-ya)*(yb-ya)>=0) then writeln('M thuoc tia AB') else writeln('M khong thuoc tia AB'); readln; End. 2. Giao của các đoạn thẳng, đường thẳng và tia Bài toán 2. Cho 2 đường thẳng có phương trình a 1 x+b 1 y+c 1 =0 và a 2 x+b 2 y+c 2 =0. Tìm giao điểm (nếu có) của 2 đường thẳng trên. •Phương pháp: B 1 . Tính D = a 1 b 2 - a 2 b 1 , Dx = c 2 b 1 - c 1 b 2 , Dy = a 2 c 1 - a 1 c 2 B 2 . Xét 3 khả năng: + Nếu D=Dx=Dy=0 thì kết luận 2 đường thẳng trùng nhau + Nếu D=0 và ((Dx≠0) hoặc (Dy≠0)) thì kết luận 2 đường thẳng song song + Nếu D≠0 thì kết luận 2 đường thẳng cắt nhau tại điểm có (Dx/D, Dy/D) • Chương trình: var a1,b1,c1,a2,b2,c2,D,Dx,Dy:real; {============} procedure nhap; begin write('nhap he so cua dt 1 a1,b1,c1:'); readln(a1,b1,c1); write('nhap he so cua dt 2 a2,b2,c2:'); readln(a2,b2,c2); end; {=============} Begin 2 nhap; D:=a1*b2-a2*b1; Dx:=c2*b1-c1*b2; Dy:=a2*c1-a1*c2; if (D=0)and(Dx=0)and(Dy=0) then write('2 duong thang trung nhau') else if (D=0)and((Dx<>0)or(Dy<>0)) then write('2 duong thang song song') else write('2 d/thang cat nhau tai M(',Dx/D:5:2,',',Dy/D:5:2,')'); readln; End. Bài toán 3. Cho 2 đoạn thẳng AB và CD với A(x 1 ,y 1 ), B(x 2 ,y 2 ), C(x 3 ,y 3 ), D(x 4 ,y 4 ). Tìm giao điểm (nếu có) của 2 đoạn thẳng • Phương pháp: B 1 . Tìm giao điểm M của 2 đường thẳng AB và CD B 2 . Kiểm tra M có thuộc đồng thời cả 2 đoạn AB và CD hay không. Nếu có đó là giao điểm cần tìm, ngược lại kết luận không có. • Chương trình: var xa,ya,xb,yb,xc,yc,xd,yd:real; a1,b1,c1,a2,b2,c2,D,Dx,Dy:real; {============} procedure nhap; begin repeat write('nhap toa do diem A:'); readln(xa,ya); write('nhap toa do diem B:'); readln(xb,yb); write('nhap toa do diem C:'); readln(xc,yc); write('nhap toa do diem D:'); readln(xd,yd); until ((xa<>xb) or (ya<>yb)) and ((xa<>xb) or (ya<>yb)); end; {=============} Function Max(a,b:real):Real; begin if a>b then Max:=a else Max:=b; end; {=============} Function Min(a,b:real):Real; begin if a>b then Min:=b else Min:=a; end; {===Kiem tra M thuoc doan ==} Function Ktra(xo,yo,xa,ya,xb,yb:real):boolean; begin if (min(xa,xb)<=xo) and (xo<=max(xa,xb)) and (min(ya,yb)<=yo) and (yo<=max(ya,yb)) then Ktra:=true else Ktra:=false; end; {===Tim giao diem neu co ===} procedure Xac_dinh; begin a1:=yb-ya; b1:=xa-xb; c1:=ya*xb-xa*yb; a2:=yd-yc; b2:=xc-xd; c2:=yc*xd-xc*yd; D:=a1*b2-a2*b1; Dx:=c2*b1-c1*b2; Dy:=a2*c1-a1*c2; if(D<>0)and(ktra(Dx/D,Dy/D,xa,ya,xb,yb))and ktra(Dx/D,Dy/D,xc,yc,xd,yd)) then writeln('2 d/thang cat nhau tai M(',Dx/D:5:2,',',Dy/D:5:2,')') else write('Hai doan thang khong cat nhau'); end; {==============} Begin nhap; Xac_dinh; readln; End. Bài toán 4. Cho tia AM chứa điểm B (khác A) và đoạn thẳng CD với A(x 1 ,y 1 ), B(x 2 ,y 2 ), C(x 3 ,y 3 ), D(x 4 ,y 4 ). Tìm giao điểm (nếu có) của tia AM với đoạn thẳng CD. 3 • Phương pháp: B 1 . Tìm giao điểm N của 2 đường thẳng AB và CD B 2 . Kiểm tra N có thuộc tia AM và đoạn thẳng CD hay không. Nếu có đó là giao điểm cần tìm, ngược lại kết luận không có. • Chương trình: var xa,ya,xb,yb,xc,yc,xd,yd:real; a1,b1,c1,a2,b2,c2,D,Dx,Dy:real; {============} procedure nhap; begin repeat write('nhap toa do diem A:'); readln(xa,ya); write('nhap toa do diem B:'); readln(xb,yb); write('nhap toa do diem C:'); readln(xc,yc); write('nhap toa do diem D:'); readln(xd,yd); until ((xa<>xb) or (ya<>yb)) and ((xa<>xb) or (ya<>yb)); end; {=============} Function Max(a,b:real):Real; begin if a>b then Max:=a else Max:=b; end; {=============} Function Min(a,b:real):Real; begin if a>b then Min:=b else Min:=a; end; {===Kiem tra M thuoc doan ==} Function Ktra(xo,yo,xa,ya,xb,yb:real):boolean; begin if (min(xa,xb)<=xo) and (xo<=max(xa,xb)) and (min(ya,yb)<=yo) and (yo<=max(ya,yb)) then Ktra:=true else Ktra:=false; end; {===Tim giao diem===} procedure Xac_dinh; begin a1:=yb-ya; b1:=xa-xb; c1:=ya*xb-xa*yb; a2:=yd-yc; b2:=xc-xd; c2:=yc*xd-xc*yd; D:=a1*b2-a2*b1; Dx:=c2*b1-c1*b2; Dy:=a2*c1-a1*c2; if (D<>0) and (ktra(Dx/D,Dy/D,xc,yc,xd,yd)) and ((Dx/D-xa)*(xb-xa)>=0) and ((Dy/D-ya)*(yb-ya)>=0) then writeln('Tia AM cat doan thang CD tai M(',Dx/D:5:2,',',Dy/D:5:2,')') else write('Tia AM khong cat doan thang CD'); end; {==============} Begin nhap; Xac_dinh; readln; End. 3. Vị trí của điểm so với đa giác Bài toán 5. Cho đa giác gồm N đỉnh d 1 , d 2 , ,d N và điểm M. Xác định vị trí tương đối của M với miền trong đa giác. Phương pháp: B 1 . Kiểm tra M có thuộc cạnh nào của đa giác hay không, nếu có thì kết luận M thuộc miền trong đa giác và kết thúc B 2 . Kẻ MN song song với trục hoành (điểm N có hoành độ lớn hơn max hoành độ của đa giác) 4 B 3 . Xác định d là số giao điểm của MN với các cạnh của đa giác. Những trường hợp sau được coi như là tăng thêm 1 giao điểm: + Đỉnh d[i] không thuộc đoạn thẳng MN, đỉnh d[i+1] nằm trên đoạn thẳng MN, 2 đỉnh d[i] và d[i+2] khác phía so với đường thẳng MN. + Đỉnh d[i-1], d[i+2] ngoài đoạn thẳng MN, hai đỉnh d[i] và d[i+1] thuộc đoạn MN, d[i-1] và d[i+1] khác phía so với đường thẳng MN + Đỉnh d[i] và d[i+1] không thuộc MN và cạnh (d[i],d[i+1]) cắt đoạn thẳng MN III. MỘT SỐ DẠNG BÀI TOÁN HÌNH HỌC THƯỜNG GẶP Dạng 1. Mối quan hệ giữa điểm, đoạn thẳng, đa giác. Phương pháp: Đây là một trong số dạng bài toán hình học đơn giản nhất. Việc giải bài toán dạng này chủ yếu sử dụng các kiến thức hình học cơ bản (đã trình bày đầy đủ trong phần trên) VD 1 . Ba điểm thẳng hàng Cho N điểm, hãy kiểm tra xem có bao nhiêu bộ 3 điểm thẳng hàng. Input: Cho trong tệp văn bản DL.Inp - Dòng thứ 1 ghi số N - N dòng tiếp theo, mỗi dòng ghi toạ độ của một điểm. Output: Ghi vào tệp KQ.OuT chứa một số duy nhất là số bộ 3 điểm thẳng hàng. (Giới hạn: 1<=N<=2000, toạ độ các điểm có giá trị tuyệt đối không quá 10000) • Chương trình: const maxn=2000; type td=record x,y:integer; end; var a: array[1 maxn] of td; free:array[1 maxn] of boolean; n,i:integer; c:longint; f:text; {=======================================} Procedure DocDL; begin assign(f,'DL.INP'); reset(f); readln(f,n); for i:=1 to n do readln(f,a[i].x,a[i].y); close(f); end; {======================================} Procedure Dem; var j,k,x1,y1,tmp:integer; begin c:=0; for i:=1 to n-1 do begin fillchar(free,sizeof(free),true); for j:=i+1 to n-1 do if free[j] then begin DL. NP KQ.OUT 6 0 0 0 1 0 2 1 1 1 2 2 2 3 5 tmp:=1; x1:=a[j].x-a[i].x; y1:=a[j].y-a[i].y; for k:=j+1 to n do if free[k] then if x1*(a[k].y-a[i].y)=y1*(a[k].x-a[i].x) then begin inc(tmp); free[k]:=false; end; inc(c,tmp*(tmp-1) div 2); end; end; end; {========================================} procedure Xuat; begin assign(f,'KQ.OUT'); rewrite(f); writeln(f,c); close(f); end; {====================================} Begin DocDL; Dem; Xuat; End. VD 2 . Đường thẳng cắt nhau Cho n đường thẳng A i B i (1≤i≤n) phân biệt với A i , B i là các điểm cho trước. Hãy thông báo ra màn hình các cặp đường thẳng đôi một cắt nhau. Dữ liệu: Cho trong file DL.INP gồm N dòng (N không biết trước). Dòng thứ i ghi 4 số thực x Ai y Ai x Bi y Bi . Các số trên cùng một dòng ghi cách nhau ít nhất một dấu cách. • Ý tưởng: - Mỗi đường thẳng được đặc trưng bởi 3 thông số a,b,c được xác định: a:=(y1-y2); b:=(x2-x1) ; c:=x1*y2-x2*y1; - Hai đường thẳng cắt nhau khi: D:=a1*b2-a2*b1 ? 0; • Chương trình: type dthang=record x1,y1,x2,y2:integer; end; heso=record a,b,c:integer; end; var pt:array[1 100] of heso; f:text; n:integer; {============} procedure doc_DL; var i,x1,y1,x2,y2:integer; begin i:=0; assign(f,'dt.inp');reset(f); while not eof(f) do begin i:=i+1; readln(f,x1,y1,x2,y2); pt[i].a:=(y1-y2); pt[i].b:=(x2-x1) ; pt[i].c:=x1*y2-x2*y1; end; n:=i; close(f); end; {===Kiem tra 2 duong thang cat nhau ==} Function Ktra(pt1,pt2:heso):boolean; var D:integer; begin D:=pt1.a*pt2.b-pt2.a*pt1.b; if D<>0 then ktra:=true else Ktra:=false; end; DL.INP KÕt qu¶ 0 0 1 1 0 1 1 2 -1 -1 8 9 §/th¼ng 1 c¾t ®/th¼ng 3 §/th¼ng 2 c¾t ®/th¼ng 3 6 {===Tim giao diem===} procedure Xac_dinh; var i,j:integer; kt:boolean; begin kt:=false; For i:=1 to n-1 do For j:=i+1 to n do if ktra(pt[i],pt[j]) then begin writeln('Duong thang',i,'cat duong thang',j); kt:=true; end; if not kt then writeln('khong co cap duong thang cat nhau') end; {==============} Begin doc_DL; Xac_dinh; readln; End. VD 3 . Điểm thuộc đa giác. Cho đa giác không tự cắt A 1 A 2 A N với các đỉnh A i (x i ,y i ) nguyên. Với điểm A(x A ,y A ) cho trước, hãy xác định xem A có nằm trong đa giác đã cho hay không (Trong trường hợp trên cạnh đa giác xem như nằm trong đa giác) Dữ liệu: Cho trong tệp Dagiac.inp + Dòng đầu là số N + N dòng tiếp theo mỗi dòng ghi x i ,y i là toạ độ A i + Dòng n+2 ghi 2 số x A và y A Dữ liệu là các số nguyên. Kết quả: Đưa ra màn hình thông báo điểm A có nằm trong đa giác hay không • Ý tưởng: - Lưu toạ độ các đỉnh đa giác vào mảng A - Kiểm tra xem điểm A có trùng với đỉnh đa giác - Kiểm tra xem điểm A có nằm trên cạnh đa giác - Tìm giao điểm nếu có của tia Ax (Ax//Ox và Ax hướng theo phần dương trục hoành) với các cạnh của đa giác. Trường hợp tia Ax chứa đoạn thẳng cạnh đa giác ta xem như tia Ax có 1 điểm chung với cạnh này. Cụ thể: + Giả sử điểm A(x 0 ,y 0 ), chọn điểm B(x b ,y b ) với x b =x 0 +1,y b =y 0 + Kiểm tra tia AB có cắt đoạn thẳng CD bằng cách: B 1 . Tìm giao điểm N của 2 đường thẳng AB và CD • Tính a1:=yb-ya; b1:=xa-xb; c1:=ya*xb-xa*yb; a2:=yd-yc; b2:=xc-xd; c2:=yc*xd-xc*yd; D:=a1*b2-a2*b1; Dx:=c2*b1-c1*b2; Dy:=a2*c1-a1*c2; • Xác định: Nếu D≠0 thì toạ độ giao điểm là N(Dx/D,Dy/D) B 2 . Kiểm tra N có thuộc tia AM và đoạn thẳng CD hay không. Dagiac.inp KÕt qu¶ 5 0 0 2 0 0 3 -2 2 -3 -2 10 10 §iÓm A(10,10) kh«ng n»m trong ®a gi¸c 7 - Điểm N thuộc đoạn thẳng CD khi: Min(x C ,x D )≤x N ≤ Max(x C ,x D ) và Min(y C ,y D )≤ y N ≤ Max(y C ,y D ) - Điểm N thuộc tia AB khi ABkAN = có nghĩa là N phải thoả mãn điều kiện: (x N -x A )(x B -x A )≥0 và (y N -y A )(y B -y A )≥0 + Kiểm tra tia AB chưa cạnh CD hay không bằng cách: (yc=yd)and(yc=yo) - Đếm số giao điểm, nếu số giao điểm lẻ thì A thuộc đa giác • Chương trình: const maxn=100; Type xy=record x,y:real; end; var n:byte; A:array[1 maxn+2] of xy; a1,a2,x1,x2,y1,y2,b1,b2, c1,c2,D,Dx,Dy:Real; k,dem,dem1,i:integer; {===================================} procedure Doc_DL; var f:text; begin assign(f,'DL.INP'); reset(f); readln(f,n); fillchar(A,Sizeof(A),0); for i:=1 to n do readln(f,A[i].x,A[i].y); readln(f,A[N+2].x,A[n+2].y); A[n+1]:=A[1]; close(f); end; {======================================} function kiemtradinh:boolean; begin kiemtradinh:=true; for i:=1 to n do if (A[i].x=A[n+2].x) and (A[i].y=A[n+2].y) then exit; kiemtradinh:=false; end; {========================================} function kiemtracanh:boolean; begin kiemtracanh:=true; for i:=1 to n do if A[n+2].x*(A[i].y-A[i+1].y)+A[n+2].y*(A[i+1].x-A[i].x) + A[i].x*A[i+1].y-A[i].y*A[i+1].x=0 then exit; kiemtracanh:=false; end; {=============================================} {=== Kiem tra Ax co chua canh da giac hay cat canh da giac===} Function kiemtra_giaodiem(xo,yo,xc,yc,xd,yd:real):boolean; var xa,ya,xb,yb:real; {===Kiem tra diem thuoc doan thuoc doan ==} Function Ktra(xo,yo,xa,ya,xb,yb:real):boolean; var max1,min1,max2,min2:real; begin if xa>xb then begin Max1:=xa;min1:=xb end else begin Max1:=xb;min1:=xa; end; if ya>yb then begin Max2:=ya;min2:=yb end else begin Max2:=yb;min2:=ya; end; if (min1<=xo) and (xo<=max1) and (min2<=yo) and (yo<=max2) then Ktra:=true else Ktra:=false; end; {===Tim giao diem===} begin xa:=xo;ya:=yo;xb:=xo+1;yb:=yo; a1:=yb-ya; b1:=xa-xb; c1:=ya*xb-xa*yb; a2:=yd-yc; b2:=xc-xd; c2:=yc*xd-xc*yd; D:=a1*b2-a2*b1; Dx:=c2*b1-c1*b2; Dy:=a2*c1-a1*c2; 8 if ((D<>0) and (ktra(Dx/D,Dy/D,xc,yc,xd,yd)) and ((Dx/D-xa)*(xb-xa)>=0) and ((Dy/D-ya)*(yb-ya)>=0)) or ((yc=yd)and(yc=yo)) then kiemtra_giaodiem:=true else kiemtra_giaodiem:=false; end; {====================================} function kiemtra:boolean; begin kiemtra:=true; if kiemtradinh then exit; if kiemtracanh then exit; dem:=0; dem1:=0; for i:=1 to n do if kiemtra_giaodiem(A[N+2].x,A[n+2].y,A[i].x,A[i].y,A[i+1].x,A[i+1].y) then Dem:=dem+1; if dem mod 2=0 then kiemtra:=false; end; {==================================================} BEGIN Doc_DL; if kiemtra then write('Diem A(',a[n+2].x:0:2,',',A[n+2].y:0:2,') nam trong da giac') else write('Diem A(',a[n+2].x:0:2,',',A[n+2].y:0:2,') khong nam trong da giac'); readln; end. VD 4 . Đếm số điểm có toạ độ nguyên thuộc đa giác (Bài đã được đăng trên tạp chí Tin học & Nhà trường số 04/2009) Cho đa giác gồm n đỉnh (x 1 ,y 1 ), (x 2 ,y 2 ), , (x n ,y n ), biết (2<n<10 4 ), x i và y i (i=1, ,n) là các số nguyên trong đoạn [-10 6 ,10 6 ]. Các đỉnh được liệt kê theo thứ tự cùng chiều kim đồng hồ. Viết chương trình tìm số điểm có toạ độ nguyên nằm trong hay trên biên đa giác. Dữ liệu: Cho trong tệp tin DL.INP. - Dòng đầu chứa số nguyên duy nhất cho biết số đỉnh. - Tiếp theo là các dòng, trên mỗi dòng có 2 số nguyên cách nhau một khoảng trắng lần lượt là hoành độ, tung độ các đỉnh đa giác. Kết quả: Xuất ra màn hình số điểm có toạ độ nguyên nằm trong hay trên biên đa giác • Ý tưởng: - Tính a,b theo công thức: ))(())(( 11 2 11 nn n i iiii yyxxyyxxa +−++−= ∑ = −− ),(),( 11 2 11 nn n i iiii yyxxUCLNyyxxUCLNb −−+−−= ∑ = −− - Xác định số điểm có toạ độ nguyên: Sđ=round(abs(a/2)+b/2+1) •Chương trình: Var N:longint; f:text; x1,y1,xt,yt,x,y,i,b,sd,a:longint; {================================} Function UCLN(a,b:longint):longint; var tg:longint; DL.INP KQ.OUT 4 0 0 3 3 4 0 2 1 8 9 begin while b>0 do begin tg:=b; b:=a mod b; a:=tg; end; UCLN:=a; end; {==========================================} BEGIN b:=0; a:=0; assign(f,'dagiac.inp'); reset(f); readln(f,n); readln(f,x,y); x1:=x; y1:=y; for i:=2 to n do begin xt:=x; yt:=y; readln(f,x,y); a:=a+(x-xt)*(y+yt);b:=b+UCLN(abs(x-xt),abs(y-yt)); end; a:=a+(x1-x)*(y1+y); b:=b+UCLN(abs(x1-x),abs(y1-y)); sd:=round(abs(a/2)+b/2+1); writeln(sd); close(f); readln; END. Dạng 2. Tính diện tích đa giác Phương pháp: Giả sử cho đa giác có n đỉnh và toạ độ các đỉnh lưu vào mảng a. Để tính diện tích đa giác ta làm như sau: Bước 1. Gắn thêm đỉnh phụ: a[n+1].x:=a[1].x; a[n+1].y:=a[1].y; Bước 2. Diện tích đa giác tính theo công thức: 2/)].[].1[)(].[].1[( 1 yiayiaxiaxiaS n i ++−+= ∑ = Lưu ý: Có thể áp dụng công thức khác để tính diện tích trong các trường hợp đặc biệt. - Nếu đa giác là tam giác (n=3) thì diện tích tính theo công thức: S = 4/))()()(( acbbcacbacba −+−+−+++ - Nếu đa giác là hình chữ nhật (n=4) có các cạnh là a,b thì diện tích là: S=ab - Nếu đa giác là hình vuông (n=4) có cạnh là a thì diện tích là: S=a 2 - Nếu đa giác là hình tròn có bán kính R thì diện tích là 2 RΠ VD 1 . Xác định diện tích đa giác Cho N đa giác lồi A 1 A 2 A 3 A N-1 A N với các đỉnh A i (x i ,y i ) có toạ độ nguyên. Hãy tính diện tích đa giác trên. Dữ liệu: Cho trong file DL.INP gồm 2 dòng - Dòng 1: Chứa số nguyên dương N - Dòng 2: Chứa 2xN số nguyên dương x 1 y 1 x 2 y 2 x N y N là toạ độ các đỉnh của đa giác. Mỗi số ghi cách nhau một dấu cách. Kết quả: Xuất ra màn hình diện tích đa giác. •Ý tưởng: - Lưu toạ độ các đỉnh đa giác vào mảng toado DL.INP KQ 5 - 8 -8 0 0 1 0 -2 4 -5 0 44.00 10 [...]... write(f,dem); close(f); End Bài 5 Chu vi Cho N (0kcmax then kcmax:=kc(next(a),b); end; assign(f,'KQ.out'); rewrite(f); writeln(f,sqrt(kcmax):0:4); close(f); end; {===========================================} Begin Doc_DL; xuly; End Bài 4 Đoạn thẳng nhìn thấy Trên mặt phẳng toạ độ cho N đoạn thẳng (1N100).Toạ độ các điểm đầu, cuối của N đoạn thẳng này là các số nguyên không âm nhỏ hơn 20000 Đờng thẳng đi qua mỗi đoạn thẳng này tạo... trờn mt dũng cỏch nhau ớt nht mt du cỏch Kt qu: a ra mn hỡnh din tớch phn mt phng b ph bi hỡnh ch nht trờn í tng: - Lp mng X[1 2n], Y[1 2n] ln lt cha honh , tung cỏc hỡnh ch nht - Lu toạ độ ban đâu các hình chữ nhật vào mảng a - Sp xp mng X,Y tng dn - Ln lt kim tra cỏc hỡnh ch nht cú to nh trờn bờn phi (x i+1,yi+1) v to nh di bờn phi l (xi,yi) vi 1in-1 Nu hỡnh ch nht ny thuc mt trong cỏc hỡnh ch nht . PHƯƠNG PHÁP GIẢI TOÁN HÌNH HỌC BẰNG NNLT PASCAL I. KHÁI NIỆM HÌNH HỌC VÀ CÁC ĐỐI TƯỢNG HÌNH HỌC CƠ BẢN 1. Khái niệm hình học Đa số các thuật toán đều tập trung vào văn bản. Đối với các bài toán hình học thì tình huống khác hẳn, ngay cả các phép toán sơ cấp trên điểm và đoạn thẳng cũng có thể là một thách thức về tính toán. Các bài toán hình học thì dễ hình dung. MỘT SỐ DẠNG BÀI TOÁN HÌNH HỌC THƯỜNG GẶP Dạng 1. Mối quan hệ giữa điểm, đoạn thẳng, đa giác. Phương pháp: Đây là một trong số dạng bài toán hình học đơn giản nhất. Việc giải bài toán dạng này

Ngày đăng: 16/02/2015, 18:00

Từ khóa liên quan

Mục lục

  • KẾT LUẬN VÀ KIẾN NGHỊ

    • KẾT LUẬN

    • KIẾN NGHỊ

Tài liệu cùng người dùng

Tài liệu liên quan