`
bluepeer
  • 浏览: 72227 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

「转」如何知道直线距离有没有障碍物

阅读更多

「引」 http://bbs.9ria.com/thread-61774-1-8.html



 


一个平面上有2个mc,分别代表玩家和敌人,暂时把这个平面地图用二维数组表示吧,黑色表示障碍,红色表示敌人,绿色表示玩家,如果红色和绿色的连线没有经过黑色障碍物,则说明敌人发现了玩家,问题是我该如何确定红色和绿色的连线中有没有经过障碍物呢?



 
像这样,他们连线经过了黑色障碍物,就表示没有被发现


 

这样就表示发现了



大家有什么好的办法?之前在AS板块问了下,说是求直线方程,还要遍历每个格子,还要求格子四个顶点是否经过直线,太麻烦了,有没有更好点的办法呢

这个应该是游戏中经常会遇到的问题,也算是游戏的AI吧,敌人如何发现玩家,只要他们的直线距离内没有障碍物

 

sliz 回答

射线方法

 

 

package sliz.math {
	/**
	 * ...
	 * @author sliz http://space.flash8.net/space/?534614
	 */

	import flash.display.Graphics;
	import flash.geom.Point;
	public class RayShape {
		public var vertices:Array;
		public function RayShape(vertices:Array){
			this.vertices = vertices;
		}
		public function move(velocity:Point):void {
			var len:int = vertices.length
			for (var i:int = 0; i < len; i++){
				vertices[i] = vertices[i].add(velocity);
			}
		}
		public function setPosition(position:Point):void {
			var diff:Point = position.subtract(middle());
			var len:int = vertices.length;
			for (var i:int = 0; i < len; i++){
				vertices[i] = vertices[i].add(diff);
			}
		}
		public function middle():Point {
			var mid:Point = new Point();
			var len:int = vertices.length;
			for (var i:int = 0; i < len; i++){
				mid = mid.add(vertices[i]);
			}
			mid.x = mid.x / len;
			mid.y = mid.y / len;
			return mid;
		}
		public function debugDraw(graphics:Graphics):void {
			graphics.lineStyle(0);
			graphics.moveTo(vertices[0].x, vertices[0].y);
			var len:int = vertices.length;
			for (var i:int = 0; i < len; i++){
				graphics.lineTo(vertices[i].x, vertices[i].y);
			}
			graphics.lineTo(vertices[0].x, vertices[0].y);
		}
	}





}

 其它:

 

package  
{
	import flash.geom.Point;
	/**
	 * ...
	 * @author sliz http://space.flash8.net/space/?534614
	 */
	public class GeomMath
	{
		private static const EP:Number = Math.LOG10E;
		
		/**
		 * 判断2点是否相等
		 * @param	p1
		 * @param	p2
		 * @return
		 */
		public static function isEuqalPoint(p1:Point, p2:Point):Boolean {
			return Math.abs(p1.x - p2.x) < EP && Math.abs(p1.y - p2.y) < EP;
		}
		
		/**
		 * 确定两条线段是否相交  
		 * @param	l1
		 * @param	l2
		 * @return
		 */
		public static function isIntersect(p1:Point,p2:Point,p3:Point,p4:Point):Boolean {
			return((Math.max(p1.x,p2.x)>=Math.min(p3.x,p4.x))&&   
					(Math.max(p3.x,p4.x)>=Math.min(p1.x,p2.x))&&   
					(Math.max(p1.y,p2.y)>=Math.min(p3.y,p4.y))&&   
					(Math.max(p3.y,p4.y)>=Math.min(p1.y,p2.y))&&   
					(multiply(p3,p2,p1)*multiply(p2,p4,p1)>=0)&&   
					(multiply(p1,p4,p3)*multiply(p4,p2,p3)>=0));  
		}
		
		/**
		 * 一种线段相交判断函数,当且仅当l1,l2相交并且交点不是l1,l2的端点时函数为true;
		 * @param	l1
		 * @param	l2
		 * @return
		 */
		public static function isIntersect2(p1:Point,p2:Point,p3:Point,p4:Point):Boolean {
			return((isIntersect(p1,p2,p3,p4))&&   
				(!isEuqalPoint(p1,p3))&&   
				(!isEuqalPoint(p1,p4))&&   
				(!isEuqalPoint(p2,p3))&&   
				(!isEuqalPoint(p2,p4)));   
		}
		
		/**
		 * 跨立
		 * 伸出右手手心像上依次穿越sp,ep
		 * @param	sp
		 * @param	ep
		 * @param	op
		 * @return
		 */
		public static function multiply(sp:Point,ep:Point,op:Point):int {
			return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y)); 
		}
		
		/**
		 * 穿越
		 * @param	cn
		 * @param	ln1
		 * @param	ln2
		 * @param	sn
		 * @param	en
		 * @return
		 */
		public static function acrossAble(cn:Point, ln1:Point, ln2:Point, sn:Point, en:Point):Boolean {
			return multiply(ln1,cn,sn) * multiply(cn,ln2,sn) <= 0 && multiply(ln1,cn,en) * multiply(cn,ln2,en) <= 0;
		}
		
		public static function getAcrossPoint(p1:Point, p2:Point, p3:Point, p4:Point,isMax:Boolean=false):Point {
			if (!isMax&&!isIntersect(p1,p2,p3,p4)) {
				return null;
			}
			var p:Point = new Point();
			//y=ax+b
			//y=cx+d
			var type:int = 0;
			if (p1.x==p2.x) {
				//|x=p1.x
				type = 1;
			}else {
				var a:Number = (p1.y - p2.y) / (p1.x - p2.x);
				var b:Number = p1.y - a * p1.x;
			}
			if (p3.x==p4.x) {
				//|x=p1.x
				type = 2;
			}else {
				var c:Number = (p3.y - p4.y) / (p3.x - p4.x);
				var d:Number = p3.y - c * p3.x;
			}
			if (type==0) {
				p.x = (d - b) / (a - c);
				p.y = a * p.x + b;
			}else if (type==1) {
				p.x = p1.x;
				p.y = c * p.x + d;
			}else if (type==2) {
				p.x = p3.x;
				p.y = a * p.x + b;
			}
			return p;
		}
	}
}
 

 

  • 大小: 23.7 KB
  • 大小: 25.8 KB
  • 大小: 24.8 KB
分享到:
评论

相关推荐

    激光传感器采集数据的障碍物特征提取

    激光传感器采集数据的障碍物特征提取:激光测距仪能采集到的数据是一个180度的扇形范围内每隔0.5度的距离数据,每次采集有361个数据,根据这些数据把空间中的障碍物建立出来,并把这些障碍物中的直线特征提取出来。

    障碍物轮廓多边形近似和轮廓外扩

    该工程是opencv提取障碍物轮廓,然后进行多边形近似,之后为了设置安全距离,对多边形顶点进行外扩,最后连成直线并显示出来。 原理以及效果见博客https://blog.csdn.net/hjk61314/article/details/82112610

    论文研究-动态和未知环境中基于改进粒子群优化的路径规划.pdf

    当有新的移动障碍物出现时,从智能体当前点起的已搜索到的路径分段判断是否与新的移动障碍物发生碰撞,从发生碰撞的路径开始由改进粒子群优化重新规划路径。仿真测试和比较结果表明,提出的方法在动态和未知环境中有...

    Astar3DSearch.rar

    在一个10X10X10的三维空间,有一部分障碍物,从一端出发到另一端的最优路径。规定在水平方向可以走斜线,在竖直方向只能走直线。A*的启发式函数采用曼哈顿距离结合对角线距离。

    matlab版本的完全覆盖路径规划,原始版本,用来对比和参考.rar

    遍历工作区域内除障碍物以外的全部区域 在遍历过程中有效避开所有障碍物 在遍历过程中要尽量避免路径重复,缩短移动距离 CCPP技术指标: 区域覆盖率 路径重复率 总行程 死区: 是指它的周边相邻区域,或者是边界...

    电子科技大学现代电子系统综合实验小车工程文件代码

    尽量保持小车直线前进,要求小车速度至少有两个速度档位,距离障碍物越近,速度越慢。小车第一次进入定位距离范围内,停止计时,要求该时间不大于3.2秒,并记录小车运行时间。 (4)小车运行过程中,数码管上始终...

    关节臂式三坐标测量机在特殊尺寸测量中的应用

    以超量程尺寸、异面直线的距离尺寸、跨过障碍物的尺寸等特殊尺寸为例,应用关节臂式坐标测量机对其进行了精确测量,体现了关节臂式坐标测量机测量精度高、适用范围广、效率高的优点,可解决特殊尺寸测量的问题。

    扫地机器人

    寝室扫地机器人技术的研究与设计旨在通过科技改变学生的...地车离墙壁和障碍物距离,红外传感器检测墙壁和障碍物,避免发生碰撞。通过固定的转弯反应动作实现避障。针对寝室固定环境,该扫 地机器人具有较强应用价值。

    汽车驾驶教程图解

    安全确认内容:确认汽车前后没有人和障碍物。 上车、下车方法 1.安全确认  确认车的前后无人或无障碍物等。  2.上车  首先打开车门,按右脚、腰部、上身、左脚的顺序上车。  3.关门  把车门拉到离关闭位置...

    安全光幕直线扫描红外发射器/接收器,附全套资料-电路方案

    当同一水平线上的红外发射管、红外接收管之间没有障碍物时,红外发射管发出的红外光调制信号能顺利到达红外接收管。 而在有障碍物的情况下,红外发射管发出的红外光调制信号则不能顺利到达红外接收管,这时该红外...

    无人驾驶传感器融合(含代码).pdf

    打在障碍物上的点。打在地面上的点基本上是处在一个平面上的,所以我们的目 标就是找到这个平面,然后将距离此平面一定距离内的点分割成地面。 由于算法逻辑本质上是一致的,为了简便起见,这里将三维空间寻找平面...

    通信线路主要工序施工方法及先进技术新工艺的应用.doc

    穿越较大障碍物&lt;铁路、河流、一、二级公路等&gt;时,如位置变更应测绘出新的断面图。每隔100m打一计数桩,在转角点穿越障碍处应打定位桩。桩号应随时与绘图、记录者核对。在前后桩之间把地链接直沿地链用白灰画线,沿途...

    红外光语音通信的研究.pdf

    红外光语音通信是利用红外光作为载波的一种新型通信方式。红外光语音通信系统包括...就解决了红外光直线传播的缺点,在一些特殊场合可以通过该设计避开障碍物,实现两个站点之间的自由通信,同时也可以增加传输距离。

    多项式重采样matlab代码-State-Estimation-through-Sensor-Fusion:通过传感器融合进行状态估计

    障碍物是已知距离处的障碍物,当手机靠近障碍物时,超声波传感器会读取读数。 在实施任何滤波器以补偿原始传感器数据的噪声,比例和偏移之后,就完成了模型拟合。 卡尔曼滤波 尽管预期路径是一条直线,并且预期速度...

    arduino nano避障机器人,gerber、源码开源-电路方案

    在正常情况下,当机器人前方没有障碍物时, 两个电动机将顺时针旋转,并且机器人会向前直线行驶。 如果超声波传感器在20厘米内检测到任何物体,则左马达将开始逆时针旋转 ,而右马达将按原样顺时针旋转。 因此,如果...

    自动驾驶汽车局部避障路径规划和跟踪控制研究

    采用仿真效果更好的双层MPC控制系统模型进行了直线避障实车试验 ,结果 表明,试验车成功避开了障碍物,方向盘转角最大绝对值为188.2° , 横摆角速度最大绝对值为9.411 °/s, 均在合理范围内, 说明本文所设计的双层...

    单片机控制的自主寻迹电动小车(论文+程序)

    本文研究的电动小车是在给定的区域内沿着轨迹完成对各个目标点的访问,主要指标有行驶距离、时间、探测物计数、障碍物躲避等。采用AT89C51单片机作控制,针对小车在行驶过程中的不同要求,采用模块化设计方案,进行...

    基于单片机的超声波测距设计.doc

    即使传感器上有尘土,只要没有堵死就可以测量, 测距范围比激光近,比红外远,一般为3cm- 5cm,精度一般在1cm,有的达到1mm级,超声波测距的缺点是一定距离内有一定的束角, 受周围障碍物影响大,适合于室内测量,且...

    雷达与机器视觉的空间同步方法 (2006年)

    为解决应用雷达与机器视觉的智能车信息融合...静态验证试验和动态验证试验证明,该方法可以获得较高的由两种传感器获取的障碍物距离数据的空间同步准确度,并且只需利用汽车前方10m区域内的4个点进行标定,简单易行。

    OCR:正交路由选路算法

    正交路由选路算法算法思路该算法核心部分来自OCR算法,但是为了更好的用户体验和更好地满足用户需求,需要对OCR算法进行修改.OCR算法通过建立图形连接点之间的正交网络寻找两点之间可以避开障碍物并且代价最小的路径....

Global site tag (gtag.js) - Google Analytics