⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.frm

📁 几何图形学小程序 物体明暗效应的事例 消隐 两个立方体旋转 两个光源
💻 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 + -