|
楼主 |
发表于 2014-10-10 20:38
|
显示全部楼层
正式版1.0的填充代码采用了更为通用的不同的算法,适应性更好,相关代码如下:
- Public Sub TianChong1() '凹凸通用填充
- With 多边形
- If .Range("a2").Value = "" Then MsgBox "请输入顶点数!", , "友情提示": Exit Sub
- If Not (IsNumeric(.Range("a2").Value)) Then MsgBox "请输入数值!", , "友情提示": Exit Sub
- If .Range("a14").Value = "" Then MsgBox "请输入随机点数!", , "友情提示": Exit Sub
- If Not (IsNumeric(.Range("a2").Value)) Then MsgBox "请输入数值!", , "友情提示": Exit Sub
- .Range("d18:e" & Rows.Count).ClearContents
- Dim xx, yy, x#, y#, X1#, Y1#, X2#, Y2#, a#, b#, i&, j&, k&, n%, m&, xmin#, xmax#, ymin#, ymax#, sjd, t!
- Dim ddxmin#, ddxmax#, ddymin#, ddymax#, jds%, jdx# '交点数
- n = .Range("a2").Value '顶点数
- m = .Range("a14").Value '随机点数
- xx = .Range("d2").Resize(n + 1)
- yy = .Range("e2").Resize(n + 1)
- Call DuoBianXing(xx, yy, n)
- t = Timer: k = 0
- xmin = WorksheetFunction.Min(xx): xmax = WorksheetFunction.Max(xx) '界定随机点产生的最大相关范围
- ymin = WorksheetFunction.Min(yy): ymax = WorksheetFunction.Max(yy)
- ReDim sjd(1 To m, 1 To 2) '存储符合要求的随机点
- j = 0
- Do While j < m
- 100:
- x = xmin + Rnd() * (xmax - xmin) '产生平面中的随机点
- y = ymin + Rnd() * (ymax - ymin)
- jds = 0
- k = k + 1
- For i = 1 To n
- X1 = xx(i, 1): Y1 = yy(i, 1)
- X2 = xx(i + 1, 1): Y2 = yy(i + 1, 1)
- If X1 < X2 Then
- ddxmin = X1: ddxmax = X2
- Else
- ddxmin = X2: ddxmax = X1
- End If
- If Y1 < Y2 Then
- ddymin = Y1: ddymax = Y2
- Else
- ddymin = Y2: ddymax = Y1
- End If
- If X1 = X2 And Y1 <> Y2 Then '边的方程为x=a时(垂直)
- If x > X1 And y > ddymin And y < ddymax Then jds = jds + 1
- ElseIf X1 <> X2 And Y1 <> Y2 Then '边的方程为y=ax+b时(倾斜)
- If x > ddxmin And y > ddymin And y < ddymax Then
- a = (Y2 - Y1) / (X2 - X1): b = (Y1 * X2 - Y2 * X1) / (X2 - X1) '边的斜率、纵截距
- jdx = (y - b) / a '交点横坐标
- If jdx < x Then jds = jds + 1 '交点在随机点的左侧时,因为是水平向左的射线
- End If
- '由于显示的特点,忽略随机点纵坐标等于顶点纵坐标的情况
- ElseIf X1 <> X2 And Y1 = Y2 Then '边的方程为y=b时(水平)
- '由于显示的特点,忽略随机点纵坐标等于顶点纵坐标的情况
- End If
- Next i
- If jds Mod 2 = 1 Then j = j + 1: sjd(j, 1) = x: sjd(j, 2) = y
- Loop
- .Range("d18").Resize(m, 2) = sjd
- End With
- MsgBox "共尝试落点" & k & "次,命中率:" & Format(m / k, "0.00%") & ",用时:" & Format(Timer - t, "0.0000") & "秒。", , "友情提示"
- End Sub
复制代码
|
|