intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Đồ họa máy tính - Chương 5: Thư viện đồ họa 2D, 3D

Chia sẻ: Nguyễn Nhi | Ngày: | Loại File: PDF | Số trang:19

186
lượt xem
22
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Thư viện đồ họa 2D, 3D Trong chương này chúng ta sẽ khảo sát thư viện đồ họa lấy từ cuốn “GRAPHICSME DANS LE PLAN ET DANS L’ESPACE AVEC TURBO PASCAL”, R.DONY, 1990. 1. Nguyên tắc thiết kế của thư viện 1. Chúng ta sẽ xây dựng những công cụ chuyển đổi từ hệ tọa độ Toán học (hệ Decac thuận, tọa độ là số thực không giới hạn) sang hệ tọa độ màn hình (hệ Decac ngược, tọa độ là số nguyên). Bộ công cụ đó gồm các thủ tục sau: Thủ tục Procedure CAT( ) Chức năng ...

Chủ đề:
Lưu

Nội dung Text: Đồ họa máy tính - Chương 5: Thư viện đồ họa 2D, 3D

  1. Chương V. Thư viện đồ họa 2D, 3D Trong chương này chúng ta sẽ khảo sát thư viện đồ họa lấy từ cuốn “GRAPHICSME DANS LE PLAN ET DANS L’ESPACE AVEC TURBO PASCAL”, R.DONY, 1990. 1. Nguyên tắc thiết kế của thư viện 1. Chúng ta sẽ xây dựng những công cụ chuyển đổi từ hệ tọa độ Toán học (hệ Decac thuận, tọa độ là số thực không giới hạn) sang hệ tọa độ màn hình (hệ Decac ngược, tọa độ là số nguyên). Bộ công cụ đó gồm các thủ tục sau: Thủ tục Chức năng Procedure CAT( ) - đảo tung độ y, - chiếu “cửa sổ” lên màn hình, - cắt những phần nằm ngoài phạm vi cửa sổ Procedure CUASO( ) thiết lập nên “cửa sổ” Procedure TAMNHIN( ) thiết lập nên “tầm nhìn” 2. Sau khi đã có bộ công cụ chuyển tọa độ trên, các lệnh vẽ về sau đều coi như đang vẽ trên hệ tọa độ Toán học quen thuộc. Việc biến đổi về hệ tọa độ màn hình và hiển thị được thực hiện tự động bởi các công cụ đã có. 3. Đoạn thẳng được chọn làm nguyên thể đồ họa. Mọi đối tượng hình học khác đều được xây dựng từ đoạn thẳng, chẳng hạn một điểm được vẽ như một đoạn thẳng với 2 đầu mút trùng nhau, các đường cong được vẽ bằng một loạt đoạn thẳng ngắn liên tiếp nhau, đường tròn được xấp xỉ hóa bởi một đa giác đều nhiều cạnh ... 2. Khái niệm cửa sổ, tầm nhìn Về lý thuyết, không gian 2D thực tế là vô hạn nhưng con người không thể bao quát hết mà thường chỉ quan tâm tới một vùng nào đó. Cửa sổ được định nghĩa là hình chữ nhật chứa những đối tượng đang được khảo sát. Chẳng hạn nhìn lên một bức tranh tường, ta chú ý vào một họa tiết nào đó, khi đó cửa sổ là hình chữ nhật nhỏ nhất có thể chứa nó. Khi chuyển sự chú ý sang những phần khác, cửa sổ sẽ được di chuyển theo. Thủ tục tiết lập cửa sổ như sau: CuaSo (F1,F2,F3,F4: Real) Trong đó F1, F2, F3, F4 là tọa độ các đỉnh cửa sổ (hình vẽ) và phải thỏa mãn: F1 < F2, F3 < F4 PROCEDURE Cuaso (F1,F2,F3,F4 : Real); BEGIN XgFen := F1; {Hoanh do trai} XdFen := F2; {Hoanh do phai} YbFen := F3; {Tung do duoi} YhFen := F4 {Tung do tren} END; Ví dụ ta gọi thủ tục sau để thiết lập cửa sổ vuông: CuaSo (13.5, 22, 18.5, 27); http://www.ebook.edu.vn 11
  2. YhFen F4 Cửa sổ YbFen F3 XgFen XdFen F1 F2 Hình ảnh mà ta đang khảo sát trên cửa sổ phải được thể hiện lên màn hình máy tính. Không phải lúc nào ta cũng dùng toàn bộ màn hình mà thường chia thành nhiều vùng, mỗi vùng cho một mục đích, để hiển thị một cửa sổ khác nhau. Ta gọi vùng màn hình đó là tầm nhìn của cửa sổ tương ứng. YhClot C4 Tầm nhìn YbClot C3 XgClot XdClot C1 C2 Thủ tục thiết lập tầm nhìn như sau: TamNhin (C1, C2, C3, C4: Integer) trong đó 0≤ C1 < C2 ≤ GetMaxX 0≤ C3 < C4 ≤ GetMaxY PROCEDURE TamNhin (C1,C2,C3,C4 : Integer); BEGIN {Có đổi chiều trục Y } XgClot := C1; {Hoành độ trái} XdClot := C2; {Hoành độ phải} YbClot := C3; {Tung độ dưới} http://www.ebook.edu.vn 12
  3. YhClot := C4; {Tung độ trên} Xtl := (XdClot - XgClot) / (XdFen - XgFen); {tỷ lệ chiều ngang} Ytl := (YhClot - YbClot) / (YhFen - YbFen); {tỷ lệ chiều dọc} SetviewPort (XgClot, MaxY-YhClot, XdClot, MaxY-YbClot, ClipOn) {không vẽ ra ngoài} END; Ví dụ: để thiết lập chế độ làm việc toàn màn hình ta gọi thủ tục PROCEDURE TamNhinDay; {tầm nhìn đầy} BEGIN TamNhin (0,MaxX,0,MaxY) {Tầm nhìn là toàn bộ màn hình} END; 3. Đoạn thẳng, điểm Đoạn thẳng là nguyên thể đồ họa nhỏ nhất. Ta vẽ đoạn thẳng bằng cách trước hết đặt con trỏ đồ họa vào điểm đầu mút thứ nhất, sau đó vẽ đoạn nối tới đầu mút thứ hai. Ta dùng cặp biến (XP1, YP1) để thao dõi và định vị con trỏ đồ họa. PROCEDURE VeDen (X,Y : Real);{ Vẽ đoạn nối (XP1,YP1) đến (X,Y) và clipping nó} BEGIN XP2 := X; YP2 := Y; Cat (XP1,YP1,XP2,YP2); {clipping} XP1 := XP2; {chuyển con trỏ tới đầu mút thứ hai vừa xác định } YP1 := YP2 END; PROCEDURE Diem (X,Y : Real); BEGIN XP1 := X; YP1 := Y; VeDen (X,Y) END; 4. Chiếu cửa sổ lên tầm nhìn Sau khi đã xác định được cửa sổ (vùng cần khảo sát) và tầm nhìn (vùng dành cho việc hiển thị), công việc tiếp theo là chiếu toàn bộ nội dung cửa sổ lên màn hình. Để làm việc này ta cần có công thức toán học của phép chiếu cho phép xác định tọa độ ảnh (Xe, Ye) của điểm thực (Xr, Yr) qua phép chiếu. Đầu tiên ta tính tỷ lệ giữa cửa sổ và tầm nhìn: Xtl=(C2-C1)/(F2-F1), Ytl = (C4-C3) /(F4-F3) Khi đó ta có: Xe = (Xr-F1). Xtl; Ye = (F4-Yr). Ytl Ví dụ: Xét cửa sổ (-3,3,-2,3), tầm nhìn (100,700,50,300) http://www.ebook.edu.vn 13
  4. Giả sử (Xr,Yr) = (1.5, 1) Ta có Xtl = (700-100) / (3+3) = 100; Ytl = (300 -50) / (3+2) = 50 Vậy Xe = (1.5+3).100 = 450; Ye = (3-1).50 = 100; F4 Cửa sổ C4 (Xr,Yr) Tầm nhìn (Xe,Ye) C3 C1 C2 F3 F1 Hiện tượng méo hình Gọi B và H là đáy và chiều cao cửa sổ, còn B’, H’ là đáy và chiều cao của tầm nhìn. Khi chiếu cửa sổ lên tầm nhìn, nếu tỷ lệ B/H ≠ B’/H’ thì sẽ xảy ra hiện tượng méo hình, nghĩa là đối tượng không còn giữ được nguyên vẹn hình dạng lúc đầu Méo hình: B/H ≠ B’/H’ H’ H B B’ Hiệu ứng Zoom Ta cố định tầm nhìn trên màn hình và xét các trường hợp sau: http://www.ebook.edu.vn 14
  5. • Trong khi giữ nguyên kích thước cửa sổ, ta di chuyển nó tới những vị trí khác nhau trong không gian thực, khi đó trên tầm nhìn hiện ra những phần khác nhau của ảnh. Hình của ảnh được chiếu lên màn hình có kích thước không đổi • Khi kích thước cửa sổ bị thu nhỏ lại, phần diện tích được khảo sát của đối tượng cũng thu nhỏ lại theo nhưng ảnh của nó trên màn hình lại được phóng to ra • Ngược lại, nếu cửa sổ được phóng to ra thì phần diện tích được khảo sát của đối tượng cũng tăng lên nhưng ảnh của nó trên màn hình lại thu nhỏ lại Cửa Cửa sổ sổ T ầm Tầm nhìn nhìn Vấn đề Clipping (cắt bỏ những phần không nằm trong cửa sổ) Vấn đề đặt ra là cần phải cắt bỏ những phần của đối tượng không nằm trong cửa sổ. Vì ta đã coi đoạn thẳng là nguyên thể đồ họa nên vấn đề quy về việc làm sao để clipping một đoạn thẳng. Sau đây ta áp dụng thuật toán Cohen – Sutherland để giải quyết vấn đề này. Trước hết xét một điểm (X,Y). Nếu tọa độ của nó vi phạm một trong các điều kiện sau thì điểm đó nằm ngoài cửa sổ và sẽ bị loại bỏ F1≤ X ≤ F2 và F3≤ Y ≤ F4 Dấu bằng cho thấy các điểm nằm trên biên được coi như nằm trong cửa sổ. Với đoạn thẳng, ta kéo dài các đường biên cửa sổ thành các đường thẳng. Chúng chia mặt phẳng làm 9 vùng. Mỗi điểm trong mặt phẳng sẽ tương ứng với mã 4 bit được xác định theo quy tắc sau: • bit thứ 1 là 1 nếu điểm đó nằm bên trái cửa sổ • bit thứ 2 là 1 nếu điểm đó nằm bên phải cửa sổ http://www.ebook.edu.vn 15
  6. • bit thứ 3 là 1 nếu điểm đó nằm bên dưới cửa sổ • bit thứ 4 là 1 nếu điểm đó nằm bên trên cửa sổ 1001 1000 1010 Cửa sổ 0001 0010 0000 0101 0100 0110 Nhận xét; • Đoạn thẳng nằm hoàn toàn trong cửa sổ khi và chỉ khi mã của cả 2 đầu mút là 0000. Ngược lại, nếu một trong hai mã khác 0000 thì đoạn thẳng có 1 phần hoặc toàn bộ nằm ngoài cửa sổ • Nếu kết quả phép AND hai mã của 2 đầu mút khác 0000 thì đoạn thẳng tương ứng hoàn toàn nằm ngoài cửa sổ và sẽ không được hiển thị lên màn hình. 1001 1000 1010 m a b c 0001 0000 d 0010 g e h i j 0110 0101 0100 n f Các bước: - Nếu cả hai mã thuộc tính đều là 0000 thì đoạn thẳng hoàn toàn nằm trong cửa sổ - Nếu kết quả phép AND hai mã khác 0000 thì đoạn thẳng hoàn toàn nằm ngoài cửa sổ - Trường hợp không rơi vào hai khả năng trên: giao điểm của đoạn thẳng với biên cửa sổ chia đoạn thẳng đã cho thành nhiều đoạn. Ta xét từng đoạn theo cách như trên. Toàn bộ các bước kể trên được thể hiện trong thủ tục CAT dưới đây: http://www.ebook.edu.vn 16
  7. PROCEDURE Cat (X1,Y1,X2,Y2 : Real); TYPE Region = (Left,Right,Low,High); Code = SET OF Region; VAR C,C1,C2 : Code; X,Y : Real; XX1,YY1 : Integer; XX2,YY2 : Integer; PROCEDURE MaNhiPhan (X,Y : Real; VAR C : Code); {Tạo mã thuộc tính cho 2 đầu, xây dựng tập C của điểm (X,Y)} BEGIN C := []; IF X < XgFen THEN C := [Left] {nằm bên trái đường thẳng X=XgFen} ELSE IF X > XdFen THEN C := [Right]; IF Y < YbFen THEN C := C+[Low] ELSE IF Y > YhFen THEN C := C+[High] END; {MaNhiPhan} BEGIN MaNhiPhan (X1,Y1,C1); MaNhiPhan (X2,Y2,C2); WHILE (C1 []) OR (C2 []) DO {chừng nào ít nhất 1 trong 2 điểm còn nằm ngoài cửa sổ } BEGIN {Cắt dần để tìm đoạn hiển thị} IF (C1*C2) [] THEN Exit; {C1∩C2 ≠∅: cắt toàn bộ} IF C1 = [] THEN C := C2 ELSE C := C1; {chọn C là điểm nằm ngoài} IF Left IN C THEN BEGIN {tìm giao điểm (X,Y) với dt X=XgFen} X := XgFen; Y := Y1+(Y2-Y1)*(XgFen-X1)/(X2-X1) END ELSE IF Right IN C THEN {tìm giao điểm (X,Y) với dt X=XdFen} BEGIN X := XdFen; Y := Y1+(Y2-Y1)*(XdFen-X1)/(X2-X1) END ELSE IF Low IN C THEN BEGIN Y := YbFen; X := X1+(X2-X1)*(YbFen-Y1)/(Y2-Y1) END ELSE IF High IN C THEN BEGIN http://www.ebook.edu.vn 17
  8. Y := YhFen; X := X1+(X2-X1)*(YhFen-Y1)/(Y2-Y1) END; IF C = C1 {X1,Y1 nằm ngoài cửa sổ} THEN BEGIN X1 := X; {gán giao điểm (X,Y) mới tìm được cho (X1,Y1)} Y1 := Y; MaNhiPhan (X,Y,C1) {tính lại tập C1} END ELSE BEGIN {X2,Y2 nằm ngoài cửa sổ } X2 := X; Y2 := Y; MaNhiPhan (X,Y,C2) END END; {While} XX1 := Round ((X1-XgFen)*Xtl); YY1 := Round ((YhFen-Y1)*Ytl); XX2 := Round ((X2-XgFen)*Xtl); YY2 := Round ((YhFen-Y2)*Ytl); MoveTo (XX1,YY1); LineTo (XX2,YY2) END; 5. Vẽ trục tọa độ Vị trí tương đối giữa hệ trục và cửa sổ có rất nhiều trường hợp. Ta quy ước chỉ vẽ trục một cách tương đối, không tính toán chính xác theo vị trí tuyệt đối, nói cách khác việc vẽ trục chỉ mang tính trang trí, mang lại cho người xem cảm giác về vị trí tương đối của đối tượng so với hệ trục. - Trục nào cắt cửa sổ thì để nguyên và vẽ lên tầm nhìn - Trục nào không cắt qua cửa sổ: tịnh tiến ép sát vào mép trái hoặc mép dưới cửa sổ - Trục nào vốn đã trùng với mép trái hoặc mép dưới cửa sổ thì để nguyên Như vậy cuối cùng hình dạng cửa sổ có kèm theo hệ trục tọa độ sẽ có một trong 4 dạng sau: 2 trục không 2 trục đều cắt cửa trục Oy cắt cửa trục Ox cắt cửa cắt cửa sổ sổ: để nguyên sổ: giữ nguyên sổ: giữ nguyên PROCEDURE Truc; CONST dX = 5; dY = 4; http://www.ebook.edu.vn 18
  9. PROCEDURE MuiTenTrenX; {giả sử lúc đầu con trỏ CP đã ở A} BEGIN {Ve mui ten tren truc X} MoveRel (-dX,dY); {kéo CP về B} LineRel (dX,-dY); {vẽ BA} MoveRel (-dX,-dY); {kéo CP về C} LineRel (dX,dY) {vẽ CA} END; C PROCEDURE MuiTenTrenY; BEGIN {Ve mui ten tren truc Y} MoveRel (-dY,dX); LineRel (dY,-dX); A MoveRel (dY,dX); LineRel (-dY,-dX) dY END; B dX BEGIN IF (XgFen < 0) AND (XdFen > 0) THEN XOrig := 0 ELSE XOrig := XgFen; {mep trai} IF (YbFen < 0) AND (YhFen > 0) THEN YOrig := 0 ELSE YOrig := YbFen; {mep duoi} Diem (XgFen,YOrig); VeDen (XdFen,YOrig); {Ve truc X} MuiTenTrenX; Diem (XOrig,YbFen); VeDen (XOrig,YhFen); {Ve truc Y} MuiTenTrenY; END; Vẽ vạch chia độ Khi vẽ trục tọa độ ta phải vẽ các vạch chia thể hiện độ đo trên các trục đó. Vấn đề là khoảng chia phải đi qua gốc tọa độ. hình sau minh họa một trường hợp vẽ sai vạch chia Vẽ vạch chia sai Vẽ vạch chia đúng http://www.ebook.edu.vn 19
  10. Các thủ tục sau đảm nhiệm việc vẽ các vạch chia độ trên trục tọa độ: • Procedure ChinhTrucX; • Procedure ChinhTrucY; • Procedure DoDo; Đường viền và lưới Thủ tục Luoi() vẽ lưới ô vuông nhằm giúp người xem đánh giá vị trí tọa độ dễ dàng hơn. Thủ tục Vien() vẽ một đường viền bao quanh tầm nhìn PROCEDURE Vien (Mau : Byte); BEGIN SetColor (Mau); Diem (XgFen,YbFen); VeDen (XdFen,YbFen); VeDen (XdFen,YhFen); VeDen (XgFen,YhFen); VeDen (XgFen,YbFen) END; PROCEDURE VeVien; BEGIN Vien (White) END; PROCEDURE XoaVien; BEGIN Vien (Black) END; 5. Vẽ đa giác Nếu đa giác có tọa độ nguyên ta dùng công cụ DrawPoly của Pascal để vẽ. Nếu tọa độ là số thực, ta sẽ dùng thủ tục DaGiac() với các tham số: - X,Y: bảng chứa các tọa độ đa giác - Lim: số đỉnh của đa giác - Mode: giá trị boolean chỉ thị vẽ đa giác kín hay mở PROCEDURE DaGiac (X,Y : Table; Lim : Integer; Mode : Integer); VAR I : Integer; BEGIN Diem(X[1],Y[1]); FOR I := 2 TO Lim DO VeDen(X[I],Y[I]); IF Mode = Dong THEN VeDen(X[1],Y[1]) {Net cuoi} END; PROCEDURE VeDaGiac (X,Y : Table; Lim : Integer; Mode : Integer); BEGIN SetColor(White); DaGiac(X,Y,Lim,Mode) END; http://www.ebook.edu.vn 20
  11. PROCEDURE XoaDaGiac(X,Y : Table; Lim : Integer; Mode : Integer); BEGIN SetColor(Black); DaGiac(X,Y,Lim,Mode) END; 5. Vẽ đường tròn Ta xấp xỉ hóa đường tròn bằng một đa giác đều có số cạnh đủ lớn (72). Gọi (XC,YC) là tâm đường tròn, R là bán kính. Gọi Da là góc giữa 2 đỉnh liên tiếp, (Xn, Yn) là đỉnh thứ n. Có 2 cách để tính tọa độ các đỉnh. Cách trực tiếp: ⎧ X n+1 = R. cos(n.Da ) (1) ⎨ ⎩Yn+1 = R. sin (n.Da ) Cách 2: tọa độ đỉnh thứ n là ⎧ X n = R. cos(a ) ⎨ ⎩Yn = R. sin (a ) với a là góc ở tâm tương ứng. Ta có ⎧ X n +1 = R. cos(a + Da) ⎧ X n +1 = R. cos(a) cos( Da) − R. sin(a) sin( Da) ⇒⎨ ⎨ ⎩Yn +1 = R. sin (a + Da ) ⎩Yn +1 = R. sin(a) cos( Da) + R. cos(a). sin( Da) cuối cùng ta có: ⎧ X n+1 = X n . cos( Da) − Yn .sin( Da) (2) ⎨ ⎩Yn+1 = Yn . cos( Da) + X n .sin( Da) Phương pháp (1) tốn 2 phép nhân và 2 phép sin/cos cho mỗi đỉnh. Phương pháp (2) tốn 4 phép nhân và 2 phép ±. Lưu ý là máy tính phải dùng công thức Taylo để tính sin/cos x2 x4 x6 cos( x) = 1 − + − ... 2! 4! 6! PROCEDURE VeTron (XC,YC,R : Real; Cham : Boolean); VAR S,C,X,Y,Aux : Real; N : Integer; BEGIN S := Sin(Pi/36); {Da=Pi/36} C := Cos(Pi/36); X := XC+R; Y := YC; Diem(X,Y); FOR N := 2 TO 73 DO BEGIN Aux := XC+(X-XC)*C-(Y-YC)*S; Y := YC+(X-XC)*S+(Y-YC)*C; X := Aux; IF Cham THEN Diem(X,Y); http://www.ebook.edu.vn 21
  12. VeDen(X,Y) END END; Sau đây là một số chương trình ứng dụng thư viện DOHOA để vẽ các đường trong mặt phẳng. 6. Vẽ hình Bolygone Xét đường tròn đơn vị (bán kính bằng 1, tâm ở gốc tọa độ). Hình Bolygone bậc N gia số góc a là tập các dây cung nối các điểm sau: Điểm đầu Điểm cuối 00 00 a0 (N.a)0 (2a)0 (N.2a)0 (3a)0 (N.3a)0 ... ... 1000 800 600 0 120 400 1600 200 00 2000 Bolygone bậc 2, gia số góc 200 Bolygone bậc 184, gia số góc 10 http://www.ebook.edu.vn 22
  13. Bolygone bậc 192, gia số góc 10 Phương trình đường tròn bán kính R, tâm ở gốc tọa độ là: X = R.Cos(α) Y=R.Sin(α) với đường tròn đơn vị (R=1) ta có X=cos(α) Y=sin(α). Khi đó chương trình vẽ Bolygone như sau: PROGRAM Bolygone; USES Crt,Dohoa; VAR Ordre, Pas : Integer; ADeg,ARad : Real; F1,F2,F3,F4 : Real; C1,C2,C3,C4 : Integer; PROCEDURE NhapSoLieu; BEGIN ClrScr; Write ('Gõ số nguyên chỉ bậc (2,3,5 ...): gõ 0 để kết thúc'); Readln (Ordre); Writeln; IF Ordre 0 THEN BEGIN Write ('Cho gia số góc (1,3,5,7,11 ... ): '); ReadLn (Pas);{ Write ('Cho toa do cua so (F1,F2,F3,F4): '); ReadLn (F1,F2,F3,F4); Write ('Gõ tọa độ tầm nhìn (C1,C2,C3,C4): '); ReadLn (C1,C2,C3,C4);} F1:=-1;F2:=1; F3:=-1;F4:=1; http://www.ebook.edu.vn 23
  14. C1:=100;C2:=540;C3:=20;C4:=460; END END; PROCEDURE VeBolygone (Ordre,Pas : Integer); BEGIN ADeg := 0; REPEAT ARad := Pi*ADeg/180; Diem (Cos(ARad),Sin(ARad)); VeDen (Cos(Ordre*ARad),Sin(Ordre*ARad)); ADeg := ADeg+Pas; UNTIL ADeg > 360; {nếu tăng giới hạn 360 lên, chẳng hạn 3600, thì số dây cung sẽ tăng lên} END; BEGIN NhapSoLieu; WHILE Ordre 0 DO BEGIN MhDohoa; CuaSo (F1,F2,F3,F4); TamNhin (C1,C2,C3,C4); VeVien; VeBolygone (Ordre,Pas); Cho; MhVanBan; NhapSoLieu END END. 7. Vẽ các đường Cycloide Định nghĩa: Đường Cycloide là đường cong được vẽ bởi một điểm của vòng tròn lăn không trượt trên một đường thẳng. Phương trình tham số của cycloide là: X=R.(T-sin(T)) Y=R.(1-cos(T)) Đường Epicycloide là đường cong được vẽ bởi một điểm của vòng tròn lăn không trượt bên ngoài một vòng tròn cố định khác. http://www.ebook.edu.vn 24
  15. Đường Hypocycloide là đường cong được vẽ bởi một điểm của vòng tròn lăn không trượt bên trong một vòng tròn cố định khác. ⎧ ⎛ R1 + R2 ⎞ ⎪ X = ( R1 + R2 ). cos(T ) − L.R2 cos⎜ T⎟ ⎜R ⎟ ⎪ ⎝ ⎠ 2 ⎨ ⎪Y = ( R + R ). sin(T ) − L.R sin ⎛ R1 + R2 T ⎞ ⎜ ⎟ ⎜R ⎟ ⎪ 1 2 2 ⎝ ⎠ ⎩ 2 Trong đó: R1 là bán kính đường tròn cố định R2 là bán kính đường tròn di động T: góc tạo bởi trục Ox và đường nối tâm của vòng tròn di động với gốc tọa độ L là tham biến • L>1: đường cong giãn ra • L=1: đường cong bình thường • L0 ta nhận được đường Epicycloide • Nếu R2
  16. PROCEDURE Timtudongchuky; VAR Xdau,Ydau : Real; Xhien,Yhien : Real; deltaX,deltaY : Real; BEGIN chuky := 0; Xdau := Fx(0); Ydau := Fy(0); REPEAT chuky := chuky + 2*Pi; Xhien := Fx(chuky); Yhien := Fy(chuky); deltaX := Abs(Xhien-Xdau); deltaY := Abs(Yhien-Ydau); UNTIL ((deltaX= 0; aux1 := R1 + R2; aux2 := (R1 + R2)/R2; aux3 := L*R2; Writeln; Write ('Co ve duong tron sinh khong? (C/K) '); Readln (Sinh) END; PROCEDURE Timcuaso; BEGIN rmax := 0; http://www.ebook.edu.vn 26
  17. IF L >= 1 THEN rmax := R1 + R2 + Abs(L*R2) ELSE IF R2 > 0 THEN rmax := R1 + 2*R2 ELSE rmax := R1 END; PROCEDURE Veduongcong; VAR a,giaso : Real; BEGIN a := 0; giaso := Pi/48; Diem (Fx(0),Fy(0)); REPEAT a := a+giaso; VeDen (Fx(a),Fy(a)) UNTIL a >= chuky END; PROCEDURE Vongtronsinh; BEGIN Troncham (0,0,R1); Troncham (R1+R2,0,R2) END; PROCEDURE Trinhbaythambien; VAR s1,s2,s3,s4,s5 : string; BEGIN Str (R1:5:2,s1); Str (R2:5:2,s2); Str (L:5:2,s3); Str (chuky:8:5,s4); Str (rmax:8:5,s5); Tamnhin (0,maxX,0,11); OutTextXY (10,0,'R1 ='+s1+' R2 ='+s2+' L ='+s3 +' Chu ky ='+s4+' Rmax ='+s5) END; BEGIN Nhapdulieu; Timtudongchuky; Timcuaso; Mhdohoa; Cuaso (-rmax,rmax,-rmax,rmax); Tamnhin (0,maxX,0,maxY); Vevien; Tamnhin (140,580,15,345); IF upcase (sinh) = 'C' THEN Vongtronsinh; http://www.ebook.edu.vn 27
  18. Veduongcong; Trinhbaythambien; Cho; MhVanban END. 7. Tổng hợp hai giao động điều hòa Phương trình tổng quát của giao động điều hòa là hàm Y=A.Sin(F.T) trong đó A là biên độ, F là tần số, F.T là pha. Ta sẽ lập trình vẽ đồ thị hai giao động Y1=A1.sin(F1.T) Y2=A2.sin(F2.T+D) với D là độ lệch pha giữa Y1 và Y2. Sau đó, trên cùng màn hình ta vẽ đồ thị giao động tổng hợp Y=Y1+Y2. Màn hình được chia thành 3 tầm nhìn dành cho 3 cửa sổ tương ứng: • CuaSo(0,2Pi,-A1,A1) để khảo sát giao động thứ nhất • CuaSo(0,2Pi,-A2,A2) để khảo sát giao động thứ hai • CuaSo(0,2Pi,-A1-A2,A1+A2) để khảo sát giao động tổng hợp uses crt,Graph,dohoa; const pas=0.02; var f1,f2,a1,a2,D,B,P,X:real; cy:integer; { bề rộng cửa sổ 1,2 } PROCEDURE NhapSolieu; Begin clrscr; Writeln ('------------ TỔNG HỢP 2 GIAO ĐỘNG ------------'); GotoXY(1,10); Write('Giao động 1: biên độ, tần số'); readln(F1,A1); {có thể thử với: 5,1} GotoXY(1,14); Write('Giao động 2: biên độ, tần số, độ lệch pha (radian)'); readln(F2,A2,D); {có thể thử với:: 3, 1, 3.14} {thử với f1=f2, d=0: ⇒ độ lệch pha =0} End; FUNCTION Func1(X:real) : real; Begin Func1:=A1*sin(F1*x); End; FUNCTION Func2(X:real) : real; Begin Func2:=A2*sin(F2*x+D); End; FUNCTION FuncSum(X:real) : real; Begin FuncSum:=Func1(x)+Func2(x); End; http://www.ebook.edu.vn 28
  19. PROCEDURE VeHam1; Begin Cuaso(0,2*pi,-A1,A1); TamNhin(10,getmaxX-10,3*cy,4*cy); Truc; DoDo(1,0); x:=0;mausac(white); Diem(x,Func1(x)); Repeat x:=x+Pas; Veden(x,func1(x)); Until x>=2*pi; End; PROCEDURE VeHam2; Begin Cuaso(0,2*pi,-A2,A2); TamNhin(10,getmaxX-10,2*cy,3*cy); Truc; DoDo(1,0); x:=0;mausac(Green); Diem(x,Func2(x)); Repeat x:=x+Pas; Veden(x,func2(x)); Until x>=2*pi; End; PROCEDURE VeHamTong; Begin Cuaso(0,2*pi,-A1-A2,A1+A2); TamNhin(10,getmaxX-10,0,2*cy); Truc; DoDo(1,0); x:=0;mausac(Magenta); Diem(x,FuncSum(x)); Repeat x:=x+Pas; Veden(x,FuncSum(x)); Until x>=2*pi; End; BEGIN NhapSolieu; Mhdohoa; cy:=getmaxY div 4; Veham1; Cho; Veham2; Cho; VehamTong;Cho; { TamnhinDay; http://www.ebook.edu.vn 29
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2