Admin Admin
Tổng số bài gửi : 28 Join date : 10/08/2011 Age : 33
| Tiêu đề: Tìm hiểu khả năng đồ họa của VB.NET Thu Aug 11, 2011 9:04 pm | |
| Bài này là một ví dụ hoàn chỉnh nhằm kết thúc loạt bài tìm hiểu khả năng đồ họa của VB.NET. Ví dụ xoay quanh việc vẽ đường biểu diễn các hàm lượng giác Sine, Cosine và Tangent. | Trước khi bắt tay vào thiết kế ví dụ, bạn hãy quan sát hình 1 (biểu diễn hàm Sine), hình 2 (biểu diễn hàm Cosine) và hình 3 (biểu diễn hàm Tangent). | Hình 1 | Hình 2 | Hình 3 | Đường biểu diễn đồ thị có màu xanh dương, đường kẻ màu đỏ là đường biểu diễn trục hoành trên mặt phẳng tọa độ (chia hình chữ nhật làm 2 phần bằng nhau). Đồ thị là một đường cong đi qua nhiều điểm (ngay cả nét thẳng đứng trong đồ thị của hàm Tangent cũng là một đường cong đi qua các điểm xếp thẳng hàng với nhau mà thôi). | Ý tưởng của ví dụ này là: sử dụng hành vi DrawCurve để vẽ đường cong đi qua 360 điểm (tương ứng với 360 độ) trên mặt phẳng tọa độ. Tọa độ Y của mỗi điểm được tính nhờ các phép tính kết hợp với hành vi Sin, Cos và Tan có sẵn thuộc lớp Math (tương ứng với các hàm lượng giác trong VB6). | Bạn hãy nạp VB.NET 2005 và tạo một ứng dụng mới có template là Windows Application. Trên form trống có sẵn, vẽ một Panel control làm nơi vẽ đồ thị, đặt tên là pnlNoiVeDuongBieuDien. Kích thước của control này không ảnh hưởng đến kết quả vẽ. Vẽ tiếp 3 Button control lần lượt có tên là cmdSine, cmdCosine và cmdTangent. | Gõ đoạn mã sau đây vào form: | Imports System.Drawing.Drawing2D
Imports System.Math
Public Class VeDuongBieuDienHamLuongGiac
Dim CacDiemTrenDoThi(359) As PointF, BienDem As Integer
Dim KhoangChiaDo As Double, ViTriTrucHoanh As Double
Dim gNoiVe As Graphics
Dim pDuongBieuDien As Pen = New Pen(Color.Blue, 2)
Dim pTrucHoanh As Pen = New Pen(Color.Red, 1)
Private Sub VeDuongBieuDienHamLuongGiac_Load(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
KhoangChiaDo = pnlNoiVeDuongBieuDien.Width / 360
ViTriTrucHoanh = CInt(pnlNoiVeDuongBieuDien.Height / 2 - 1)
pTrucHoanh.DashStyle = DashStyle.Dash ‘Nét ngắt quãng
gNoiVe = pnlNoiVeDuongBieuDien.CreateGraphics
gNoiVe.SmoothingMode = SmoothingMode.HighQuality ‘Nét vẽ mượt mà
End Sub
Private Sub cmdSine_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdSine.Click
For BienDem = 0 To 359
CacDiemTrenDoThi(BienDem) = New _
Point(Round(BienDem * KhoangChiaDo), _
ViTriTrucHoanh - ViTriTrucHoanh * Sin(PI * BienDem / 180))
Next
Call VeDuongBieuDien("Sine")
End Sub
Private Sub cmdCosine_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdCosine.Click
For BienDem = 0 To 359
CacDiemTrenDoThi(BienDem) = New _
Point(Round(BienDem * KhoangChiaDo), _
ViTriTrucHoanh - ViTriTrucHoanh * Cos(PI * BienDem / 180))
Next
Call VeDuongBieuDien("Cosine")
End Sub
Private Sub cmdTangent_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdTangent.Click
Dim myTan As Double
For BienDem = 0 To 359
Try
myTan = Tan(PI * BienDem / 180) * 4
CacDiemTrenDoThi(BienDem) = New _
Point(Round(BienDem * KhoangChiaDo), _
ViTriTrucHoanh - myTan)
Catch
If Tan(PI * BienDem / 180) * 4 > ViTriTrucHoanh Then
CacDiemTrenDoThi(BienDem) = New _
Point(Round(BienDem * KhoangChiaDo), _
pnlNoiVeDuongBieuDien.Height)
Else
CacDiemTrenDoThi(BienDem) = New _
Point(Round(BienDem * KhoangChiaDo), 0)
End If
End Try
Next
Call VeDuongBieuDien("Tangent")
End Sub
Sub VeDuongBieuDien(ByVal sTenHam As String)
With gNoiVe
.Clear(pnlNoiVeDuongBieuDien.BackColor)
.DrawString(sTenHam, New Font("Times New Roman", 14), _
New SolidBrush(Color.Green), 120, 20)
.DrawLine(pTrucHoanh, 0, CInt(ViTriTrucHoanh), _
pnlNoiVeDuongBieuDien.Width, CInt(ViTriTrucHoanh))
.DrawCurve(pDuongBieuDien, CacDiemTrenDoThi)
End With
End Sub
End Class
| Nhận xét: | • Với GDI+, hệ thống tọa độ có gốc là góc trên bên trái của Panel control, nên tọa độ Y có trị số càng lớn nếu điểm càng thấp. Do ta sử dụng trục hoành là đường kẻ màu đỏ (vẽ tại ViTriTrucHoanh) chia Panel control làm 2 phần, phần trên thể hiện các điểm có tọa độ Y dương, còn phần dưới thể hiện các điểm có tọa độ Y âm. Vì thế, phép trừ giá trị từ ViTriTrucHoanh làm cho đường cong chuyển lên đối với các giá trị dương, chuyển xuống đối với các giá trị âm. | • Vì tham số của các hành vi Sin, Cos và Tan là radian, nên trong công thức phải nhân với PI / 180 để chuyển độ thành radian. | • Giá trị của Tan(90) và Tan(270) là không xác định, nên lỗi overflow (tràn số) sẽ làm ngưng chương trình. Do vậy, khác với cách tính tọa độ các điểm nằm trên đồ thị hàm Sine và Cosine, ta đặt đoạn mã tính tọa độ các điểm nằm trên đồ thị hàm Tangent bên trong một cấu trúc Try … Catch. Tọa độ vẫn được tính theo đoạn mã nằm giữa Try và Catch, nếu có lỗi xảy ra (gọi là trường hợp ngoại lệ) thì tính lại tọa độ theo đoạn mã nằm giữa Catch và End Try (theo đó các điểm ở đỉnh và đáy của Panel control được sử dụng để thay thế). Con số 4 trong phép tính chỉ làm cho đồ thị đẹp hơn thôi, bạn hãy thử đổi số 4 thành 1, 2 hoặc 3 thì sẽ thấy. |
| |
|