找回密码
 点一下
查看: 3545|回复: 16

发个可以获取三角形区域的函数

[复制链接]
发表于 2011-9-13 01:00:36 | 显示全部楼层 |阅读模式
暴雪的函数里头只能获取矩形和圆形或者两者相加的区域,所以弄了个获取三角区域,传入三角形三个点和像素大小就可以获取了,其实是把这个三角形分成一个个像素然后加起来,像素越小计算越多,不过会越精确,下图三个雷兽组成的三角形是禁区,凤凰进入后会被杀掉,可以改变像素大小则发现精度差异,相信很快有人会做出多边形来的了
OD(M${J2A5V8)[RM0_SIP`0.jpg
GetTriangleArea.SC2Map (50 KB, 下载次数: 25)
发表于 2011-9-13 01:10:35 | 显示全部楼层
过高的运算没有意义,这个完全可以用计算坐标的方式实现,j下早就有实现方式了……
回复

使用道具 举报

发表于 2011-9-13 08:36:18 | 显示全部楼层
一个点在三点构成的三角形内,这个貌似数学上的直接坐标系的一个灰长简单的算法吧
回复

使用道具 举报

发表于 2011-9-13 09:47:07 | 显示全部楼层
SC2中,区域的作用比在war3中要大很多,比如可以选取区域内单位生成单位组,也可以将区域附着到单位。

相对来说,判断一个单位是否在三角形区域内的话,使用计算坐标方便一些;而选取区域内所有单位时,有一个形状符合的区域会更方便一些。
回复

使用道具 举报

发表于 2011-9-13 10:24:03 | 显示全部楼层
这个要考虑地图总体单位数量了吧……效率上大约也是运行层面的差别……这个要根据自己的地图来选择,不过sc2e的区域功能其实不错,否则我的某系统麻烦多了
回复

使用道具 举报

发表于 2011-9-13 10:43:48 | 显示全部楼层
没错,选择适合自己的功能!
回复

使用道具 举报

 楼主| 发表于 2011-9-13 12:45:35 | 显示全部楼层

回 2楼(沧海流星) 的帖子

判断点是否在三点形成的区域里面是有的,但是没有返回区域。
回复

使用道具 举报

 楼主| 发表于 2011-9-13 12:59:43 | 显示全部楼层
凹多边形怎么割。。。
回复

使用道具 举报

发表于 2011-9-13 13:28:52 | 显示全部楼层

未命名.JPG

在凹多边形内随机选择一点,连接所有可见的多边形的顶点,将形成的三角形切去;然后在新生成的凹多边形内继续任选一点,继续切割。

最终会实现的...
回复

使用道具 举报

发表于 2011-9-13 13:51:11 | 显示全部楼层
话说
[codes=galaxy]
    fixed k_a=(y_b-y_c)/(x_b-x_c);
    fixed k_b=(y_c-y_a)/(x_c-x_a);
    fixed k_c=(y_b-y_a)/(x_b-x_a);
[/codes]
这句会出bug的呀。
回复

使用道具 举报

 楼主| 发表于 2011-9-13 15:12:17 | 显示全部楼层

回 9楼(cccty1l) 的帖子

额,我错了,我改正去,改用dx和dy就没有分母了。。。额,改好了,之前的点向外扩张1个interval,应该是0.5个interval的,但是怕由于计算误差导致有缝隙所以用0.51个interval向外扩张了。。
回复

使用道具 举报

 楼主| 发表于 2011-9-13 15:45:15 | 显示全部楼层

回 8楼(cccty1l) 的帖子

这样子判断这点是否能不穿越其它点连起来的线会比较难。。。
我想到个法子是:选择所有锐角点(好像小于180就可以了),然后切掉这个点带的三角形,然后再选择所有锐角点再切掉,因为多边形总有锐角(好像是的 ),所以可以切完,但是判断夹角是否对着区域内有问题,貌似先规定一个中心可以解决判断角是否可以切。。。。。
回复

使用道具 举报

发表于 2011-9-13 15:50:10 | 显示全部楼层
你的意思是小于180°的角吧?
回复

使用道具 举报

 楼主| 发表于 2011-9-13 15:55:38 | 显示全部楼层
恩,是的,不过切锐角好像漂亮点。。。
回复

使用道具 举报

 楼主| 发表于 2011-9-13 16:01:28 | 显示全部楼层
不知道怎么告诉计算机哪个角能切。。。。
回复

使用道具 举报

发表于 2011-9-13 16:20:27 | 显示全部楼层
这样的方式还不如做行扫描有效率吧……
确定分辨率后,获取全部边(线段的方程)以及边连接两个定点的y轴坐标,然后比对所有定点获取x,y轴的最大最小值,由这四个值就可以获得包含此多边形的最小矩形。
从每个x轴方向的行遍历,判断每个点(最小区域)为端点,向x轴方向做射线与所有边交点的个数,如果为奇数,就是多边形内部的区域。
判断交点存在的方法是,比较比对点的y轴坐标是否在边两个端点y轴坐标之间,然后依据直线坐标公式,由比较点y轴坐标求出对应的x轴坐标,比较大小,如果从x轴坐标值从小到大遍历,那么求出x坐标小于比较点x坐标,就是相交。
其实可以用遍历y坐标的方式批量处理,对应一个y轴值获取全部与边的交点,然后添加有效部分线段内的点即可
回复

使用道具 举报

 楼主| 发表于 2011-9-13 16:39:47 | 显示全部楼层

回 15楼(疯人¢衰人) 的帖子

很强大。。。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 13:08 , Processed in 0.408696 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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