ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 名课 - Power BI数据分析与可视化实战 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wtueprgw

[求助] EXCEL 表格 平行四边形内统计多少个点

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-10-19 14:16 | 显示全部楼层
microyip 发表于 2016-10-19 12:07
题目明明写这“平行四边形”

平行四边形是四边形的特例,既然满足任意凸四边形(下图所谓两三角形)范围的落点判定,自然就满足了平行四边形的要求,意思是超出了楼主的要求
QQ截图20161019141524.jpg

TA的精华主题

TA的得分主题

发表于 2016-10-19 14:37 | 显示全部楼层
hhjjpp 发表于 2016-10-19 14:16
平行四边形是四边形的特例,既然满足任意凸四边形(下图所谓两三角形)范围的落点判定,自然就满足了平行 ...

凸四边形,但不一定是顶点的5点组成的四边形,现状不固定喔,很难说散点一定在不在四边形里喔,可以说在也可以不在哦。

TA的精华主题

TA的得分主题

发表于 2016-10-19 15:32 | 显示全部楼层
microyip 发表于 2016-10-19 14:37
凸四边形,但不一定是顶点的5点组成的四边形,现状不固定喔,很难说散点一定在不在四边形里喔,可以说在 ...

随便试试,随便改坐标数据就可知效果

TA的精华主题

TA的得分主题

发表于 2016-10-19 20:05 | 显示全部楼层
hhjjpp 发表于 2016-10-19 15:32
随便试试,随便改坐标数据就可知效果

如果有边和Y轴平行,你的TREND就会返回错误的数据。因为没有对应的Y值。
另外 这个公式也无法区分点在线上的情况。

=IF(C14,AND(MEDIAN(TREND(D$6:D$7,C$6:C$7,C14),TREND(D$8:D$9,C$8:C$9,C14),D14)=D14,MEDIAN(TREND(D$7:D$8,C$7:C$8,C14),TREND(D$9:D$10,C$9:C$10,C14),D14)=D14),"")
TREND在这个公式里的作用就是:生成经过指定两点的直线方程式,然后求出这个直线上指定X坐标对应的Y坐标。
MEDIAN为求中值的公式,作用是判断点的Y坐标是否在两边与经过该点的竖线的两个交点之间,如图。
整个公式意思:需要判断的点分别在两组对边的中间即为在四边形内,即:
F 与B、E点
F 与C、D点
如果F在B、E点之间且在C、D点之间则为在内。
有兴趣可以自己分析下要判断的点如果在五个不同区域时的情况就能理解了。 QQ截图20161019195513.png


如果边与Y轴平行 则公式失效。
QQ截图20161019200457.png

TA的精华主题

TA的得分主题

发表于 2016-10-19 23:53 | 显示全部楼层
本帖最后由 microyip 于 2016-10-19 23:59 编辑
  1. Sub 计算()
  2. Dim iDataSlope As Double, iStartSlope As Double, iEndSlope As Double
  3. Dim vDot As Variant, iDot As Integer, vDataDot As Variant, iDataDot As Integer
  4. Dim bIn As Boolean, vInout As Variant

  5. vDot = [C6:D10].Value
  6. vDataDot = [C14].Resize([C65536].End(xlUp).Row - 13, 2).Value
  7. ReDim vInout(1 To UBound(vDataDot), 1 To 1)

  8. For iDataDot = 1 To UBound(vDataDot)
  9. bIn = True
  10. For iDot = 2 To 4
  11. iDataSlope = 斜率弧度(Val(vDot(iDot, 1)), Val(vDot(iDot, 2)), Val(vDataDot(iDataDot, 1)), Val(vDataDot(iDataDot, 2))) '顶点到散点的射线
  12. iStartSlope = 斜率弧度(Val(vDot(iDot, 1)), Val(vDot(iDot, 2)), Val(vDot(iDot - 1, 1)), Val(vDot(iDot - 1, 2))) '顶点到上一个定点的射线边
  13. iEndSlope = 斜率弧度(Val(vDot(iDot, 1)), Val(vDot(iDot, 2)), Val(vDot(iDot + 1, 1)), Val(vDot(iDot + 1, 2))) '顶点到下一个定点的射线边
  14. iEndSlope = iEndSlope - (iEndSlope < iStartSlope) * Application.Pi() * 2 '如果第二条边的斜率弧度小于第一条边的斜率弧度,以转一圈的弧度计算
  15. bIn = bIn And iDataSlope >= iStartSlope And iDataSlope <= iEndSlope
  16. Next
  17. vInout(iDataDot, 1) = IIf(bIn, "In", "Out")
  18. Next
  19. [E14].Resize(UBound(vInout), 1) = vInout
  20. End Sub

  21. Function 斜率弧度(iStartX As Double, iStartY As Double, iEndX As Double, iEndY As Double) As Double
  22. If iStartX = iEndX Then
  23. If iStartY = iEndY Then
  24. 斜率弧度 = 0
  25. ElseIf iStartY < iEndY Then
  26. 斜率弧度 = Application.Pi() / 2
  27. Else
  28. 斜率弧度 = Application.Pi() * 3 / 2
  29. End If
  30. Else
  31. 斜率弧度 = Atn((iEndY - iStartY) / (iEndX - iStartX)) - (iEndX - iStartX < 0) * Application.Pi() + (iEndX - iStartX > 0) * (iEndY - iStartY < 0) * Application.Pi() * 2
  32. End If
  33. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2016-10-19 23:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 microyip 于 2016-10-19 23:59 编辑

附上附件以供参考

公司任务(By.Micro).rar

18.11 KB, 下载次数: 13

TA的精华主题

TA的得分主题

发表于 2016-10-20 08:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
计算有多少个点落入多边形V1.rar (19.72 KB, 下载次数: 11)

点在线上也算在四边形内。坐标最多两位小数。

  1. Private Type POINTAPI
  2.         X As Long
  3.         Y As Long
  4. End Type
  5.     Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  6.     Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long
  7.     Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
  8. Function aa(R As Range, X As Range, Y As Range)
  9.     Dim P(3) As POINTAPI
  10.     P(0).X = R.Range("A1") * 100: P(0).Y = R.Range("B1") * 100
  11.     P(1).X = R.Range("A2") * 100: P(1).Y = R.Range("B2") * 100
  12.     P(2).X = R.Range("A3") * 100: P(2).Y = R.Range("B3") * 100
  13.     P(3).X = R.Range("A4") * 100: P(3).Y = R.Range("B4") * 100
  14.     Dim Rgn As Long
  15.     Rgn = CreatePolygonRgn(P(0), 4, 1)
  16.    
  17.     If Rgn <> 0 Then
  18.         If PtInRegion(Rgn, X * 100, Y * 100) > 0 Then
  19.             aa = 1
  20.         Else
  21.             aa = 0
  22.         End If
  23.         DeleteObject Rgn
  24.     Else
  25.         aa = "#ERROR"
  26.     End If
  27. End Function
复制代码



TA的精华主题

TA的得分主题

发表于 2016-10-20 08:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
crazy0qwer 发表于 2016-10-20 08:04
点在线上也算在四边形内。坐标最多两位小数。

你这是算什么呀,没看懂,请指教

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-20 08:45 | 显示全部楼层

多谢大神,这段代码完美解决了我的问题,哈哈哈

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-10-20 08:46 | 显示全部楼层
crazy0qwer 发表于 2016-10-20 08:04
点在线上也算在四边形内。坐标最多两位小数。

感谢,不过,VBA提示我这个事64位的,运行出错,不知道怎么改,还行要感谢你的帮助,谢谢!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-25 02:55 , Processed in 0.027087 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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