📄 form1.frm
字号:
VERSION 5.00
Begin VB.Form Form1
BackColor = &H00FFFFC0&
Caption = "明暗效应"
ClientHeight = 8040
ClientLeft = 60
ClientTop = 450
ClientWidth = 10335
FillColor = &H00FFC0C0&
FillStyle = 0 'Solid
ForeColor = &H000000FF&
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 536
ScaleMode = 3 'Pixel
ScaleWidth = 689
StartUpPosition = 3 '窗口缺省
Begin VB.CommandButton Command3
Caption = "退出"
Height = 375
Left = 8880
TabIndex = 1
Top = 1440
Width = 1215
End
Begin VB.CommandButton Command1
Caption = "画球"
Height = 375
Left = 8880
TabIndex = 0
Top = 600
Width = 1215
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Command1_Click()
Form1.Cls
Dim Key1 As Long
Dim Key2 As Long
Dim Key3 As Long
Dim K As Long
Dim Cs As Double
Dim X As Long '用户坐标系
Dim Y As Long
Dim Z As Long
Dim X1 As Long '设备坐标系
Dim Y1 As Long
Dim X2 As Long '点光源位置
Dim Y2 As Long
Dim Z2 As Long
Dim Xo As Long '设备坐标系下的用户坐标系原点坐标
Dim Yo As Long
Dim R As Long '半径
Dim I As Long '光强
Dim Ia As Long '环境光光强
Dim Il As Long '漫反射光强
Dim Kd As Long
Xo = 300: Yo = 285: R = 100 '初始化
X2 = -950: Y2 = 950: Z2 = 950 '点光源位置
Ia = 50: Kd = 205
Y1 = Yo - R
Do '逐行扫描开始
X1 = Xo - R
Do
X = X1 - Xo: Y = Yo - Y1 '设备坐标向用户坐标转化
Key1 = X * X + Y * Y
If Key1 <= R * R Then
Z = Sqr(R * R - X * X - Y * Y)
Key2 = (X2 - X) * X + (Y2 - Y) * Y + (Z2 - Z) * Z
Key3 = Sqr((X2 - X) * (X2 - X) + (Y2 - Y) * (Y2 - Y) + (Z2 - Z) * (Z2 - Z))
Cs = Key2 / (Key3 * R)
Il = Kd * Cs '漫反射光强
I = Ia + Il
If I > 255 Then
Form1.PSet (X1, Y1), RGB(255, 255, 255)
End If
If I >= 55 And I <= 255 Then
K = 51 * I / 40 - 70
Form1.PSet (X1, Y1), RGB(255, K, K)
End If
If I < 55 Then
K = 201 + I
If K >= 0 Then
Form1.PSet (X1, Y1), RGB(K, 0, 0)
ElseIf K < 0 Then
Form1.PSet (X1, Y1), RGB(0, 0, 0)
End If
End If
X1 = X1 + 1
ElseIf Key1 > R * R Then
X1 = X1 + 1
End If
Loop While X1 <= Xo + R
Y1 = Y1 + 1
Loop While Y1 <= Yo + R '逐行扫描结束
End Sub
Private Sub Command2_Click()
Form1.Cls
Dim Key1 As Long
Dim Key2 As Long
Dim Key3 As Long
Dim Key4 As Long
Dim Cs As Double
Dim X As Long '用户坐标系
Dim Y As Long
Dim Z As Long
Dim X1 As Long '设备坐标系
Dim Y1 As Long
Dim X2 As Long '点光源位置
Dim Y2 As Long
Dim Z2 As Long
Dim X3 As Long '法向量
Dim Y3 As Long
Dim Z3 As Long
Dim Xo As Long '设备坐标系下的用户坐标系原点坐标
Dim Yo As Long
Dim a As Long
Dim I As Long '光强
Dim Ia As Long '环境光光强
Dim Il As Long '漫反射光强
Dim Kd As Long
Xo = 300: Yo = 385: a = 200 '初始化
X2 = -250: Y2 = Sqr(X * X * 2) * 1.732 / 4: Z2 = 250 '点光源位置
Ia = 50: Kd = 205
'****************************************************************************************************
Y1 = Yo - 1.35 * a
Do '逐行扫描开始
X1 = Xo - a * (3 - 1.732) / 3
Do
X = X1 - Xo: Y = Yo - Y1 '设备坐标向用户坐标转化
Key1 = (a - Y) / 1.732 + a - 1.732 / 3 * a
If -Key1 <= X And X <= Key1 Then
Z = Sqr(Key1 * Key1 - X * X)
X3 = X
Y3 = Sqr(X * X + Z * Z) * 1.732 / 4
Z3 = Z
Key2 = X2 * X3 + Y2 * Y3 + Z2 * Z3
Key3 = Sqr(X2 * X2 + Y2 * Y2 + Z2 * Z2)
Key4 = Sqr(X3 * X3 + Y3 * Y3 + Z3 * Z3)
Cs = Key2 / (Key3 * Key4)
Il = Kd * Cs '漫反射光强
I = Ia + Il
If I > 255 Then
Form1.PSet (X1, Y1), RGB(255, 255, 255)
End If
If I >= 0 And I <= 255 Then
Form1.PSet (X1, Y1), RGB(I, I, I)
End If
If I < 0 Then
Form1.PSet (X1, Y1), RGB(0, 0, 0)
End If
X1 = X1 + 1
ElseIf Key1 > R * R Then
X1 = X1 + 1
End If
Loop While X1 <= Xo + a * (3 - 1.732) / 3
Y1 = Y1 + 1
Loop While Y1 <= Yo - a '逐行扫描结束
'***************************************************************
Y1 = Yo - a
Do '逐行扫描开始
X1 = Xo - a * (3 - 1.732) / 3
Do
X = X1 - Xo: Y = Yo - Y1 '设备坐标向用户坐标转化
Key1 = a * (3 - 1.732) / 3
If -Key1 <= X And X <= Key1 Then
Z = Sqr(Key1 * Key1 - X * X)
X3 = X
Y3 = 0
Z3 = Z
Key2 = X2 * X3 + Y2 * Y3 + Z2 * Z3
Key3 = Sqr(X2 * X2 + Y2 * Y2 + Z2 * Z2)
Key4 = Sqr(X3 * X3 + Y3 * Y3 + Z3 * Z3)
Cs = Key2 / (Key3 * Key4)
Il = Kd * Cs '漫反射光强
I = Ia + Il
If I > 255 Then
Form1.PSet (X1, Y1), RGB(255, 255, 255)
End If
If I >= 0 And I <= 255 Then
Form1.PSet (X1, Y1), RGB(I, I, I)
End If
If I < 0 Then
Form1.PSet (X1, Y1), RGB(0, 0, 0)
End If
X1 = X1 + 1
ElseIf Key1 > R * R Then
X1 = X1 + 1
End If
Loop While X1 <= Xo + a * (3 - 1.732) / 3
Y1 = Y1 + 1
Loop While Y1 <= Yo - 9 * a / 10 '逐行扫描结束
'****************************************************************
Y1 = Yo - 9 * a / 10
Do '逐行扫描开始
X1 = Xo - a * (3 - 1.732) / 3 + a / 20
Do
X = X1 - Xo: Y = Yo - Y1 '设备坐标向用户坐标转化
Key1 = a * (3 - 1.732) / 3 - a / 20
If -Key1 <= X And X <= Key1 Then
Z = Sqr(Key1 * Key1 - X * X)
X3 = X
Y3 = 0
Z3 = Z
Key2 = X2 * X3 + Y2 * Y3 + Z2 * Z3
Key3 = Sqr(X2 * X2 + Y2 * Y2 + Z2 * Z2)
Key4 = Sqr(X3 * X3 + Y3 * Y3 + Z3 * Z3)
Cs = Key2 / (Key3 * Key4)
Il = Kd * Cs '漫反射光强
I = Ia + Il
If I > 255 Then
Form1.PSet (X1, Y1), RGB(255, 255, 255)
End If
If I >= 0 And I <= 255 Then
Form1.PSet (X1, Y1), RGB(I, I, I)
End If
If I < 0 Then
Form1.PSet (X1, Y1), RGB(0, 0, 0)
End If
X1 = X1 + 1
ElseIf Key1 > R * R Then
X1 = X1 + 1
End If
Loop While X1 <= Xo + a * (3 - 1.732) / 3
Y1 = Y1 + 1
Loop While Y1 <= Yo - a / 10 '逐行扫描结束
'*******************************************************************************************************************
Y1 = Yo - a / 10
Do '逐行扫描开始
X1 = Xo - a * (3 - 1.732) / 3
Do
X = X1 - Xo: Y = Yo - Y1 '设备坐标向用户坐标转化
Key1 = a * (3 - 1.732) / 3
If -Key1 <= X And X <= Key1 Then
Z = Sqr(Key1 * Key1 - X * X)
X3 = X
Y3 = 0
Z3 = Z
Key2 = X2 * X3 + Y2 * Y3 + Z2 * Z3
Key3 = Sqr(X2 * X2 + Y2 * Y2 + Z2 * Z2)
Key4 = Sqr(X3 * X3 + Y3 * Y3 + Z3 * Z3)
Cs = Key2 / (Key3 * Key4)
Il = Kd * Cs '漫反射光强
I = Ia + Il
If I > 255 Then
Form1.PSet (X1, Y1), RGB(255, 255, 255)
End If
If I >= 0 And I <= 255 Then
Form1.PSet (X1, Y1), RGB(I, I, I)
End If
If I < 0 Then
Form1.PSet (X1, Y1), RGB(0, 0, 0)
End If
X1 = X1 + 1
ElseIf Key1 > R * R Then
X1 = X1 + 1
End If
Loop While X1 <= Xo + a * (3 - 1.732) / 3
Y1 = Y1 + 1
Loop While Y1 <= Yo '逐行扫描结束
'***************************************************
Y1 = Yo
Do '逐行扫描开始
X1 = Xo - a * (3 - 1.732) / 3
Do
X = X1 - Xo: Y = Yo - Y1 '设备坐标向用户坐标转化
Key1 = Y / 1.732 + a - 1.732 / 3 * a
If -Key1 <= X And X <= Key1 Then
Z = Sqr(Key1 * Key1 - X * X)
X3 = X
Y3 = -Sqr(X * X + Z * Z) * 1.732 / 4
Z3 = Z
Key2 = X2 * X3 + Y2 * Y3 + Z2 * Z3
Key3 = Sqr(X2 * X2 + Y2 * Y2 + Z2 * Z2)
Key4 = Sqr(X3 * X3 + Y3 * Y3 + Z3 * Z3)
Cs = Key2 / (Key3 * Key4)
Il = Kd * Cs '漫反射光强
I = Ia + Il
If I > 255 Then
Form1.PSet (X1, Y1), RGB(255, 255, 255)
End If
If I >= 0 And I <= 255 Then
Form1.PSet (X1, Y1), RGB(I, I, I)
End If
If I < 0 Then
Form1.PSet (X1, Y1), RGB(0, 0, 0)
End If
X1 = X1 + 1
ElseIf Key1 > R * R Then
X1 = X1 + 1
End If
Loop While X1 <= Xo + a * (3 - 1.732) / 3
Y1 = Y1 + 1
Loop While Y1 <= Yo + 0.35 * a '逐行扫描结束
'***************************************************************************************************
End Sub
Private Sub Command3_Click()
End
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -