有效边表 VB6.0代码

' 通过声明类来实现链表
Option   Explicit
Public  xValue  As   Single       ' 线与当前x扫描线的交点
Public  yMax  As   Integer        ' 线的y最大值
Public  kSubOne  As   Single      ' k的-1次方
Public  NextNode  As  Node      ' 下一个
Option  Base  1                         ' 让代码中所有数组的上标是从1开始
Dim  X%, Y%, Vid%
Dim  vx  As  Variant, vy  As  Variant     ' 定义存放各个点坐标的数组
Const  Vnumber  =   7                     ' 点的数目
Const  xMax  =   12                       ' 坐标最大值
Const  grid  =   400

Private   Sub Command2_Click()        '退出
End
End Sub


Private   Sub Command3_Click()        '生成并输出AET
Dim i As Integer
Form2.Show
For i = 1 To 12
    
Call CreatLink(i)               '依次建立12条扫描线的AET
Next
End Sub


Private   Sub CreatLink(xLine As Integer)     '建立AET的过程
Dim xTemp As Single     '当前线与x扫描线的交点的x坐标变量
Dim kTemp As Single     '斜率k变量

Dim n As Node
Dim nI As Node
Dim nI2 As Node
Dim nMax As Node
Dim ListHead As Node    '
Dim ListTail As Node    '

Dim printText As String

For i = 1 To Vnumber    '依次检测各线p1p2 p2p3 p3p4...
    xTemp = (((xLine - Val(vy(i))) * (Val(vx(i + 1)) - Val(vx(i)))) / (Val(vy(i + 1)) - Val(vy(i)))) + Val(vx(i))   '求得当前线与x扫描线的交点的x坐标
    If Val(vx(i + 1)) > Val(vx(i)) Then                             '如果pi+1>pi的情况
        If xTemp >= Val(vx(i)) And xTemp <= Val(vx(i + 1)) Then     '交点位于有效范围内
            Set n = New Node                                        '声明结点
            n.xValue = xTemp                                        '将xTemp存入链结点的第一个位置
            
            
If Val(vy(i + 1)) > Val(vy(i)) Then                     '判断y点谁大 将最大值存入链结点的第二个位置
                n.yMax = Val(vy(i + 1))
            
Else
                n.yMax 
= Val(vy(i))
            
End If
            
            kTemp 
= (Val(vy(i + 1)) - Val(vy(i))) / (Val(vx(i + 1)) - Val(vx(i)))   '求k
            n.kSubOne = kTemp                                       '将k存入链结点的第三个位置
            
            
If ListHead Is Nothing Then                             '如果链表未空
                Set ListHead = n                                    '通过头 新节点入链
            Else
                
Set ListTail.NextNode = n                           '通过尾 新节点入链
            End If
            
Set ListTail = n                                        '定义新的尾
            Set ListTail.NextNode = Nothing                         '尾指向空
        Else
        
End If
    
ElseIf Val(vx(i)) > Val(vx(i + 1)) Then                         '如果pi+1<pi的情况
        If xTemp >= Val(vx(i + 1)) And xTemp <= Val(vx(i)) Then     '交点位于有效范围内
            Set n = New Node
            n.xValue 
= xTemp
            
If Val(vy(i + 1)) > Val(vy(i)) Then
                n.yMax 
= Val(vy(i + 1))
            
Else
                n.yMax 
= Val(vy(i))
            
End If
            kTemp 
= (Val(vy(i + 1)) - Val(vy(i))) / (Val(vx(i + 1)) - Val(vx(i)))
            n.kSubOne 
= kTemp
            
If ListHead Is Nothing Then
                
Set ListHead = n
            
Else
                
Set ListTail.NextNode = n
            
End If
            
Set ListTail = n
            
Set ListTail.NextNode = Nothing
        
Else
        
End If
    
End If
Next

'按照xValue排序
    Set nI2 = ListHead
    
While Not nI2 Is Nothing
        
Set nI = nI2
        
Set nMax = nI2
        
While (Not nI Is Nothing And Not nI.NextNode Is Nothing)
    
        
If nI.xValue < nI.NextNode.xValue Then
            
Set nMax = nI.NextNode
        
End If
        
Set nI = nI.NextNode
        Wend
        
            
Dim tempV As Single

            tempV 
= nMax.xValue
            nMax.xValue 
= nI2.xValue
            nI2.xValue 
= tempV

            tempV 
= nMax.yMax
            nMax.yMax 
= nI2.yMax
            nI2.yMax 
= tempV

            tempV 
= nMax.kSubOne
            nMax.kSubOne 
= nI2.kSubOne
            nI2.kSubOne 
= tempV
        
        
        
Set nI2 = nI2.NextNode
    Wend
'---
'
输出当前链表到form2
While Not ListHead Is Nothing
    
Set n = ListHead
    
Set ListHead = ListHead.NextNode
    printText 
= Format(n.xValue, "###0.00"& "" & n.yMax & "" & Format(n.kSubOne, "###0.00"+ "    " + printText
    
Set n = Nothing
Wend
    Form2.Print 
Str(xLine) + "   " + printText
End Sub


Private   Sub Form_Activate()
Set n = New Node
= 0
= 0
For i = 1 To xMax + 1              '画方格
    Line (0, Y)-(xMax * grid, Y)
    Line (X, 
0)-(X, xMax * grid)
    X 
= X + grid
    Y 
= Y + grid
Next
For i = 1 To Vnumber
    Line (vx(i) 
* grid, vy(i) * grid)-(vx(i + 1* grid, vy(i + 1* grid), QBColor(12)
    
Print "p" & IIf((i + 1= 81, i + 1)
Next i
Vid 
= Text2
Label1(Vid 
- 1).ForeColor = QBColor(9)
Text1(
2 * Vid - 1).ForeColor = QBColor(9)
Text1(
2 * Vid - 2).ForeColor = QBColor(9)
End Sub


Private   Sub Form_Load()
Scale (
-ScaleWidth / 4, ScaleHeight - 200)-(ScaleWidth * 3 / 4 - 200-200)
vx 
= Array(Text1(0), Text1(2), Text1(4), Text1(6), Text1(8), Text1(10), Text1(12), Text1(0))
vy 
= Array(Text1(1), Text1(3), Text1(5), Text1(7), Text1(9), Text1(11), Text1(13), Text1(1))
End Sub


Private   Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Text1(Vid 
* 2 - 2= Round(X / grid): Text1(Vid * 2 - 1= Round(Y / grid)
End Sub


Private   Sub Text1_Change(Index As Integer)
Form1.Cls
DrawWidth 
= 1: X = 0: Y = 0
Text2 
= Int((Index + 1/ 2 + 0.5)
Vid 
= Text2
For i = 1 To xMax + 1 '画方格
    Line (0, Y)-(xMax * grid, Y)
    Line (X, 
0)-(X, xMax * grid)
    X 
= X + grid
    Y 
= Y + grid
Next
vx 
= Array(Text1(0), Text1(2), Text1(4), Text1(6), Text1(8), Text1(10), Text1(12), Text1(0))
vy 
= Array(Text1(1), Text1(3), Text1(5), Text1(7), Text1(9), Text1(11), Text1(13), Text1(1))
For i = 1 To Vnumber
    Line (vx(i) 
* grid, vy(i) * grid)-(vx(i + 1* grid, vy(i + 1* grid), QBColor(12)
    
Print "p" & IIf((i + 1= 81, i + 1)
Next i
End Sub


Private   Sub Text2_Change()
If Text2 < 1 Then Text2 = 1
If Text2 > Vnumber Then Text2 = Vnumber
For tt = 1 To Vnumber
Label1(tt 
- 1).ForeColor = QBColor(0)
Text1(
2 * tt - 1).ForeColor = QBColor(0)
Text1(
2 * tt - 2).ForeColor = QBColor(0)
Next
Vid 
= Text2
Label1(Vid 
- 1).ForeColor = QBColor(9)
Text1(
2 * Vid - 1).ForeColor = QBColor(9)
Text1(
2 * Vid - 2).ForeColor = QBColor(9)
End Sub


Private   Sub Command1_Click()
'For i = 1 To 12
'
    Call CreatLink(i)               '依次建立12条扫描线的AET
'
Next
End Sub


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一套专业的VB专业管理系统-包含源代码,使用说明: 1.软件所涉及的数据库分为四张表。 lesson kecheng zhuanye class 四张表所有操作均可在本程序中进行。 2.程序功能:a.班级、学期、专业及自由组合的查询。 b.编辑所有您能查询到的信息 。 c.数据库的备份与恢复。 3.程序启动时显示 专业-课程设置 信息浏览。 4.单击“数据查询”按纽进入查询界面,可以任意查询。如果相同专业相同学期的记录有不止一条程序将发出提示信息“数据冗余”并且弹出删除工具栏,您可以删除您想删除的记录。当然如果您双击数据列表控节同样会弹出删除工具栏,但您要慎重选择。误删的话会破坏记录中其他信息。程序同时提供了SQL语句查询的接口,但前提是您必须对数据库的结构特别了解。 5.本程序的课程查询与编辑模块采用的是同一个窗体,这样会减少系统资源的开销。这两个模块是不能同时运行的,您必须在关掉一个模块的情况下使用另一个模块。我们这样做是为了节省空间,使程序更小巧一些。 6.单击“课程管理”按钮将进入编辑界面。您可以按您查询的结果编辑课程,并切可以直接引用课程库中的课程信息。方法是:选定课程库中的记录,在文本框中双击即可自动添入。如果您要删除记录的话同样可以双击数据列表框弹出删除工具栏。 7.单击“专业管理”按钮将弹出登陆对话框,只要进行软件注册即可得到用户名与密码。赶快注册吧! 8.输入正确的用户名与密码后将进入其余三张表的编辑界面,完成编辑、添加、删除操作。单击专业列表的话同时显示本专业所开设的班级信息。 9.您可以通过数据库备份与恢复工具加强信息的安全保护。不过您要保证备份的数据库当前的状态是正确的。执行数据库恢复操作时,系统会将备份文件中将数据库复制到程序应用路径中,这一步将会使您的部分信息丢失,但是这样做可以挽救瘫痪的系统。 10.单击“软件简介”弹出本窗体,单击“关于我们”弹出和程序相关信息的窗体。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值