找回密码
 点一下
查看: 834|回复: 10

如何获取指定角度中一条直线上的所有单位

[复制链接]
发表于 2015-1-27 07:25:45 | 显示全部楼层 |阅读模式
一条指定角度、指定宽度、指定长度的直线上的 所有单位,应该怎么获取?
发表于 2015-1-27 13:33:14 | 显示全部楼层
本帖最后由 yxxiaobin 于 2015-1-29 13:14 编辑

你的问题实际上是任意矩形,而不是直线。
用数学的思考方法,最终可以转换成这样一个命题:平面内,如何判定一个点在一个任意矩形内。
其实这不只一个实现方案,简单介绍一种:
首先选取足够大范围内的单位,如何做到足够大,又尽量不浪费,且实现方法简单呢?为待选取的矩形做一个外接圆,这个圆的范围就很合适。圆的做法:以从起始点向指定角度发射的射线上截取矩形长度/2的距离,截点为圆心,矩形对角线长/2为半径画圆。选取这个圆范围内的所有单位,然后判定这些单位的位置点是在矩形内还是矩形外,又或者是正好在矩形的边上(这种可能性几乎为0)。如果你的矩形长宽差距悬殊,特别的细长或横宽,那么用外接圆就不是很理想,因为浪费太多。此时最好的方法就是用一串圆形做选取,然后再判定所选单位的位置点是否在矩形区域内。
如何判定某单位的位置点是否在矩形区域内呢?一个很直观的判断方法如下图所示:
1.jpg
我们将出发点作为原点,记做O,矩形的长等于OP,矩形的宽等于DC。α是矩形长相对于x轴的夹角,如果点A在矩形内,则必定满足从A到C的角度 - α>0且<90,且,从D到A的角度 - α>90且<180,且,从O到A的角度 - α>270或<90。以上计算均需要将原始数据级结果中的负角度转换成正角度,比如-90度转换成270度。

点评

这个方案比之前每0.1距离选取一遍圆形精确,另外怎么算出A到DC或者OP线上最近的点?  详情 回复 发表于 2015-1-28 03:20
回复

使用道具 举报

发表于 2015-1-27 20:04:11 | 显示全部楼层
直接用数据的方式(效果+验证器)获取也是可以的
以前有相关的帖子

点评

数据的话只能近似模拟吧。毕竟sc2原生是不支持任意矩形的,数据中的矩形都是用若干个圆模拟的。  详情 回复 发表于 2015-1-28 01:12
回复

使用道具 举报

发表于 2015-1-28 01:12:49 | 显示全部楼层
疯人¢衰人 发表于 2015-1-27 20:04
直接用数据的方式(效果+验证器)获取也是可以的
以前有相关的帖子

数据的话只能近似模拟吧。毕竟sc2原生是不支持任意矩形的,数据中的矩形都是用若干个圆模拟的。
回复

使用道具 举报

 楼主| 发表于 2015-1-28 03:20:31 | 显示全部楼层
yxxiaobin 发表于 2015-1-27 13:33
你的问题实际上是任意矩形,而不是直线。
用数学的思考方法,最终可以转换成这样一个命题:平面内,如何判 ...

这个方案比之前每0.1距离选取一遍圆形精确,另外怎么算出A到DC或者OP线上最近的点?

点评

垂足最近呀。  详情 回复 发表于 2015-1-28 23:51
回复

使用道具 举报

发表于 2015-1-28 15:51:49 | 显示全部楼层
本帖最后由 疯人¢衰人 于 2015-1-28 15:53 编辑
yxxiaobin 发表于 2015-1-28 01:12
数据的话只能近似模拟吧。毕竟sc2原生是不支持任意矩形的,数据中的矩形都是用若干个圆模拟的。

平行的直线是可以实现的
两边的封口作为直线的也能实现
不过要麻烦很多
http://bbs.islga.org/read-htm-tid-1104789-page-1-fpage-1.html

点评

果然,用这个方法是能用纯数据实现任意矩形区域的。说实在的,这个想法真的很别致,需要灵光一闪才行呀。  详情 回复 发表于 2015-1-29 13:00
回复

使用道具 举报

发表于 2015-1-28 16:13:22 | 显示全部楼层
据说3.0就会有矩形搜索了……但是我估计3.0今年都出不来。
回复

使用道具 举报

发表于 2015-1-28 23:51:03 来自手机 | 显示全部楼层
撕心裂蛋 发表于 2015-1-28 03:20
这个方案比之前每0.1距离选取一遍圆形精确,另外怎么算出A到DC或者OP线上最近的点?

垂足最近呀。

点评

比如要求出A到DC最短的线,那么角度就是和OP一样,但是距离如何求出  详情 回复 发表于 2015-1-29 00:19
回复

使用道具 举报

 楼主| 发表于 2015-1-29 00:19:15 | 显示全部楼层

比如要求出A到DC最短的线,那么角度就是和OP一样,但是距离如何求出

点评

两个都是直线方程,求交点坐标,最直接的方法就是解二元一次方程组。将这两个直线方程列成方程组,求方程组解,则x和y的值就是交点的坐标。  详情 回复 发表于 2015-1-29 12:31
回复

使用道具 举报

发表于 2015-1-29 12:31:04 | 显示全部楼层
本帖最后由 yxxiaobin 于 2015-1-29 13:16 编辑
撕心裂蛋 发表于 2015-1-29 00:19
比如要求出A到DC最短的线,那么角度就是和OP一样,但是距离如何求出


两个都是直线方程,求交点坐标,最直接的方法就是解二元一次方程组。将这两个直线方程列成方程组,求方程组解,则x和y的值就是交点的坐标。
另外一个取巧的方法如下:过A做x轴的垂线,交OP与点E,则点E的x坐标和点A相同,将此x代入OP的方程,可求得点E的y坐标,由此可得EA的长度,EA和OP的夹角是已知的,根据三角函数很容易求得AB和EB的长度。E的坐标已求得,OE的长度就可直接获得,在加上EB的长度就是OE的长度,让OP的长度减去OE的长度,则得EP的长度,该长度等同于点A到DC的距离。至此,点A到两条直线的距离就都得出了。

如果你需要得出点A到两条直线的距离,还有一种判定方法更直观:点A到OP距离的绝对值小于DC长的一半,点A到DC距离的绝对值大于0而小于OP的长。
回复

使用道具 举报

发表于 2015-1-29 13:00:20 | 显示全部楼层
本帖最后由 yxxiaobin 于 2015-1-29 13:08 编辑
疯人¢衰人 发表于 2015-1-28 15:51
平行的直线是可以实现的
两边的封口作为直线的也能实现
不过要麻烦很多


果然,用这个方法是能用纯数据实现任意矩形区域的。说实在的,这个想法真的很别致,需要灵光一闪才行呀。

另外,在此基础上可做优化如下:先做矩形外接圆,选取圆内的单位,然后在用矩形判定。这样效率会高一些。外接圆的做法我在最上一个回复中有描述,那个做法同样适用于数据版。
当然,对于特别细长(或横宽)的矩形,外接圆也会很浪费,此时可以选择像末日炮塔那样的方法用叠加圆先选一遍,然后在用矩形判定的方法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-10-5 22:14 , Processed in 0.043237 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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