看板Programming
标 题Re: [问题] 如何找出包含某点的所有矩形 ?
发信站成大计中BBS (Tue Apr 10 10:14:32 2007)
转信站ptt!ctu-reader!ctu-gate!news.nctu!news2!ccnews.ncku!nckubbs
※ 引述《[email protected] (天天都是好心情)》之铭言:
: 问题:
: 在有限的范围内(0,0)~(x,x) x为极大的数
: (0,0) ┌───→ x
: 在这个范围内有K的大小不一的矩形 及一个点 │
: │
: 请找出包含该点的所有矩形 │
: ↓
: y
: 我的想法:
: 一个矩形物件有4个值 分别为左上角X及Y作标 右下角X及Y座标
: 用暴力法比较 左上叫座标与 该点
: if (左上角X及Y作标皆小於该点){
: if (右下角X及Y座标 皆小於该点)
: 则点包含於该矩形
: }
: else { 点不包含於该矩形 }
: 虽然这是暴力法 不过时间复杂度只要 O(K)
: 但是似乎有方法可以更快 提示是 quadtree
你的矩形有特殊结构还是随机?
没有的话,顶多可以查一些计算几何的书,来处理点在矩形内的快速演算法。
若是你是在 Windows下用,有现成的 API可以判断。
我是看这本:
陈雪美 译,「快速 3D 绘图演算法」,初版,和硕科技文化,台湾,台北,1997/4。
周培德,「计算几何-算法分析与设计」,清华大学出版社,中国,广西。
书上的作法:
Private Enum enuDirection
Left = &H1
Right = &H2
Above = &H4
Below = &H8
End Enum
Public Function CheckPointInAreal(ByRef hPoint As cPoint, ByRef MinPoint As
cPoint, ByRef MaxPoint As cPoint) As Integer
' 传回值为 0 , 表示 hPoint 处於 MinPoint 与 MaxPoint 的矩形空间
'5|4|6
'-+-+-
'1|0|2
'-+-+-
'9|8|10
Dim tAreal As Integer
If hPoint.x < MinPoint.x Then
tAreal = tAreal Or enuDirection.Left
ElseIf hPoint.x > MaxPoint.x Then
tAreal = tAreal Or enuDirection.Right
End If
If hPoint.y < MinPoint.y Then
tAreal = tAreal Or enuDirection.Above
ElseIf hPoint.y > MaxPoint.y Then
tAreal = tAreal Or enuDirection.Below
End If
Return tAreal
End Function
--
______________________________________________________本版因有你们而壮大
T.L. Cheng 子琏
_______________________________________________________________________.
ASP.NET Web News Reader 0.2.3 Beta http://tlcheng.twbbs.org/News/Reader.aspx
新闻群组 RSS网志测试中 http://tlcheng.no-twbbs.org/News/rss2.aspx
BASIC/Fortran/WinHelp/WinAPI/NET/Hydroinfo. http://tlcheng.twbbs.org/wwwmap.htm
--
㊣Origin:《
成大计中 BBS 站 》[bbs.ncku.edu.tw] 来源:[59-127-4-39.HINET-IP.h]