VB NET工程計算機程式設計

2018年12月02日

首頁 | 如何使用Excel試算表作程式資料輸入 | 如何繪製等高線 | 解3D隱函數 | 工程仲裁案例說明 | Spline_Bezier曲線測繪 | VB6工程計算機程式設計 | VB NET工程計算機程式設計 | 如何在VB6中使用Vbscript & Dll | 徐昇多邊形 | 物件導向程式簡介 | 如何在VB6使用VB.net圖案筆刷及顏色表 | VB Net Graphics method(B) | Graphic method in vb net(A)

上次修改此網站的日期: 2018年11月25日

第十五章  VB NET電算機及2D函數圖繪製

程式設計

15.1 前言

VB NET電算機程式設計及2D函數圖繪製程式設計與運算法則(Algorithm) ,其與VB 6.0,除所用語法稍有不同外,兩者多非常相似。因此我們可以將原VB 6電算機程式設計升級至VB Net,後修改部份語法即可。VB Net指令按鈕控制項因沒有群組的索引屬性(Index),因此有群組索引屬性按鈕之相關程序須另行設計,原引用之自訂數學函數,可改用VB Net內建函數。

下面我們將介紹

15.2指令按鈕及功能鍵介紹

為方便介紹,特將電算機之功能鍵及按鈕標題,依出現先後位置抄錄如下。

txtInput

Row

Col0

Col1

Col2

Col3

Col4

Col5

Col6

Row0

(

)

Exp

C

AC

BackS

開啟圖框

Row1

Sin

Cos

Tan

7

8

9

+

Row2

Csc

Sec

Cot

4

5

6

_

Row3

SinD

CosD

TanD

1

2

3

*

Row4

CscD

SecD

CotD

0

.

±

/

Row5

SinS

CosS

TanS

^y

1/x

N

\

Row6

CscS

SecS

CotS

e

Pi

Ra

Da

Row7

Asin

Acos

Atan

d

m

s

Row8

Acsc

Asec

Acot

Sqr

Abs

Sgn

Modxy

Row9

AsinD

AcosD

AtanD

Even

Odd

Ceil

Floor

Row10

AcscD

AsecD

AcotD

Lcm

Gcd

Int

Fix

Row11

SinH

CosH

TanH

Frac

Log10

LogN

Log

Row12

CscH

SecH

AcotH

Atan2

=

)=

)=

Row13

AsinH

AcosH

AtanH

Atn2D

Min(0)

Min(1)

Min(2)

Row14

AcscH

AsecH

AcotH

Mc

Mo(0)

Mo(1)

Mo(2)

txtShow

 

下表為對照於上表之指令按鈕名稱。

 

Row

Col0

Col1

Col2

Row0

CmdLeftBrk

CmdRightBrk

CmdExp

Row1

Cmdfunc_0

Cmdfunc_1

Cmdfunc_2

Row2

Cmdfunc_3

Cmdfunc_4

Cmdfunc_5

Row3

Cmdfunc_6

Cmdfunc_7

Cmdfunc_8

Row4

Cmdfunc_9

Cmdfunc_10

Cmdfunc_11

Row5

Cmdfunc_12

Cmdfunc_13

Cmdfunc_14

Row6

Cmdfunc_15

Cmdfunc_16

Cmdfunc_17

Row7

Cmdfunc_18

Cmdfunc_19

Cmdfunc_20

Row8

Cmdfunc_21

Cmdfunc_22

Cmdfunc_23

Row9

Cmdfunc_24

Cmdfunc_25

Cmdfunc_26

Row10

Cmdfunc_27

Cmdfunc_28

Cmdfunc_29

Row11

Cmdfunc_30

Cmdfunc_31

Cmdfunc_32

Row12

Cmdfunc_33

Cmdfunc_34

Cmdfunc_35

Row13

Cmdfunc_36

Cmdfunc_37

Cmdfunc_38

Row14

Cmdfunc_39

Cmdfunc_40

Cmdfunc_41

 

 

Row

Col3

Col4

Col5

Col6

Row0

CmdCls1

CmdClsAll

CmdBackSpace

CmdOpenPic

Row1

Cmdnum_7

Cmdnum_8

Cmdnum_9

Cmdoper(0

Row2

Cmdnum_4

Cmdnum_5

Cmdnum_6

Cmdoper(1

Row3

Cmdnum_1

Cmdnum_2

Cmdnum_3

Cmdoper(2

Row4

Cmdnum_0

Cmddecimal

CmdPlusMinus

Cmdoper(3

Row5

CmdPower

CmdXinverse

CmdFactor

Cmdoper(4

Row6

CmdEConst

CmdPiConst

CmdRaConst

CmdDaConst

Row7

Cmdcomma

CmdDeg

CmdMin

CmdSec

Row8

Cmdfunc_44

Cmdfunc_45

Cmdfunc_46

Cmdfunc_47

Row9

Cmdfunc_48

Cmdfunc_48

Cmdfunc_49

Cmdfunc_49

Row10

Cmdfunc_50

Cmdfunc_51

Cmdfunc_52

Cmdfunc_53

Row11

Cmdfunc_54

Cmdfunc_55

Cmdfunc_56

Cmdfunc_57

Row12

Cmdfunc_42

CmdEqual

CmdRBEqual

CmdDBrEqual

Row13

Cmdfunc_43

CmdEqual

CmdRBEqual

CmdDBrEqual

Row14

Cmdfunc_44

CmdEqual

CmdRBEqual

CmdDBrEqual

下表為三角函數及反三角函數等資料輸入及輸出類型說明

 

函數型態

標題

輸入資

料型態

輸出資

料型態

備註

三角函數

Cmdfunc(0)~(5)

弳度

數值

Sin(1.57)

三角函數

Cmdfunc(6)~(11)

角度

數值

SinD(45)

三角函數

Cmdfunc(12)~(17)

度分秒(dms)

數值

SinS(45d50m6s)

反三角函數

Cmdfunc(18)~(23)

數值

弳度

 

反三角函數

Cmdfunc(24)~(29)

數值

角度

 

SinH

Cmdfunc(30)~(35)

數值

數值

 

ASinH

Cmdfunc(36)~(41)

數值

數值

 

Atan2

Cmdfunc(42)

數值,數值

弳度

 

Atn2D

Cmdfunc(43)

數值,數值

角度

 

其他

Cmdfunc(44)~(57)

數值

數值

 

   

如需使用到函數繪圖功能,則點按開啟圖框功能鍵,就能開啟及使用到函數繪圖功能,開啟圖框後整個畫面如下圖所示。

 

 

(1)原函數指令程式cmdfunc_Click(Index As Integer),如不使用自訂動態群組指令控制項情況下,須分別列出共同事件如下:

 

Private Sub cmdfunc_0_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdfunc_0.Click, _

          cmdfunc_1.Click, cmdfunc_2.Click, cmdfunc_3.Click, cmdfunc_4.Click, cmdfunc_5.Click, cmdfunc_6.Click, _

          cmdfunc_7.Click, cmdfunc_8.Click, cmdfunc_9.Click, cmdfunc_10.Click, cmdfunc_11.Click, cmdfunc_18.Click, _

        cmdfunc_19.Click, cmdfunc_20.Click, cmdfunc_21.Click, cmdfunc_22.Click, cmdfunc_23.Click, cmdfunc_24.Click, _

        cmdfunc_25.Click, cmdfunc_26.Click, cmdfunc_27.Click, cmdfunc_28.Click, cmdfunc_29.Click, cmdfunc_30.Click, _

        cmdfunc_31.Click, cmdfunc_32.Click, cmdfunc_33.Click, cmdfunc_34.Click, cmdfunc_35.Click, cmdfunc_36.Click, _

        cmdfunc_37.Click, cmdfunc_38.Click, cmdfunc_39.Click, cmdfunc_40.Click, cmdfunc_41.Click, cmdfunc_42.Click, _

        cmdfunc_43.Click, cmdfunc_44.Click, cmdfunc_45.Click, cmdfunc_46.Click, cmdfunc_47.Click, cmdfunc_48.Click, _

        cmdfunc_49.Click, cmdfunc_50.Click, cmdfunc_51.Click, cmdfunc_52.Click, cmdfunc_53.Click, cmdfunc_54.Click, _

        cmdfunc_55.Click, cmdfunc_56.Click, cmdfunc_57.Click, cmdfunc_58.Click, cmdfunc_59.Click

        glcmdfunc = LCase(DirectCast((sender), Button).Name.ToString)

        Dim buttext As String = DirectCast((sender), Button).Text.ToString

        txtShow.Text = txtShow.Text + buttext + "("

 

    End Sub

 

上述中glcmdfunc為指令按鈕(扣除12~17按鈕以外)為區分指令按鈕標題名稱的公有變數,供其他程序呼叫。Buttext則為指令按鈕標題名稱作為函數名稱使用。

按鈕12~17部份則另設計如下:

 

    Private Sub cmdfunc_12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdfunc_12.Click, _

                 cmdfunc_13.Click, cmdfunc_14.Click, cmdfunc_15.Click, cmdfunc_16.Click, cmdfunc_17.Click

 

        glcmdfunc = LCase(DirectCast((sender), Button).Name.ToString)

        Dim buttext As String = DirectCast((sender), Button).Text.ToString

        txtShow.Text = txtShow.Text + buttext + "("""

    End Sub

 

等號指令按鈕cmdequal_Click(),則配合設計為:

 

Private Sub cmdequal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cmdequal.Click

        Dim stArray() As String, Xtpt As Double, Ytpt As Double

        Dim StTpt As String

        On Error Resume Next

        Dim expression As String

        Dim com As Control

        StTpt = Trim$(txtShow.Text)

        stArray = Split(StTpt, "(", -1, vbTextCompare)

        Select Case glcmdfunc

            Case "cmdfunc_42", "cmdfunc_43"

                stArray = Split(stArray(1), ",", -1, vbTextCompare)

                Ytpt = Val(stArray(0))

                Xtpt = Mid(stArray(1), 1, Len(stArray(1)) - 1)

                If glcmdfunc = "cmdfunc_42" Then txtInput.Text = Atn2(Ytpt, Xtpt)

                If glcmdfunc = "cmdfunc_43" Then txtInput.Text = Atn2D(Ytpt, Xtpt)

                GoTo 60

 

            Case "cmdfunc_47"

                stArray = Split(stArray(1), ",", -1, vbTextCompare)

                Ytpt = Val(stArray(0))

                Xtpt = Mid(stArray(1), 1, Len(stArray(1)) - 1)

                txtInput.Text = (Ytpt Mod Xtpt)

                GoTo 60

 

            Case "cmdfunc_57"

                'MsgBox("sttpt= " & StTpt)

                stArray = Split(stArray(1), ",", -1, vbTextCompare)

                Ytpt = Val(stArray(0))

                txtInput.Text = Math.Log(CDbl(Val(Ytpt))) / Math.Log(10)

                GoTo 60

 

            Case "cmdfunc_58"

                stArray = Split(stArray(1), ",", -1, vbTextCompare)

                Ytpt = Val(stArray(0))

                Xtpt = Mid(stArray(1), 1, Len(stArray(1)) - 1)

                txtInput.Text = Math.Log(CDbl(Val(Ytpt))) / Math.Log(Xtpt)

                GoTo 60

 

            Case "cmdfunc_52", "cmdfunc_53"

                stArray = Split(stArray(1), ",", -1, vbTextCompare)

                Ytpt = Val(stArray(0))

                Xtpt = Mid(stArray(1), 1, Len(stArray(1)) - 1)

                If glcmdfunc = "cmdfunc_52" Then txtInput.Text = mathDay.Lcm(Val(Ytpt), Val(Xtpt))

                If glcmdfunc = "cmdfunc_53" Then txtInput.Text = mathDay.Gcd(Val(Ytpt), Val(Xtpt))

                GoTo 60

 

            Case Else

                'MsgBox("sttpt= " & StTpt)

                If IsOper(Mid(txtShow.Text, Len(txtShow.Text), 1)) = True And CmdLeftBrk.Enabled = True Then txtShow.Text = txtShow.Text + txtInput.Text

                expression = EditedEqu(txtShow.Text)

                If IsValid(expression, False, False, False) = False Then MsgBox("Invalid expression") : Exit Sub

                Call Init0(expression)

                txtInput.Text = GetVal0(0.0, 0.0, 0.0)

                 End Select

60:     Cmdequal.Enabled = True

        CmdClsAll.Enabled = True

        txtInput.Enabled = True

        txtShow.Enabled = True

        AnsResult = Val(txtInput.Text)

      

    End Sub

下面為使用計算機計算之部份成果畫面

 

 

 

Figure 1  Sin(12)=?

 

Figure 2  SinD(45)=?

Figure 3  4+78+sin(45)=?

Figure 4  SinS(45d23m56s)=?

15.3 任意方程式輸入計算

本計算機相關函數計算因使用到VBcript語法因此在txtshow文字方塊中以鍵盤輸入合乎VB語法之任意方程式如12+45+SinS(“46d55m12s”)+12^2然後按計算機中之等號按鈕=後即可在txtInput中顯示正確答案。

 

Figure 5  12+45+SinS(46d55m12s)+12^2=?

15.4 2D函數圖繪製

有關2D函數圖繪製程式設計僅刊登極座標圖繪製部份供讀者參考。

  Private Sub CmdPolar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdPolar.Click

        Dim stIn As String,  expXY As String

        Dim tBeg As Double, tEnd As Double

        Dim STresult() As String

        If txtEQInput.Text = "" Then

            MsgBox("尚未選取或輸入方程式及變數範圍,請重來")

            Exit Sub

        End If

        stIn = txtEQInput.Text

        STresult = Split(stIn, "=", -1, vbTextCompare)

        If UBound(STresult) <> 1 Then

            MsgBox("資料有問題???,請重來")

            Exit Sub

        End If

        expXY = STresult(1)

        MsgBox("expx_xy=" & expXY)

        tBeg = Val(txttBeg.Text)

        tEnd = Val(txttEnd.Text)

        MsgBox("tbeg=" & tBeg & ":" & tEnd)

        Call drawPolar(expXY, tBeg, tEnd)

        txtEQInput.Text = ""

End Sub

 

    Private Sub drawPolar(ByRef expression As String, ByVal pStart As Double, ByVal pEnd As Double) ', Optional ByRef coloruse As Color = Color.Black)

        Dim lastx As Double, lasty As Double, point1 As PointF, point2 As PointF, x As Double, y As Double

        Dim X1 As Double, X2 As Double, Y1 As Double, Y2 As Double

        Dim expression1 As String, i As Double, steps As Integer

        Dim ia As Double, ib As Double, la As Double, Lb As Double, l As Double

        Dim ErrorI As Boolean, lasterror As Boolean

        Dim Ltest As Single

        Dim xa, ya, xb, yb As Single

        Dim gp As Graphics = PicGraph.CreateGraphics

        On Error GoTo errh

        expression1 = EditedEqu(expression)

        Init0(expression1)

        steps = 800

        steps = steps * 10

        i = pStart

        lasterror = False

        Do While i <= pEnd

            ErrorI = False

            Mathday.mathErr = False

            l = GetVal0(0, 0, i)

 

            X1 = l * Cos(i)

            Y1 = l * Sin(i)

            X2 = XYFromUser(PicGraph, -10, 10, 10, -10, X1, Y1).X

            Y2 = XYFromUser(PicGraph, -10, 10, 10, -10, X1, Y1).Y

            If Mathday.mathErr = True Then ErrorI = True

            If ErrorI = False And lasterror = False Then

                If i <> pStart Then

                    point1.X = lastx

                    point1.Y = lasty

                    point2.X = X2

                    point2.Y = Y2

                    xa = point1.X

                    ya = point1.Y

                    xb = point2.X

                    yb = point2.Y

                    Ltest = Sqrt((xb - xa) ^ 2 + (yb - ya) ^ 2)

 

                    If Ltest <= glXmax * 0.1 Then

                        gp.DrawLine(Pens.Blue, xa, ya, xb, yb)

                    End If

                End If

            End If

            lastx = X2

            lasty = Y2

            lasterror = ErrorI

 

            i = i + (pEnd - pStart) / steps

           

        Loop

errh:

        ErrorI = True

        Resume Next

    End Sub

 

 

 

 

 

Name(您的大名)
E_MAIL(您的電子信箱)
Comment or Suggestion(您想反應的狀況,建議,或諮詢事項)
首頁