Tìm trong:Webe-CHÍP

Bộ gõ (kiểu Vni/Telex/Viqr)Tắt (Alt+T)Mở (Alt+M)

 
Trang chủ LẬP TRÌNH BASIC TC 229

Tìm hiểu khả năng đồ họa của VB.NET (kỳ 4)

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, CosineTangent.
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, CosTan 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ó templateWindows 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, cmdCosinecmdTangent.
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, CosTanradian, 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 SineCosine, 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 TryCatch, 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 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.
CHƯƠNG CAN CHÍP

[Đầu trang]