ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: yzli007

[求助] 判断点是否在自由曲线(大量边的多边形)内

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-8-18 12:34 | 显示全部楼层
本帖已被收录到知识树中,索引项:其他结构和算法
蓝桥玄霜 发表于 2016-8-18 09:25
最前面的Dim语句中是否漏抄了Crr

第二句dim有写。有些不太明白。

判断点是否在自由曲线内.zip

114.17 KB, 下载次数: 24

TA的精华主题

TA的得分主题

发表于 2016-8-18 15:04 | 显示全部楼层
liucqa 发表于 2016-8-12 21:26
百度 判断一个点是否在多边形内部

恭请老师移步帮忙解决一下:
http://club.excelhome.net/thread-1296101-1-1.html

TA的精华主题

TA的得分主题

发表于 2016-8-18 16:06 | 显示全部楼层
捕获.PNG 判断点是否在自由曲线内.rar (50.25 KB, 下载次数: 67)

  1. Type Point
  2. x As Double
  3. y As Double
  4. End Type
  5. Public Sub GetStdLine(ps As Point, pe As Point, ByRef a As Double, ByRef b As Double, ByRef c As Double)
  6. '根据两个点的坐标求经过两点的直线的标准方程参数A、B、C
  7. Dim xs As Double, ys As Double, xe As Double, ye As Double
  8. xs = ps.x: ys = ps.y: xe = pe.x: ye = pe.y
  9. Dim p1 As Double, p2 As Double
  10. p1 = xs * ye: p2 = xe * ys
  11. If (p1 = p2) Then
  12.     If (xs = 0) Then
  13.         If (xe = 0) Then
  14.             a = 1: b = 0: c = 0
  15.         ElseIf (ys = 0) Then
  16.             a = ye: b = -xe: c = 0
  17.         End If
  18.     ElseIf (ye = 0) Then
  19.         If (ys = 0) Then
  20.             a = 0: b = 1: c = 0
  21.         ElseIf (xe = 0) Then
  22.             a = -ys: b = xs: c = 0
  23.         End If
  24.     End If
  25. Else
  26.     a = (ys - ye) / (p1 - p2): c = 1
  27.     If (ys = 0) Then
  28.         If (ye = 0) Then
  29.             b = 1: c = 0
  30.         Else
  31.             b = -(a * xe + 1) / ye
  32.         End If
  33.     Else
  34.         b = -(a * xs + 1) / ys
  35.     End If
  36. End If
  37. End Sub

  38. Public Function InPoly(poly() As Point, p As Point) As Boolean
  39. '判断点是否在多边形内部
  40. Dim i As Integer, f As Integer, xi As Double
  41. Dim a As Double, b As Double, c As Double
  42. Dim ps As Point, pe As Point
  43. For i = 0 To UBound(poly)
  44.     ps = poly(i)
  45.     If (i < UBound(poly)) Then pe = poly(i + 1) Else pe = poly(0)
  46.     GetStdLine ps, pe, a, b, c
  47.     If (a <> 0) Then
  48.         xi = -(b * p.y + c) / a
  49.         If (xi = p.x) Then
  50.             InPoly = True: Exit Function
  51.         ElseIf (xi < p.x) Then
  52.             f = f + Sgn(pe.y - p.y) - Sgn(ps.y - p.y)
  53.         End If
  54.     End If
  55. Next i
  56. InPoly = (f <> 0)
  57. End Function
  58. Public Function IsIn(Sx As Range, Sy As Range, x As Range, y As Range)
  59. Dim poly() As Point, p As Point, i As Integer, Xx, Yy
  60. Dim arr(), j As Long
  61. Xx = WorksheetFunction.Transpose(Sx): Yy = WorksheetFunction.Transpose(Sy)
  62. ReDim poly(0 To UBound(Xx) - 1)
  63. For i = 0 To UBound(Xx) - 1
  64.     poly(i).x = CDbl(Xx(i + 1)): poly(i).y = CDbl(Yy(i + 1))
  65. Next i
  66. For i = 1 To x.Columns(1).Cells.Count
  67.     p.x = CDbl(x.Cells(i, 1)): p.y = CDbl(y.Cells(i, 1))
  68.     If InPoly(poly, p) Then
  69.         ReDim Preserve arr(1, j)
  70.         arr(0, j) = p.x: arr(1, j) = p.y
  71.         j = j + 1
  72.     End If
  73. Next
  74. IsIn = arr
  75. End Function
  76. Sub main()
  77. Dim dd
  78. dd = WorksheetFunction.Transpose(IsIn([g3:g113], [h3:h113], [b3:b490], [c3:c490]))
  79. Range("d:e").ClearContents
  80. Range("d3").Resize(UBound(dd), 2) = dd
  81. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2016-8-19 08:47 | 显示全部楼层
在sub zhx()的过程中第一个dr(j,3)抄错了,错为cr(j,3)
请见附件。

判断点是否在自由曲线内0819.rar

110.88 KB, 下载次数: 77

TA的精华主题

TA的得分主题

发表于 2016-8-19 10:56 | 显示全部楼层
蓝桥玄霜 发表于 2016-8-19 08:47
在sub zhx()的过程中第一个dr(j,3)抄错了,错为cr(j,3)
请见附件。

谢谢大师耐心指导,复制代码漏改没对出来。代码还需消化。谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-23 18:34 | 显示全部楼层
本帖最后由 yzli007 于 2016-8-23 18:38 编辑
蓝桥玄霜 发表于 2016-8-17 08:51
我的思路是:
1,先计算多边形范围边界的最大值,从而排除大量的范围外数据;
2,判断通过B列x值的垂直线 ...

"求得比x小的G列的所有值,然后按降序排序,
从最大的开始判断,如果它的相邻点的值大于x的话,表示x垂直线与这两点组成的直线相交,并可求得其交点的坐标值"老师提到的“如果它的相邻点的值大于x的话“,求得的就是比X小的G列的所有值,相邻点的值怎么可能大于X呢?不太明白,请老师指点

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-23 18:48 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-8-24 10:39 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-8-24 11:32 | 显示全部楼层
请见附件。

判断点是否在自由曲线内0819.rar

110.5 KB, 下载次数: 99

TA的精华主题

TA的得分主题

发表于 2016-9-17 13:42 | 显示全部楼层
本帖最后由 ebkzxcel 于 2016-9-17 13:45 编辑

请问如果有个点刚好在多边形某条边的延伸线上而不在多边形范围中,是否能识别出不在范围内?

QQ截图20160917134451.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-12 23:41 , Processed in 0.026934 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表