`
bluepeer
  • 浏览: 74496 次
  • 性别: 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
分享到:
评论

相关推荐

    经纬度格式转换及直线距离计算工具.rar

    - 直线距离在地球表面并不等同于实际行驶距离,因为道路有弯道和障碍物。 - 经纬度坐标应精确至足够小的单位,以确保计算的精度。 - 当计算跨赤道或经度180度附近的距离时,需特别注意坐标系统的正负号以及可能的...

    (来点有用的)含障碍的两点最短路径算法完整代码

    3. **Voronoi Diagrams 和 Delaunay Triangulation**:这两种几何构造可以用于创建障碍物之间的最近邻关系,从而帮助找到没有障碍的路径。 4. **Grid-based Pathfinding**:在MATLAB中,可以将地图划分为网格,每个...

    基于超声波的障碍物检测系统的设计实现

    在障碍物检测系统中,超声波作为主要的信息载体,通过发射并接收超声波脉冲来计算与障碍物的距离。 系统的核心部件是超声波传感器,如常见的HC-SR04或SGP30等型号。这些传感器能发射超声波脉冲,并在接收到反射回波...

    基于多传感器信息融合的机器人障碍物检测.pdf

    传统的单一传感器在检测障碍物时存在局限性,例如视觉传感器受光线条件影响较大,而超声波传感器和红外传感器则在检测距离和角度上各有不足。为了解决这些问题,科研人员提出了基于多传感器信息融合的机器人障碍物...

    障碍物环境中的路网最近邻查询方法.pdf

    这种方法的优点在于它考虑了实际地理环境的复杂性,不仅关注两点之间的直线距离,还考虑了实际的可达性和障碍物的影响。 总之,路网中的最近邻查询是空间数据库研究中的一个重要课题,尤其在存在障碍物的复杂环境中...

    2.基于U_V视差算法的障碍物识别技术研究_上官珺1

    聚类算法则有助于区分和识别不同的障碍物,提高检测的准确性。 【实验结果】表明,改进后的U-V视差算法在障碍物检测上表现出更快的速度和更高的精度,对凹凸障碍物的检测尤为有效。这种算法对于智能车辆的安全行驶...

    基于双目立体视觉的障碍物检测方法.pdf

    在障碍物检测领域,双目视觉系统因其无需先验知识、对环境变化有较强适应性,且能提供距离信息,成为一种实用的解决方案。本文主要介绍了一种基于V-视差图的障碍物检测算法,它尤其适用于复杂背景下的障碍物识别。 ...

    障碍检测和路径规划的MATLAB仿真

    这些步骤有助于突出图像中的障碍物并减少背景干扰。 3. **特征提取**:通过边缘检测、区域生长等方法,识别出图像中的障碍物边界。例如,Canny边缘检测算法可用于找出图像中的轮廓。 4. **障碍物识别**:将提取的...

    基于V-视差算法的自动驾驶中障碍物躲避软件设计.pdf

    8. 三维激光雷达的应用:尽管V-视差算法主要基于图像处理技术,但三维激光雷达在自动驾驶障碍物检测中也有应用。激光雷达能够提供精确的深度信息,与V-视差算法相结合,可以进一步提升障碍物识别的准确性和可靠性。 ...

    基于双目视觉的障碍物识别研究实用教案.pptx

    障碍物的识别则通过Hough变换或直线拟合等方法,找到V视差图中的直线,确定障碍物的位置和高度。障碍物的宽度可以通过U视差图计算或水平搜索来确定。 6. 结论: 结合道路检测方法,可以更准确地识别和定位障碍物,...

    基于双目视觉的障碍物识别研究PPT课件.pptx

    该方法首先使用两个或多个摄像机从不同视角同时获取场景图像,然后通过图像匹配发现障碍物并得到图像间的视差,最后根据障碍物在图像中的位置、视差以及摄像机标定参数计算出障碍物的实际距离。 三、算法的对比分析...

    二维地图A星路径规划,随机生成障碍物

    常见的启发式包括曼哈顿距离和欧几里得距离,它们分别计算目标节点与当前节点在x轴和y轴上的直线距离。然而,在有障碍物的地图上,实际移动距离可能会更长,因此可能需要采用更加精确的启发式,如切比雪夫距离或实际...

    进行障碍物和护栏检测驾驶员辅助系统用于检测沿道路延伸的结构障碍物.zip

    除了视觉检测,雷达和LiDAR也能提供距离信息,帮助确认障碍物的位置和形状。这些传感器的数据可以与摄像头的视觉信息结合,以提高检测的准确性和鲁棒性。例如,雷达可以提供精确的距离测量,而LiDAR则能生成高精度的...

    基于双目立体视觉的障碍物检测方法.docx

    - 障碍物的触地点可通过两条直线的交点确定,而障碍物的高度则由垂直线段的高度给出。 - 为了更全面地描述障碍物形状,还可以引入U-视差图方法,通过沿水平方向(U方向)累加相同视差值的像素点数来进一步细化障碍...

    基于欧几里德聚类的障碍物检测ROS实现

    在数学和几何学中,欧几里得距离是最直观的距离度量方式,它是两点之间的直线距离。在3D空间中的点云数据中,欧几里得聚类是一种将相似点聚集在一起形成簇的方法,这些簇通常代表了现实世界中的物体或障碍物。通过...

    超声波障碍物测距系统的设计与研究.doc

    超声波障碍物测距系统的设计与研究是一个重要的领域,特别是在自动化和机器人技术中,它为设备提供了一种有效避开障碍物的能力。本文主要探讨了如何利用超声波技术进行障碍物检测,以及如何设计一个实用的超声波测距...

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

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

    控制人物转头与直线前进

    通过计算两个坐标之间的水平差(a)和垂直差(b),我们就能应用勾股定理求得角色到目标的直线距离(c)以及方向角度。这个角度可以用来决定角色转动头部和移动的方向。 角色转头的实现通常涉及到旋转矩阵或向量...

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

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

    (完整word)点到直线的距离练习题.docx

    例如,在游戏开发中,角色与障碍物之间的距离计算可以防止角色穿过障碍物。 3. **距离相等问题**: 当题目要求两点到直线的距离相等时,这可能对应于寻找中位线、等腰三角形的性质或者寻找平行线等几何问题。在...

Global site tag (gtag.js) - Google Analytics