找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1662|回复: 11

[研讨] 判断某点是否在封闭曲线之内——lineGirl碰撞算法讨论

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-20 22:16:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×


  核心提示:lineGirl游戏是一类画线游戏,游戏方法是在一幅图上画线'圈地',如果画线未封闭之前被怪碰到则回到起点并失去生命一次.目标是在生命全部失去前圈够足够百分比的'地'.闪客帝国上有朋友做过此游戏,点击...
lineGirl游戏是一类画线游戏,游戏方法是在一幅图上画线"圈地",如果画线未封闭之前被怪碰到则回到起点并失去生命一次.目标是在生命全部失去前圈够足够百分比的"地".闪客帝国上有朋友做过此游戏,点击进入游戏"天蚕变之希望篇"
这里仅就其中怪物碰撞到已划定的"地"反弹回来的算法简单讨论一下.
怪物碰到"地"被反弹,如果将"地"看作一封闭曲线,那么问题转变为判断怪是否进入封闭曲线,如果进入则被反弹(弹出曲线外).再进一步抽象,把怪看作一个质点(事实上应该把怪的四边看作四个质点,任一个进入封闭曲线后即被反弹,但这里不影响核心算法),那么问题转变为如何判断某点是否在封闭曲线内.
明确了核心算法后就可以开始用数学方法讨论了,不过别担心,我不会写公式的:)
首先看看一般情况,请看下图(见图一):
0.jpg
图一:一般情况判断某点是否在封闭曲线内.
如图所示,A点在曲线S内,那么可以证明,由A点作任一方向的射线,该射线与曲线边的交点有奇数个.而相反如果在曲线S外,如点B,则交点有偶数个.这个定理很好理解,这里不作多述.
好了,明确了这条定理后我们就有方向了,考虑一下lineGirl类型的游戏中所画的封闭曲线并不是任意的,而是只有直角的,线条只有水平和竖直两种,那么我们可以把射线方向确定一下,比如限定为水平方向,如下图所示(见图二):
1.jpg
图二:直角多边形(曲线)中判断某点是否在其内.
如上图,问题关键是:如何判断某点(比如A点,它在S内)是否在曲线S内呢?这里我们必段假定曲线是已知的,也就是曲线上各顶点坐标已知,且各点连接顺序已知,我们观察一下S的特点可以发现,如果A点纵坐标在某一段竖直线段两个端点坐标纵坐标之间,比如CD线段,那么与该线段必有一个交点(即交点1).否则则没有交点,比如线段AB.根据顶点顺序可以顺次查找符合条件的线段(两端点必为相邻顶点),如果总线段数为奇数,则该点在S内.
另外,对于点是否在线上可以单列出来首先判断,虽然可以把在线上作为一种在曲线内的特殊情况,但是单列出来也不会太麻烦,而且代码可能更清晰.这都不是问题.
有了以上两种一般情况的铺垫,下面我们可以很容易地解决lineGirl中的实际问题了.这是因为在实际制作游戏过程中我们可以使用二维数组.
稍微解释一下如何使用二维数组来构造游戏:
我们控制人物移动和怪物移动的最小单位为某一定值,这样就可以以该值为最单位将场景分为若干小块,每一小块都是二维数组中的一个元素."圈地"就抽象为在二维数组中作标记,标记越多"地"也图得越多.而且计算"圈地"的百分比也较容易.
在数组下讨论判断就更容易了,如下图(见图三):
2.jpg
图三:数组情况下对于封闭曲线的判断.
点A在曲线内,每一方格代表一个数组元素,人物移动的最小长度就是方格的边长.以A为端点作水平射线也就是取出A点所代表的数组元素中的同行脚码比A小的元素,如图所示,一共有三个交点.观察一下这三个交点可以发现这样的判断规律:交点左右一边是未圈中地(即在曲线外),另一边是圈中地(即在曲线内),由于不存在"曲线上",所以我们只要数清楚这样的前一元素是未圈中地/圈中地,后一元素是圈中地/未圈中地的个数就可以了,更进一步,圈中地和未圈中地把射线分为了若干段,比如A的射线分为了两段属于圈中地,两段属于未圈中地,如果未圈中地的段数为偶数段,则点A在曲线内(圈中地内),反之如果为奇数则在圈中地外.
以上判断算法可纯算作个人笔记,因为我还没有去做一个DEMO,有朋友正在做,所以只是一点儿意见而已.不对之处希听指正.


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2016-6-21 08:17:02 | 显示全部楼层
N版,快弄成lisp吧!!!

点评

这个就是 射线法吧,论坛有的。  详情 回复 发表于 2016-6-21 08:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2016-6-21 08:30:42 | 显示全部楼层
WhoCanSay 发表于 2016-6-21 08:17
N版,快弄成lisp吧!!!

这个就是 射线法吧,论坛有的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2016-6-22 08:24:38 | 显示全部楼层
newer 发表于 2016-6-21 08:30
这个就是 射线法吧,论坛有的。

对于同一封闭图形,使用BOUNDARY有时成功,有时不成功,即使图形放大也是这样。说明BOUNDARY可能不是射线法。我怀疑(当然没有任何根据)是取屏上各点颜色来判断的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2016-6-24 09:20:56 | 显示全部楼层
newer 发表于 2016-6-21 08:30
这个就是 射线法吧,论坛有的。

应该与你说的射线法,我找出来改了改

  1. ;;164.43 [功能] 判断点是否在曲线内(射线法)
  2. ;;线内T 线上0 线外nil
  3. ;;(InCurve (setq pt (getpoint)) (setq e (car (entsel))))
  4. (DEFUN InCurve (pt e / _EntmakeXlineX FLAG i TMPRAY)
  5.   (defun _EntmakeXlineX        (pt)
  6.     (entmakeX (list '(0 . "XLINE")
  7.                     '(100 . "AcDbEntity")
  8.                     '(100 . "AcDbXline")
  9.                     (cons 10 pt)
  10.                     (cons 11 '(1 0 0))
  11.               )
  12.     )
  13.   )
  14.   (IF (EQUAL pt (VLAX-CURVE-GETCLOSESTPOINTTO e pt) 1E-6)
  15.     0        ;在线上
  16.     (PROGN
  17.       (SETQ e (VLAX-ENAME->VLA-OBJECT e))
  18.       (SETQ TmpRay (VLAX-ENAME->VLA-OBJECT (_EntmakeXlineX pt)))
  19.       (SETQ pt (VLAX-3D-POINT pt))
  20.       (SETQ i 0)
  21.       (setq Flag T)      
  22.       (while (and (/= 180 i) Flag)       
  23.         ;;如果Flag 为nil或者长度为3,则结束;
  24.         (if (and (setq Flag (VLAX-INVOKE e 'INTERSECTWITH TmpRay ACEXTENDNONE))
  25.                  (/= (LENGTH Flag) 3)
  26.             )
  27.           (progn (setq i (+ i 15)) (VLA-ROTATE TmpRay pt (/ PI 15)));采用12度
  28.           (setq Flag nil)
  29.         )
  30.       )
  31.       (VLA-DELETE TmpRay)
  32.       (if Flag T)
  33.     )
  34.   )
  35. )


点评

黄大师,这个spl拟合多点线,判断外有误,返回 t. 有回弯的。  详情 回复 发表于 2019-9-28 10:29
黄大师,这个spl拟合多点线,判断外有误,返回 t.  详情 回复 发表于 2019-9-28 10:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 31个

财富等级: 招财进宝

发表于 2018-5-2 11:09:39 | 显示全部楼层
射线法有缺陷,一般情况下点在外,则交点有偶数个,但是有种情况是射线刚好经过曲线的拐点(或与曲线相切),则交点变为奇数个
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10个

财富等级: 恭喜发财

发表于 2019-3-12 09:28:19 | 显示全部楼层
xmzhangzhilin 发表于 2018-5-2 11:09
射线法有缺陷,一般情况下点在外,则交点有偶数个,但是有种情况是射线刚好经过曲线的拐点(或与曲线相切) ...

加一个判断条件:所得交点是否为曲线的顶点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2019-5-10 17:36:07 来自手机 | 显示全部楼层
谁说相切点就一定是顶点
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2019-9-25 01:08:03 来自手机 | 显示全部楼层
研究研究!
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2019-9-28 10:28:43 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2016-6-24 09:20
应该与你说的射线法,我找出来改了改

黄大师,这个spl拟合多点线,判断外有误,返回 t.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2019-9-28 10:29:58 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2016-6-24 09:20
应该与你说的射线法,我找出来改了改

黄大师,这个spl拟合多点线,判断外有误,返回 t.  有回弯的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

发表于 2019-9-28 17:15:55 | 显示全部楼层
P点在封闭样条曲线外,但程序运行结果是T(即在内部)。
11.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 09:59 , Processed in 0.462027 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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