VisualFreeBasic游戏趣味编程_6.5_新圆半径最大化

2026-1-22 / 0 评论 / 41 阅读

为了进一步改进图案效果,在这一节中让生成的新圆半径尽量大。

rmin为圆的最小半径,rmax为圆的最大半径。首先在随机位置(x,y)处生成半径为rmin的圆,如果生成的新圆和之前已生成的圆相交,如图6-6中“1”处所示,则放弃该圆,重新随机生成。

如果生成的新圆和之前已生成的圆都不相交,如图6-6中“2”处所示,则不断增大新圆的半径,直至找到第一个与该圆相切的圆,或者达到rmax为止。

   While 圆的个数 < 100 '当圆的个数小于100时,循环运行
      isNewCircleOK = 0 ' 假设开始不OK
      While isNewCircleOK = 0 ' 当新生成的圆不OK时,重复生成新圆进行比较
         x = Int(Rnd *游戏W) '新圆的圆心x坐标
         y = Int(Rnd *游戏H) '新圆的圆心y坐标                '
         r = 圆的最小半径
         For i = 0 To 圆的个数 -1
            If isTwoCirclesIntersect(圆心x(i), 圆心y(i), 半径(i), x, y, r) Then Exit For ' 如果已有圆和新圆相交跳出循环,此时i<圆的个数
         Next
         If (i = 圆的个数) Then ' 如果上面for语句都不跳出,说明i等于circleNum
            isNewCircleOK = 1 ' 这个新生成的圆和已有圆都不相交
         End If
      Wend
      isNewCircleOK = 0 '  继续设为不OK,下面要让这个新圆的半径最大
      While isNewCircleOK = 0 And r < 圆的最大半径 ' 当不OK,并且新圆的半径小于最大半径时
         r += 1
         For i = 0 To 圆的个数 -1
            If isTwoCirclesIntersect(圆心x(i), 圆心y(i), 半径(i), x, y, r) Then
               isNewCircleOK = 1 ' 一旦和一个旧圆相交,这时新圆OK
               Exit For ' 因为新圆半径已经达到最大的情况,这时跳出循环
            End If
         Next
      Wend
      圆心x(圆的个数) = x '把新圆的圆心坐标添加到数组中
      圆心y(圆的个数) = y
      半径(圆的个数)  = r  '把新圆的半径添加到数组中
      圆的个数        += 1 '圆的个数+1
   Wend

程序运行后输出如图所示。

提示
While 条件 是一个条件循环语句,只要条件为真,那么一直循环,一直到条件为假才退出循环。

评论一下?

OωO
取消