首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

用VB做计算机图形学扫描线种子填充定义的变量出有关问题

2012-01-20 
用VB做计算机图形学扫描线种子填充定义的变量出问题Private Type pointX As LongY As LongEnd TypeDim old

用VB做计算机图形学扫描线种子填充定义的变量出问题
Private Type point
X As Long
Y As Long
End Type

Dim oldP As point
Dim FirstP As point
Dim bFirst As Boolean
Dim result As Boolean


Dim xmin As Long, xmax As Long, ymin As Long, ymax As Long, ii As Long, jj As Long
Dim n, i, cnt As Integer
Dim polyarray() As point
Dim pt As point



’画多边形
Private Sub Command2_Click()
  Picture1.Cls
End Sub

Private Sub Picture1_DblClick()
  Picture1.Line (oldP.X, oldP.Y)-(FirstP.X, FirstP.Y)
  bFirst = True
  Line1.Visible = False
End Sub

Private Sub Form_Load()

  ReDim Preserve polyarray(1)
  cnt = 1
  bFirst = True
  Line1.Visible = False
  Picture1.AutoRedraw = True
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  ReDim Preserve polyarray(UBound(polyarray) + 1)
  polyarray(cnt).X = X
  polyarray(cnt).Y = Y
  cnt = cnt + 1

   
  If Button = 1 Then
  Line1.X1 = X
  Line1.Y1 = Y
  If bFirst = False Then
  Picture1.Line (oldP.X, oldP.Y)-(X, Y)
  Else
  bFirst = False
  Line1.Visible = True
  FirstP.X = X
  FirstP.Y = Y
  End If
  oldP.X = X
  oldP.Y = Y
  End If
End Sub


Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Line1.X2 = X
  Line1.Y2 = Y
End Sub

'画多边形结束

Friend Function IsInRegion(p As point, polyarray() As point) As Boolean '判断点在多边形
'变量定义
  ncross = 0
  n = UBound(polyarray)
  ReDim Preserve polyarray(n + 1)
  polyarray(n + 1).X = polyarray(0).X
  polyarray(n + 1).Y = polyarray(0).Y
  x0 = p.X: y0 = p.Y
   
  For i = 0 To n - 1
  X1 = polyarray(i).X: Y1 = polyarray(i).Y
  X2 = polyarray(i + 1).X: Y2 = polyarray(i + 1).Y
   
  If (((p.X >= X1) And (p.X < X2)) Or ((p.X >= X2) And (p.X < X1))) Then
  yt = Y1 + (p.X - X1) * (Y2 - Y1) / (X2 - X1) '求交点的纵坐标
  If (yt > y0) Then
  ncross = ncross + 1 '计算扫描线与多边形相交的次数
  End If
  End If
  Next i

  If ((ncross > 0) And ((ncross Mod 2) = 1)) Then '判断点是否在多边形内
  IsInRegion = True
  Else
  IsInRegion = False
  End If

End Function

’填充
Public Sub Command1_Click()

  xmin = polyarray(1).X: xmax = polyarray(1).X: ymin = polyarray(1).Y: ymax = polyarray(1).Y
  For i = 2 To cnt
  If polyarray(i).X < xmin Then xmin = polyarray(i).X
  If polyarray(i).Y < ymin Then ymin = polyarray(i).Y
  If polyarray(i).X > xmax Then xmax = polyarray(i).X
  If polyarray(i).Y > ymax Then ymax = polyarray(i).Y
  Next i

   
  For ii = ymin To ymax Step 150
  For jj = xmin To xmax Step 150
  pt.X = jj: pt.Y = ii
  result = IsInRegion(pt, polyarray)
  If result = True Then
  Picture1.PSet (pt.X, pt.Y), vbRed
  End If
  Next jj
  Next ii
End Sub


用VB做计算机图形学扫描线种子填充定义的变量出问题,上面程序红色部分的xmin、xmax等,还有ii 、jj在调试过程中总是显示0.求高手解决

------解决方案--------------------


ReDim Preserve polyarray(n + 1)
之后
polyarray(0 to n)可用polyarray(n+1)这个元素是不存在的
[解决办法]
cnt 与数组上界不一致,只改后面两处就能正确运行,不过分批 polyarray(0) 不用不够严密。

VB code
Option Base 1 '将数组下标默认设为1,就不会有 polyarray(0) 了'Private Sub Form_Load()    '初始可以为空'    'ReDim Preserve polyarray(1)    cnt = 0    ....End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)    '增长时要保持一致'    cnt = cnt + 1    ReDim Preserve polyarray(cnt)    polyarray(cnt).X = X    polyarray(cnt).Y = Y    .... 

热点排行