|
![]() |
2018年12月02日 |
上次修改此網站的日期: 2018年12月02日
第十五章 VB 6.0電算機及2D函數圖繪製
程式設計簡介
15.1 前言
一般簡易之電算機,多可以做加、減、乘及除、開平方及反數(1/x)的功能,先進一點的電算機,則會再提供三角函數、反三角函數、對數等計算功能。下圖為Windows所提供之 標準型及工程型電算機(小算盤)。要在Windows offices程式中使用一般小算盤時,可在Windows螢幕下方,點按[開始]→所有程式→附屬所有程式→小算盤。 開啟一般小算盤後,可在檢視(Y)下拉對話方塊中選取工程型小算盤,使用完畢後只要按小算盤上的「關閉」鈕即可。
本章所要介紹之電算機屬科學用或工程用類型,舉凡一般科學上或工程上用得到之函數多包括在內。另外在測量工程用到之度、分、秒量測單位也一併介紹。下圖為作者所設計設計之科學電算機畫面。
15.2科學電算機功能及程式設計介紹
本章要介紹之科學電算機功能多,計算能力強,因其有計算方程式及函數值的功能,因此需使用到前面介紹過的VBscript控制項。為方便初學者熟悉函數及圖形繪製,另外又設計簡易之二維函數圖製作,唯對二維內隱型(Implicit function)及三維函數圖繪製有興趣之讀者,可參考編者另外一本即將出版之函數圖(二維及三維、tube plot等)繪圖程式書籍。
15.2.1指令按鈕及功能鍵介紹
為方便介紹,特將電算機之功能鍵及按鈕標題,依出現先後位置抄錄如下。
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) |
數值 |
數值 |
|
如需使用到函數繪圖功能,則點按開啟圖框功能鍵,就能開啟及使用到函數繪圖功能,開啟圖框後整個畫面如下圖所示。
15.2.2程式設計
電算機程式設計內容繁雜,如要一一說明並不容易,在此我們將其分為兩部份來說明:
(a) 加、減、乘、除四則運算:
以計算 5+7=12為例,必須使用到指令按鈕(1)數字5 [Cmdnum(5)],(2)運算子+[ CmdOper(0)],(3)數字7 [Cmdnum(7)]及(4)等號= [Cmdequal]四個指令按鈕,因此其程序設計可考慮如下。
數字(0~9)按鈕可設計成cmdnum(Index)陣列,分別以指數Index(0~9)代表數字。運算子為CmdOper(Index)指數Index(0~5)分別代表運算子(+、-、×、/及\)。等號則配合計算式中是否有左括弧,而分為”=”之Cmdequal,含右括弧”=)”之CmdRBEqual,含雙引號及右括弧” "=)”之CmdDBrEqual三種。因此”3+5”須採用”=”;”3*(2+9”須採用”)=”;”SinS(“56d43m48s須採用"”=)”配合,否則會出現語法錯誤(invalid expression)訊息。
(1).數字指令程序
Private Sub cmdnum_Click(Index As Integer)
If txtInput.Text = "0" Then txtInput.Text = ""
txtInput.Text = txtInput.Text & Index
End Sub
(2).運算子指令程序
Private Sub cmdoper_Click(Index As Integer)
On Error Resume Next
If Mid(txtShow.Text, Len(txtShow.Text), 1) <> ")" Then txtShow.Text = txtShow.Text + txtInput.Text
txtInput.Text = "0" '開始時txtInput顯示為0
txtShow.Text = txtShow.Text + cmdoper(Index).Caption
End Sub
(3).等號指令程序
Private Sub cmdequal_Click() '按等號得答案
Dim starrey() 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)
starrey = Split(StTpt, "(", -1, vbTextCompare) '輸入資料分離
Select Case glIndex
Case 42, 43 ' Atan2()及Atn2D
starrey = Split(starrey(1), ",", -1, vbTextCompare)
Ytpt = Val(starrey(0))
Xtpt = Mid(starrey(1), 1, Len(starrey(1)) - 1)
'MsgBox ("ytpt=" & Ytpt)
'MsgBox ("xtpt=" & Xtpt)
If glIndex = 42 Then txtInput.Text = Round(Atan2(Ytpt, Xtpt), 10) 'Atan2(y,x)
If glIndex = 43 Then txtInput.Text = Round(Atn2D(Ytpt, Xtpt), 10) 'Atn2D(y,x)
GoTo 60
Case 47 'Modxy()
starrey = Split(starrey(1), ",", -1, vbTextCompare)
Ytpt = Val(starrey(0))
Xtpt = Mid(starrey(1), 1, Len(starrey(1)) - 1)
txtInput.Text = Round((Ytpt Mod Xtpt), 10)
GoTo 60
.
.
.
.
Case Else
50 If IsOper(Mid(txtShow.Text, Len(txtShow.Text), 1)) = True And CmdLeftBrk.Enabled = True Then txtShow.Text = txtShow.Text + txtInput.Text
55 expression = EditedEqu(txtShow.Text)
If IsValid(expression, False, False, False) = False Then MsgBox ("Invalid expression"): Exit Sub
Call Init(expression)
txtInput.Text = Round(StrGetVal(0, 0, 0, 0), 10)
End Select
60 cmdequal.Enabled = True
CmdClsAll.Enabled = True
txtInput.Enabled = True
txtShow.Enabled = True
AnsResult = Round(Val(txtInput.Text), 10)
glIndex = -100
End Sub
上述數求最小公倍數及最大公約數,原規劃只求兩數的最小公倍數及最大公約數,讀者可以將其改為較多數之求法。
(b) 函數計算:
三角函數、反三角函數、對數、雙曲線函數(SinH,CosH)等,因語法(systax)需要,必須使用到對稱之左右小括弧,如Sin(),Asin(),AsinH(),Exp()等,如函數指令標題(Caption)名稱為”Sin(“或”Asin(“,或”AsinH(“或”Exp(“,則等號指令標題須以”)=”配合。另函數SinS(),CosS(),TanS()等,因函數之引數(Argument)為文字度分秒(dms),故函數指令標題如為”SinS("”,”CosS("”,”TanS("”,故等號需以”")”配合。
(1).函數指令程序
Private Sub cmdfunc_Click(Index As Integer)
glIndex = Index
If Index >= 12 And Index <= 17 Then
txtShow.Text = txtShow.Text + cmdfunc(Index).Caption + "("""
Else
txtShow.Text = txtShow.Text + cmdfunc(Index).Caption + "("
End If
End Sub
(2).右括弧等號指令程序
Private Sub CmdRBEqual_Click()
txtShow.Text = txtShow.Text + txtInput.Text + ")"
Call cmdequal_Click
txtShow.Text = txtShow.Text & "= " & Round(AnsResult, 10)
End Sub
(3).引號右括弧等號指令程序
Private Sub CmdDRBEqual_Click()
txtShow.Text = txtShow.Text + txtInput.Text + """)"
Call cmdequal_Click
txtShow.Text = txtShow.Text & "= " & Round(AnsResult, 10)
End Sub
15.3二維函數圖繪製介紹
二維函數指的是兩個變數,一個主變數及一個附屬變數的函數。二維函數可簡單概分為(1)外顯型函數(Explicit
functions),(2)內隱型函數(Implicit
functions)兩大類。一般其類型為y=f(x),如y=x+tan(x);或為x=f(y)類型,如y=x*sin(x);或參數類型x=x(t),y=y(t),如x=3sin(t);或如y=3*cos(t)者;或為極座標形式的類型,如以r(t)=e-4cos(4t)+sin(t/4)
表示者。主變數與副變數如為一對一關係者,多屬外顯型函數;另函數只能以類似f(x,y)=0表示者,如x
+(y-4)
-4=0,主變數與副變數非為一對一的,而為多值型就是所謂內隱型函數。外顯型函數因兩變數間為一對一關係,且不必像三維函數圖必須考慮隱藏線及背面去除問題,故其函數圖繪製非常簡單;而內隱型函數一般多必須先假定一個變數已知,然後求另一變數值,其解答可能有許多組,因此作業程序比較複雜。外顯型三維函數可以說是二維函數外顯型的延伸或推廣,因此適用在二維函數圖繪製的演算法,多可適用在三維函數作業中。一般y=f(x)或x=f(y)類型,多可以參數型式表示,如x=t以表示,則y=f(t),如y=t表示,則x=f(t)。
15.4外顯型函數圖繪製
外顯型函數因兩變數間為一對一關係,函數圖繪製非常簡單。下面我們就介紹y=f(x), x=f(y) 及x=x(t),y=y(t) 與r=r(t)類型類型的外顯型函數圖繪製。
15.3.1 y=f(x)類型函數圖繪製
y=f(x)二維類型函維圖繪製,因為其兩變數純為一對一,故製圖作業既簡單又單純,在此不特別介紹其詳細演算程序,讀者只要閱讀下面的程序碼便能瞭解一切。
Sub Form_Load()
glNumberOfTriangles = 0
glXbeg = -10 ‘變數x起點值
glXend = 10 ‘變數x終點值
gldX = 0.25 ‘變數x每次計算增量
glYbeg = -10 ‘變數y起點值
glYend = 10 ‘變數y終點值
gldY = 0.25 ‘變數y每次計算增量
gltbeg = -10 ‘變數t起點值
gltend = 10 ‘變數t終點值
gldt = 0.25 ‘變數t每次計算增量
glnumX = (glXend - glXbeg) / gldX
glnumY = (glYend - glYbeg) / gldY
glnumt = (gltend - gltbeg) / gldt
PicCanvas.ScaleMode = 0
PicCanvas.AutoRedraw = True
PicCanvas.Scale (glXbeg, glYend)-(glXend, glYbeg)
Randomize
End Sub
Private Sub PlotNormalX()
Dim I As Integer
Dim Pts() As Point2D
ReDim Pts(1 To glnumX)
glColoruse = RGB(Rnd * 250, Rnd * 250, Rnd * 250) '線條顏色
For I = 1 To glnumX
Pts(I).x = glXbeg + (I - 1) * gldX
Pts(I).y = glFx(Pts(I).x) '定義的外顯型函數y=f(x)
If I = 1 Then
PicCanvas.PSet (Pts(I).x, Pts(I).y)
Else
PicCanvas.Line -(Pts(I).x, Pts(I).y), glColoruse
End If
Next I
End Sub
15.4.2 x=f(y)類型函數圖繪製
此類似函數圖製作與上節所介紹的y=f(x)極為相似,差別只在兩變數位置互換而已。
Sub PlotNormalY()
Dim I As Integer
Dim Pts() As Point2D
ReDim Pts(1 To glnumY)
glColoruse = RGB(Rnd * 250, Rnd * 250, Rnd * 250) '線條顏色
For I = 1 To glnumY
Pts(I).y = glYbeg + (I - 1) * gldY
Pts(I).x = glFy(Pts(I).y) '定義的外顯型函數x=f(y)
If I = 1 Then
PicCanvas.PSet (Pts(I).x, Pts(I).y)
Else
PicCanvas.Line -(Pts(I).x, Pts(I).y), glColoruse
End If
Next I
End Sub
15.4.3 x=x(t),y=y(t)類型
參數型函數x=x(t),y=y(t)圖型的繪製、與y=f(x)及x=f(y)類型相差不大,給定主變數t後,x及y值便能求得。
Sub PlotParametric()
Dim t As Single, I As Integer
Dim Pts() As Point2D
ReDim Pts(1 To glnumt)
glColoruse = RGB(Rnd * 250, Rnd * 250, Rnd * 250) '線條顏色
For I = 1 To glnumt
t = gltbeg + (I - 1) * gldt
Pts(I).x = glFt_x(t) '定義的參數函數x=f(t)
Pts(I).y = glFt_y(t) '定義的參數函數y=f(t)
If I = 1 Then
PicCanvas.PSet (Pts(I).x, Pts(I).y)
Else
PicCanvas.Line -(Pts(I).x, Pts(I).y), glColoruse
End If
Next I
End Sub
15.4.4 r=r(t)類型
極座標型函數為極為特殊型態的二維函數,其數學表示法非常簡便,如中心在(0,0)的半徑為2單位的圓形,其數學公式為ρ(θ)=2。而中心在(1,2)的半徑為2單位的圓形,則公式為
ρ(θ)=
或
ρ(θ)=
兩者都代表相同的圓。一般矩形(x,y)座標轉換為極座標(ρ,θ)時其關係為:
ρ=
θ=tan
極座標(ρ,θ)轉換為矩形(x,y)座標時則關係為:
x=ρcos(θ)
y=ρsin(θ)
=ρ
有關極座標的函數圖繪製VB程序碼,披露如下供讀者參考:
Private Sub PlotPolar(color As Long, tStart As Single, tEnd As Single)
Dim x As Single, y As Single
Dim i As Integer, steps As Integer, t As Single, rl As Single
Dim dt As Single
Dim xmin_t As Single, xmax_t As Single, ymin_t As Single, ymax_t As Single
On Error GoTo errhandler
steps = 640
dt = (tEnd - tStart) / steps
xmin_t = 999999#
xmax_t = -999999#
ymin_t = 999999#
ymax_t = -999999#
For i = 1 To steps 'Do While t <= tEnd '
t = tStart + (i - 1) * dt
rl = glFrt(CDbl(t))
x = rl * Cos(t)
y = rl * Sin(t)
If x > xmax_t Then xmax_t = x
If x < xmin_t Then xmin_t = x
If y > ymax_t Then ymax_t = y
If y < ymin_t Then ymin_t = y
If (i = 1 Or ltest > 2 * gldt) Then
PicCanvas.PSet (x, y)
Else
PicCanvas.Line -(x, y), color
End If
Next i
Txtxmin_t.Text = xmin_t
Txtxmax_t.Text = xmax_t
Txtymin_t.Text = ymin_t
Txtymax_t.Text = ymax_t
Exit Sub
errhandler:
Error = True
Resume Next
End Sub
下面為繪圖程式函數圖繪製程式中幾個重要程序如座標軸(矩形及極座標)、刻度及單位標示、等之程序碼供讀者參考。
Private Sub CmdPolar_Click()’畫極座標類型函數圖
Dim stIn As String, St1 As String, St2 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)
tBeg = Val(txttBeg.Text)
tEnd = Val(txttEnd.Text)
PicGraph.DrawWidth = Val(txtDrawwidth)
Call drawPolar(expXY, colorPlot, tBeg, tEnd)
txtShow = stIn
txtEQInput.Text = ""
End Sub
Private Sub CmdClosePic_Click() ‘關閉圖框
Frame1.Visible = False
PicGraph.Visible = False
txtInput.Visible = False
Label1.Visible = False
CmdPolar.Visible = False
CmdParameter.Visible = False
PicHruler.Visible = False
PicVruler.Visible = False
OptPolar(0).Visible = False
OptPolar(1).Visible = False
OptPolar(1).value = False
FrmEngCal.Width = 4800
txtShow.Width = FrmEngCal.Width - 200
txtInput.Width = FrmEngCal.Width - 200
Label3.Visible = False
List1.Visible = False
CmdPolar.Enabled = False
CmdParameter.Enabled = False
CmdClosePic.Enabled = False
CmdOpenPic.Enabled = True
txtInput.Text = ""
txtShow.Text = ""
CmdClosePic.Visible = False
End Sub
Private Sub CmdOpenPic_Click() ’開啟圖框
.
.
.
.
rue
End Sub
Private Sub Form_Load() ’載入表單(資料初始化)
glXmax = 10
glXmin = -10
glYmax = 10
glYmin = -10
PicGraph.AutoRedraw = True
gl主格間距x = 2#
gl副格間距x = 0.5
gl主格間距y = 2#
gl副格間距y = 0.5
gl軸線顏色 = vbRed
gl刻度顏色 = vbMagenta
gl遮蓋顏色 = vbBlue
gl主格線色 = &H808080
gl副格線色 = &HC0C0C0
gl軸線線型 = 0
gl軸線寬 = 1
gl座標類型 = 0
gl主格線型 = 0
gl顯主格線嗎 = True
gl顯副格線嗎 = True
glx弳度 = False
gly弳度 = False
Call createCoordinates
'Private Sub form_load()
Call Init("")
'Option1(0) = True
'FctINput = 1#
'Option2(0) = True
'FctOutPut = 1#
PicGraph.Scale (-10, 10)-(10, -10)
PicGraph.AutoRedraw = True
Frame1.Visible = False
PicGraph.Visible = False
txtEQInput.Visible = False
Label1.Visible = False
Label3.Visible = False
List1.Visible = False
CmdPolar.Visible = False
CmdParameter.Visible = False
PicHruler.Visible = False
PicVruler.Visible = False
OptPolar(0).Visible = False
OptPolar(1).Visible = False
CmdClosePic.Visible = False
FrmEngCal.Width = 4800
txtShow.Width = FrmEngCal.Width - 200
txtEQInput.Width = FrmEngCal.Width - 200
txtEQInput.Text = ""
Randomize
colorPlot = RGB(Rnd * 250, Rnd * 250, Rnd * 250)
PicGraph.DrawWidth = 2
End Sub
Private Sub 座標及格線()
.
.
.
.
200 End Sub
Private Sub 畫副格線(Nsec副x As Integer, Nsec副y As Integer)
Dim i As Integer, Xi As Double, Yi As Double
Select Case gl座標類型 '0為矩形;1為極座標
Case 0 '矩形座標
Select Case glx弳度
Case False
For i = 1 To Nsec副x * 4
Xi = 0 + (i - 1) * gl副格間距x
PicGraph.Line (Xi, -200)-(Xi, 200), gl副格線色
Next i
For i = 1 To Nsec副x * 4
Xi = 0 - (i - 1) * gl副格間距x
PicGraph.Line (Xi, -200)-(Xi, 200), gl副格線色
Next i
Case True
For i = 1 To Nsec副x * 4
Xi = 0 + (i - 1) * gl副格間距x * pi / 2
PicGraph.Line (Xi, -200)-(Xi, 200), gl副格線色
Next i
For i = 1 To Nsec副x * 4
Xi = 0 - (i - 1) * gl副格間距x * pi / 2
PicGraph.Line (Xi, -200)-(Xi, 200), gl副格線色
Next i
End Select
Select Case gly弳度
Case False
.
.
.
.
End Select
Case 1 '1為極座標
Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double, Radi As Double, AngI As Double, Nang As Integer
Select Case glx弳度
Case False
For Radi = gl副格間距x To 200 Step gl副格間距x
PicGraph.Circle (0, 0), Radi, gl副格線色
Next Radi
Case True
For Radi = gl副格間距x * pi / 2 To 200 Step gl副格間距x * pi / 2
PicGraph.Circle (0, 0), Radi, gl副格線色
Next Radi
End Select
End Select
End Sub
Private Sub 畫主格線(Nsec主x As Integer, Nsec主y As Integer)
Dim i As Integer, Xi As Double, Yi As Double
Select Case gl座標類型 '0為矩形;1為極座標
Case 0 '矩形座標
Select Case glx弳度
Case False
For i = 1 To Nsec主x * 4
Xi = 0 + (i - 1) * gl主格間距x
PicGraph.Line (Xi, -200)-(Xi, 200), gl主格線色
Next i
For i = 1 To Nsec主x * 4
Xi = 0 - (i - 1) * gl主格間距x
PicGraph.Line (Xi, -200)-(Xi, 200), gl主格線色
Next i
Case True
‘
‘
‘
End Select
Select Case gly弳度
Case False
For i = 1 To Nsec主y * 4 + 1
Yi = 0 + (i - 1) * gl主格間距y
PicGraph.Line (-200, Yi)-(200, Yi), gl主格線色
Next i
For i = 1 To Nsec主y * 4 + 1
Yi = 0 - (i - 1) * gl主格間距y
PicGraph.Line (-200, Yi)-(200, Yi), gl主格線色
Next i
Case True
.
.
.
.
End Select
Case 1 '1為極座標
Dim x1 As Double, y1 As Double, x2 As Double, y2 As Double, Radi As Double, AngI As Double, Nang As Integer
Select Case glx弳度
Case False
'For Radi = gl主格間距 To glXmax * 16.1 Step gl主格間距
For Radi = gl主格間距x To 200 Step gl主格間距x
PicGraph.Circle (0, 0), Radi, gl主格線色
Next Radi
Case True
.
.
.
End Select
Dim Angtpt As Integer, Ndo As Integer
Ndo = 360 / gl角度間距 + 1
For i = 1 To Ndo
Angtpt = i * gl角度間距
If Angtpt > 360# Then Exit For
x1 = Cos(Angtpt * Ra)
y1 = Sin(Angtpt * Ra)
If Angtpt Mod 90 = 0 Then GoTo 100
x2 = 200 * Cos(Angtpt * Ra)
y2 = 200 * Sin(Angtpt * Ra)
PicGraph.Line (x1, y1)-(x2, y2), gl主格線色
100 Next i
End Select
End Sub
Private Sub 水平尺()
Dim i As Integer, Xi As Double, Nsec主x As Integer, Nsec副x As Integer
Nsec主x = Abs(glXmax - glXmin) / gl主格間距x + 1
Nsec副x = Abs(glXmax - glXmin) / gl副格間距x + 1
PicHruler.Scale (glXmin * 1.1, 1#)-(glXmax * 1.1, -1#)
'picHruler.Line (glxmin, -0.95)-(8.1 * glXmax, -0.95), vbRed
PicHruler.Line (-100, -0.95)-(100, -0.95), vbRed
Select Case glx弳度
Case False
For i = 1 To Nsec副x * 4 + 1 '主格線
Xi = 0 + (i - 1) * gl副格間距x
PicHruler.Line (Xi, -0.95)-(Xi, 0.001), gl副格線色
Next i
For i = 1 To Nsec副x * 4 + 1 '副格線
Xi = 0 - (i - 1) * gl副格間距x
PicHruler.Line (Xi, -0.95)-(Xi, 0.001), gl副格線色
Next i
For i = 1 To Nsec主x * 4 + 1 '主格線
Xi = 0 + (i - 1) * gl主格間距x
PicHruler.Line (Xi, -0.95)-(Xi, 0.02), gl主格線色
PicHruler.PSet (Xi, 0.75), PicHruler.BackColor
PicHruler.Print Xi
Next i
For i = 1 To Nsec主x * 4 + 1 '主格線
Xi = 0 - (i - 1) * gl主格間距x
PicHruler.Line (Xi, -0.95)-(Xi, 0.02), gl主格線色
PicHruler.PSet (Xi, 0.75), PicHruler.BackColor
PicHruler.Print Xi
Next i
Case True
For i = 1 To Nsec副x * 4 + 1 '主格線
Xi = 0 + (i - 1) * gl副格間距x * 0.5 * pi
PicHruler.Line (Xi, -0.95)-(Xi, 0.001), gl副格線色
Next i
For i = 1 To Nsec副x * 4 + 1 '副格線
Xi = 0 - (i - 1) * gl副格間距x * 0.5 * pi
PicHruler.Line (Xi, -0.95)-(Xi, 0.001), gl副格線色
Next i
For i = 1 To Nsec主x * 4 + 1 '主格線
Xi = 0 + (i - 1) * gl主格間距x * pi / 2
PicHruler.Line (Xi, -0.95)-(Xi, 0.02), gl主格線色
PicHruler.PSet (Xi, 0.75), PicHruler.BackColor
PicHruler.Print Round(Xi / pi, 3) & "π"
Next i
For i = 1 To Nsec主x * 4 + 1 '主格線
Xi = 0 - (i - 1) * gl主格間距x * pi / 2
PicHruler.Line (Xi, -0.95)-(Xi, 0.02), gl主格線色
PicHruler.PSet (Xi, 0.75), PicHruler.BackColor
PicHruler.Print Round(Xi / pi, 3) & "π"
Next i
End Select
End Sub
Private Sub 垂直尺()
.
.
.
.
End Sub
Private Sub Combo1_Click()
Select Case Combo1.Text
Case "極座標類"
List1.Clear
List1.AddItem "r(t)=1.5"
List1.AddItem "r(t)=5*cos(2t)"
List1.AddItem "r(t)=5/cos(t)"
List1.AddItem "r(t)=5/sin(t)"
.
.
.
List1.AddItem "r(t)=13/(4*cos(t)+6*sin(t))"
List1.AddItem "r(t)=2.5*(exp(cos(t))-2*cos(4*t)+sin(t/4)^3)"
List1.AddItem "r(t)=((2 * Cos(t) + 4 * Sin(t))+sqr((2 * Cos(t) + 4 * Sin(t))^2-4))/2"
List1.AddItem "r(t)=2*((2 * Cos(t) + 4 * Sin(t))-sqr((2 * Cos(t) + 4 * Sin(t))^2-4))/2"
CmdPolar.Enabled = True
CmdParameter.Enabled = False
Case "參數類"
List1.Clear
List1.AddItem "x=t,y=sin(t)"
List1.AddItem "x=t,y=cos(t)"
List1.AddItem "x=t,y=tan(t)"
.
.
.
List1.AddItem "x=2+2*cosd(30)*cos(t)-3*sind(30)*sin(t),y=2+2*sind(30)*cos(t)+3*cosd(30)*sin(t)"
List1.AddItem "x=(2+cos(2.5*t))*cos(t),y=(2+cos(2.5*t))*sin(t)"
List1.AddItem "x=2+2*cosd(30)/cos(t)-3*sind(30)*tan(t),y=2-2*sind(30)*tan(t)+3*cosd(30)/cos(t)"
.
.
.
CmdParameter.Enabled = True
CmdPolar.Enabled = False
End Select
End Sub
下兩圖為利用作者所設計之函數繪圖程式所繪製之成果畫面。