ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4304|回复: 12

[求助] 有分求助!!!!!!!已知多边形顶点坐标,怎样才能判断出坐标(x,y)是否在多边形内

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-5-29 18:20 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:图像处理和GDI
以下坐标a,b,c,d,e依次连接成为一个五边形
a=(x1,y1)
b=(x2,y2)
c=(x3,y3)
d=(x4,y4)
e=(x5,y5)

求助,如何任意坐标(x,y)是否在五边形范围内

真心求助,有分分啊~~~

点评

知识树索引:12、13楼  发表于 2014-6-5 23:54

TA的精华主题

TA的得分主题

发表于 2014-5-29 18:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
该点的上下左右是否存在多边形的边

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-5-29 20:38 | 显示全部楼层
jsxjd 发表于 2014-5-29 18:46
该点的上下左右是否存在多边形的边

存在,只要在这个五边形的投影上,就算

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-5-29 20:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
jsxjd 发表于 2014-5-29 18:46
该点的上下左右是否存在多边形的边

存在,只要在这个五边形的投影上,就算

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-5-30 11:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
额,有没有老师帮帮我~

TA的精华主题

TA的得分主题

发表于 2014-5-30 15:34 | 显示全部楼层
xiapian89 发表于 2014-5-30 11:07
额,有没有老师帮帮我~

shape pointPointResult
XYXYin Shape
1934  
                                       
  
22
44

vba code:
  1. Private Const PI As Double = 3.1415926
  2. Private Type myPoint
  3.     x As Double
  4.     y As Double
  5. End Type

  6. Private Sub ReadPoints(ByRef p() As myPoint, ByRef detectP As myPoint)
  7.     Dim Arr
  8.    
  9.     Arr = Me.Range(Me.Range("B4"), Me.Range("C65536").End(xlUp))
  10.    
  11.     ReDim p(LBound(Arr) To UBound(Arr))
  12.     For i = LBound(Arr) To UBound(Arr)
  13.    
  14.         p(i).x = Arr(i, 1)
  15.         p(i).y = Arr(i, 2)
  16.    
  17.     Next
  18.     detectP.x = Me.Range("E4")
  19.     detectP.y = Me.Range("F4")
  20. End Sub
  21. Private Sub ExportResult(isInShape As Boolean)
  22.    
  23.     If isInShape Then
  24.         Me.Range("H3") = "in Shape"
  25.     Else
  26.         Me.Range("H3") = "not in Shape"
  27.     End If



  28. End Sub



  29. Public Sub Main()

  30.    

  31.     Dim p() As myPoint
  32.     Dim dp As myPoint
  33.    
  34.     ReadPoints p, dp
  35.    
  36.     Dim An() As Double
  37.     ReDim An(LBound(p) To UBound(p))
  38.    
  39.     Dim DeltaX As Double
  40.     Dim DeltaY As Double
  41.    
  42.     For i = LBound(p) To UBound(p)
  43.         DeltaX = p(i).x - dp.x
  44.         DeltaY = p(i).y - dp.y
  45.         An(i) = getAngle(DeltaX, DeltaY)
  46.     Next
  47.    
  48.    
  49.    
  50.     OrderAngle An
  51.     Dim isInShape As Boolean
  52.     isInShape = True
  53.     Dim mySum As Double
  54.     Dim Diff As Double
  55.     For i = LBound(An) To UBound(An) - 1
  56.         
  57.         Diff = An(i + 1) - An(i)
  58.         Debug.Print Diff
  59.         mySum = mySum + Diff
  60.         
  61.         If Diff > 180 Then
  62.         
  63.             isInShape = False
  64.             Exit For
  65.         Else
  66.             
  67.         End If
  68.         
  69.     Next
  70.    
  71.     If (360 - mySum) > 180 Then
  72.         isInShape = False
  73.     End If
  74.    
  75.     ExportResult isInShape
  76.    
  77.    
  78. End Sub
  79. 'get 0~360
  80. Private Function getAngle(DeltaX, DeltaY) As Double
  81.       
  82.    
  83.         
  84.     If DeltaX = 0 Then
  85.         If DeltaY > 0 Then
  86.             getAngle = 90
  87.         ElseIf DeltaY < 0 Then
  88.             getAngle = 270
  89.         Else
  90.             getAngle = -1
  91.             Debug.Print "meanless!"
  92.         End If
  93.         Exit Function
  94.     End If
  95.     Dim Result As Double
  96.     Result = ((Atn(DeltaY / DeltaX)) / (2 * PI)) * 360
  97.     '1
  98.     If DeltaX > 0 And DeltaY >= 0 Then
  99.         getAngle = Result
  100.         Exit Function
  101.     End If
  102.     '2
  103.     If DeltaX < 0 And DeltaY >= 0 Then
  104.         getAngle = 180 + Result
  105.         Exit Function
  106.     End If
  107.     '3
  108.     If DeltaX < 0 And DeltaY <= 0 Then
  109.         getAngle = 180 + Result
  110.         Exit Function
  111.     End If
  112.     '4
  113.     If DeltaX < 0 And DeltaY <= 0 Then
  114.         getAngle = 360 + Result
  115.         Exit Function
  116.     End If


  117. End Function
  118. Private Sub OrderAngle(Arr() As Double)

  119.     For i = LBound(Arr) To UBound(Arr) - 1
  120.         For j = i To UBound(Arr)
  121.             If Arr(i) > Arr(j) Then
  122.                 temp = Arr(i)
  123.                 Arr(i) = Arr(j)
  124.                 Arr(j) = temp
  125.             End If
  126.         Next
  127.     Next
  128.    

  129. End Sub

  130. Private Sub CommandButton1_Click()
  131.     Main
  132. End Sub
复制代码


在公司不能上传附件,只能用这样给。

也不确定对不对,
原理就是算出要侦测的点的到5角型点的角度,然后将角度排序,然后排序后的角度之间若有相差到180度以上,就判定是在shape外


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-2 15:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-6-2 16:29 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-6-5 10:41 | 显示全部楼层
treenewbee 发表于 2014-6-2 16:29
使用面积应该更方便一些吧

真的能更方便吗?怎么弄啊?

TA的精华主题

TA的得分主题

发表于 2014-6-5 12:43 | 显示全部楼层
本帖最后由 lolmuta 于 2014-6-5 12:51 编辑

我想他的意思是
若 五点的面积=要量的点到(五点按规则取二点)的三角形面积和
就表示在shape内。

这方法,我觉得难的地方是要如何判断要取那二点。
如果也是按角度来判断,那就跟我的相似了。

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-15 01:13 , Processed in 0.038251 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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