Công thức tính vị trí kim đồng hồ
Xét hệ trục tọa độ hai chiều qua gốc tọa độ O (gốc kim đồng hồ), điểm T (vị trí đỉnh kim đồng hồ ở thời điểm t) có tọa độ (x,y). Ta cần tính x và y để có thể vẽ được kim đồng hồ. Ở đây, có hai yếu tố xác định được là r (độ dài kim đồng hồ) và a (biết thời gian sẽ biết được a) nên ta tính x, y theo hai yếu tố này (a tính bằng radian):
x = cos(a - Pi/2)*r
y = sin(a - Pi/2)*r
Thiết kế giao diện
Trước tiên, bạn cần một bức hình mặt đồng hồ. Nếu có khả năng về đồ họa, bạn có thể tự tạo ra mặt đồng hồ của mình. Riêng tôi thì khả năng đồ họa chỉ ở mức i tờ nên tôi lên Google (www.google.com.vn) tìm kiếm trong mục Image với từ khóa “Clock” để lựa chọn mặt đồng hồ ưng ý cho… chắc ăn.
Bạn mở VB.NET, tạo mới một Windows Application. Bạn thiết lập thuộc tính TopMost của Form là True nếu muốn đồng hồ luôn nằm trên các cửa sổ khác. Bạn có thể cho Form trong suốt (thay đổi độ trong suốt của Form từ 0 đến 100 ở thuộc tính Opacity) để khi đặt đồng hồ trên Desktop, người dùng vẫn thấy nội dung nằm dưới.
Bạn thêm vào Form một PictureBox (tên picClock, thuộc tính Image là bức hình mặt đồng hồ) và một Timer có các thuộc tính:
(Name) | Timer1 |
Enabled | True |
Interval | 1000 |
Phần khai báo
Thiết kế xong giao diện, ta bắt đầu viết mã cho chương trình. Bạn khai báo các hằng sau:
Const Pi As Single = Math.PI ‘Các hàm toán học trong VB.NET được chứa trong thư viện System.Math
Const Phan60VongTron As Single = Pi / 30 ‘Một phút, một giây chiếm 1/60 vòng tròn
Const Phan12VongTron As Single = Pi / 6 ‘Một giờ chiếm 1/12 vòng tròn
Const MotPhanHaiPi As Single = Pi / 2
Ngoài ra bạn cần khai báo các hằng số KimGiay, KimPhut, KimGio là chiều dài các kim đồng hồ, các hằng số TamX, TamY là tọa độ gốc kim đồng hồ (bạn thiết lập cho phù hợp với bức hình mặt đồng hồ).
Các biến sau chứa tọa độ đỉnh các kim đồng hồ:
Dim XGiay, YGiay As Single
Dim XPhut, YPhut As Single
Dim XGio, YGio As Single
Thủ tục Timer1_Tick
Trong thủ tục này, sau mỗi giây (do trị Interval của Timer1 là 1000), ta lấy thời gian hiện tại và tính vị trí mới của các kim đồng hồ.
Các hàm về ngày tháng được VB.NET lưu trong thư viện System.DateTime. Bạn khai báo các biến và lấy thời gian hiện tại như sau:
Dim Giay As Short = Now.Second ‘Viết đầy đủ là System.DateTime.Now.Second
Dim Phut As Short = Now.Minute
Dim Gio As Short = Now.Hour
Kế tiếp là tính tọa độ đỉnh kim giây:
XGiay = Math.Cos(Giay * Phan60VongTron - MotPhanHaiPi) * KimGiay + TamX
YGiay = Math.Sin(Giay * Phan60VongTron - MotPhanHaiPi) * KimGiay + TamY
Đối với kim giờ, ngoài việc xác định vị trí mới theo công thức, chúng ta cần dựa vào số phút để tính khoảng kim giờ di chuyển thêm giữa hai giờ. Cách làm là tính khoảng cách trên các trục tọa độ giữa hai giờ, chia khoảng cách này cho 60 rồi nhân với số phút.
Dim dx As Single = Math.Cos((Gio + 1) * Phan12VongTron - MotPhanHaiPi) * KimGio - Math.Cos(Gio * Phan12VongTron - MotPhanHaiPi) * KimGio
Dim dy As Single = Math.Sin((Gio + 1) * Phan12VongTron - MotPhanHaiPi) * KimGio - Math.Sin(Gio * Phan12VongTron - MotPhanHaiPi) * KimGio
XGio = Math.Cos(Gio * Phan12VongTron - MotPhanHaiPi) * KimGio + Phut * dx / 60 + TamX
YGio = Math.Sin(Gio * Phan12VongTron - MotPhanHaiPi) * KimGio + Phut * dy / 60 + TamY
Bạn xác định vị trí mới của kim phút tương tự kim giờ, hoặc bạn cũng có thể xử lý kim phút như kim giây vì khoảng cách giữa hai phút không lớn lắm.
Sau khi thay đổi tọa độ đỉnh các kim đồng hồ, bạn cần sử dụng lệnh picClock.Refresh() để vẽ lại đồng hồ qua thủ tục picClock_Paint.
Thủ tục picClock_Paint
Thủ tục này để vẽ các kim đồng hồ. VB.NET lưu trữ các hàm về đồ họa trong thư viện System.Drawing, trong đó lớp Pen chứa các thiết lập cho bút vẽ, lớp Color chứa tập hợp màu. Lệnh vẽ đường thẳng (DrawLine) thuộc lớp System.Windows.Forms.PaintEventArgs.Graphics trong sự kiện Paint.
Private Sub picClock_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles picClock.Paint
e.Graphics.DrawLine(New Pen(Color.Red), TamX, TamY, XGiay, YGiay) ‘Vẽ kim giây
e.Graphics.DrawLine(New Pen(Color.Black, 3), TamX, TamY, XPhut, YPhut) ‘Vẽ kim phút
e.Graphics.DrawLine(New Pen(Color.Blue, 4), TamX, TamY, XGio, YGio) ‘Vẽ kim giờ
End Sub
Đến đây, bạn đã có một đồng hồ treo… Desktop rồi đấy. Bạn nhấn Ctrl-F5 để xem kết quả như thế nào?
Ngô Bảo Khoa
Không có nhận xét nào:
Đăng nhận xét