首頁 | 如何使用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
Mc
Mo(0)
Mo(1)
Mo(2)
txtShow
下表為對照於上表之指令按鈕名稱。
CmdLeftBrk
CmdRightBrk
CmdExp
Cmdfunc_0
Cmdfunc_1
Cmdfunc_2
Cmdfunc_3
Cmdfunc_4
Cmdfunc_5
Cmdfunc_6
Cmdfunc_7
Cmdfunc_8
Cmdfunc_9
Cmdfunc_10
Cmdfunc_11
Cmdfunc_12
Cmdfunc_13
Cmdfunc_14
Cmdfunc_15
Cmdfunc_16
Cmdfunc_17
Cmdfunc_18
Cmdfunc_19
Cmdfunc_20
Cmdfunc_21
Cmdfunc_22
Cmdfunc_23
Cmdfunc_24
Cmdfunc_25
Cmdfunc_26
Cmdfunc_27
Cmdfunc_28
Cmdfunc_29
Cmdfunc_30
Cmdfunc_31
Cmdfunc_32
Cmdfunc_33
Cmdfunc_34
Cmdfunc_35
Cmdfunc_36
Cmdfunc_37
Cmdfunc_38
Cmdfunc_39
Cmdfunc_40
Cmdfunc_41
CmdCls1
CmdClsAll
CmdBackSpace
CmdOpenPic
Cmdnum_7
Cmdnum_8
Cmdnum_9
Cmdoper(0
Cmdnum_4
Cmdnum_5
Cmdnum_6
Cmdoper(1
Cmdnum_1
Cmdnum_2
Cmdnum_3
Cmdoper(2
Cmdnum_0
Cmddecimal
CmdPlusMinus
Cmdoper(3
CmdPower
CmdXinverse
CmdFactor
Cmdoper(4
CmdEConst
CmdPiConst
CmdRaConst
CmdDaConst
Cmdcomma
CmdDeg
CmdMin
CmdSec
Cmdfunc_44
Cmdfunc_45
Cmdfunc_46
Cmdfunc_47
Cmdfunc_48
Cmdfunc_49
Cmdfunc_50
Cmdfunc_51
Cmdfunc_52
Cmdfunc_53
Cmdfunc_54
Cmdfunc_55
Cmdfunc_56
Cmdfunc_57
Cmdfunc_42
CmdEqual
CmdRBEqual
CmdDBrEqual
Cmdfunc_43
下表為三角函數及反三角函數等資料輸入及輸出類型說明
函數型態
標題
輸入資
料型態
輸出資
備註
三角函數
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)
Cmdfunc(42)
數值,數值
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
txtShow.Text = txtShow.Text + buttext + "("""
等號指令按鈕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"
txtInput.Text = (Ytpt Mod Xtpt)
Case "cmdfunc_57"
'MsgBox("sttpt= " & StTpt)
txtInput.Text = Math.Log(CDbl(Val(Ytpt))) / Math.Log(10)
Case "cmdfunc_58"
txtInput.Text = Math.Log(CDbl(Val(Ytpt))) / Math.Log(Xtpt)
Case "cmdfunc_52", "cmdfunc_53"
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))
Case Else
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)
下面為使用計算機計算之部份成果畫面
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("資料有問題???,請重來")
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 = ""
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)
lastx = X2
lasty = Y2
lasterror = ErrorI
i = i + (pEnd - pStart) / steps
Loop
errh:
ErrorI = True
Resume Next
Name(您的大名) E_MAIL(您的電子信箱) Comment or Suggestion(您想反應的狀況,建議,或諮詢事項)