「引」 http://bbs.9ria.com/thread-61774-1-8.html
![](http://dl.iteye.com/upload/attachment/329295/9fe56260-d275-37be-9c5b-8944673a26b1.jpg)
一个平面上有2个mc,分别代表玩家和敌人,暂时把这个平面地图用二维数组表示吧,黑色表示障碍,红色表示敌人,绿色表示玩家,如果红色和绿色的连线没有经过黑色障碍物,则说明敌人发现了玩家,问题是我该如何确定红色和绿色的连线中有没有经过障碍物呢?
![](http://dl.iteye.com/upload/attachment/329297/2b15ed60-7031-36f9-80d5-aa948d7a7b40.jpg)
像这样,他们连线经过了黑色障碍物,就表示没有被发现
![](http://dl.iteye.com/upload/attachment/329299/390fae4d-b419-3fe0-85f1-b279571c96a1.jpg)
这样就表示发现了
大家有什么好的办法?之前在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;
}
}
}
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0032/9295/9fe56260-d275-37be-9c5b-8944673a26b1-thumb.jpg)
- 大小: 23.7 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0032/9297/2b15ed60-7031-36f9-80d5-aa948d7a7b40-thumb.jpg)
- 大小: 25.8 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0032/9299/390fae4d-b419-3fe0-85f1-b279571c96a1-thumb.jpg)
- 大小: 24.8 KB
分享到:
相关推荐
- 直线距离在地球表面并不等同于实际行驶距离,因为道路有弯道和障碍物。 - 经纬度坐标应精确至足够小的单位,以确保计算的精度。 - 当计算跨赤道或经度180度附近的距离时,需特别注意坐标系统的正负号以及可能的...
3. **Voronoi Diagrams 和 Delaunay Triangulation**:这两种几何构造可以用于创建障碍物之间的最近邻关系,从而帮助找到没有障碍的路径。 4. **Grid-based Pathfinding**:在MATLAB中,可以将地图划分为网格,每个...
在障碍物检测系统中,超声波作为主要的信息载体,通过发射并接收超声波脉冲来计算与障碍物的距离。 系统的核心部件是超声波传感器,如常见的HC-SR04或SGP30等型号。这些传感器能发射超声波脉冲,并在接收到反射回波...
传统的单一传感器在检测障碍物时存在局限性,例如视觉传感器受光线条件影响较大,而超声波传感器和红外传感器则在检测距离和角度上各有不足。为了解决这些问题,科研人员提出了基于多传感器信息融合的机器人障碍物...
直线拟合算法的使用,可以让系统更有效地识别图像中的直线特征,并根据直线的不同斜率和位置来分类不同的障碍物类型。例如,水平障碍物会在视差图中表现为从左上至右下的倾斜直线,而垂直障碍物则多为近似垂直的线。...
双目立体视觉技术作为一种可以获取场景三维信息的重要计算机视觉技术,因其在无需先验知识、对环境变化具有较强适应性以及能提供距离信息等方面的优势,在障碍物检测领域显得尤为重要。 双目视觉系统主要由两个摄像...
2.在示教模式下,放入多个障碍物,示教过程中实时计算各障碍物与机械臂的距离,并用红色直线绘制最短距离线,若示教过程中有障碍物与机器人发生碰撞,则用红色球表示,否则用蓝色球表示。 ,机械臂; 碰撞检测算法; 示...
这些步骤有助于突出图像中的障碍物并减少背景干扰。 3. **特征提取**:通过边缘检测、区域生长等方法,识别出图像中的障碍物边界。例如,Canny边缘检测算法可用于找出图像中的轮廓。 4. **障碍物识别**:将提取的...
8. 三维激光雷达的应用:尽管V-视差算法主要基于图像处理技术,但三维激光雷达在自动驾驶障碍物检测中也有应用。激光雷达能够提供精确的深度信息,与V-视差算法相结合,可以进一步提升障碍物识别的准确性和可靠性。 ...
障碍物的识别则通过Hough变换或直线拟合等方法,找到V视差图中的直线,确定障碍物的位置和高度。障碍物的宽度可以通过U视差图计算或水平搜索来确定。 6. 结论: 结合道路检测方法,可以更准确地识别和定位障碍物,...
障碍物的存在使得从一给定点到最近邻点的路径不再是简单的直线距离最小,而需要考虑绕开障碍物的实际路径。在此背景下,Voronoi图作为一种几何结构,提供了一种有效的解决方案。Voronoi图通过一组特定的点(站点),...
该方法首先使用两个或多个摄像机从不同视角同时获取场景图像,然后通过图像匹配发现障碍物并得到图像间的视差,最后根据障碍物在图像中的位置、视差以及摄像机标定参数计算出障碍物的实际距离。 三、算法的对比分析...
常见的启发式包括曼哈顿距离和欧几里得距离,它们分别计算目标节点与当前节点在x轴和y轴上的直线距离。然而,在有障碍物的地图上,实际移动距离可能会更长,因此可能需要采用更加精确的启发式,如切比雪夫距离或实际...
除了视觉检测,雷达和LiDAR也能提供距离信息,帮助确认障碍物的位置和形状。这些传感器的数据可以与摄像头的视觉信息结合,以提高检测的准确性和鲁棒性。例如,雷达可以提供精确的距离测量,而LiDAR则能生成高精度的...
- 障碍物的触地点可通过两条直线的交点确定,而障碍物的高度则由垂直线段的高度给出。 - 为了更全面地描述障碍物形状,还可以引入U-视差图方法,通过沿水平方向(U方向)累加相同视差值的像素点数来进一步细化障碍...
在数学和几何学中,欧几里得距离是最直观的距离度量方式,它是两点之间的直线距离。在3D空间中的点云数据中,欧几里得聚类是一种将相似点聚集在一起形成簇的方法,这些簇通常代表了现实世界中的物体或障碍物。通过...
超声波障碍物测距系统的设计与研究是一个重要的领域,特别是在自动化和机器人技术中,它为设备提供了一种有效避开障碍物的能力。本文主要探讨了如何利用超声波技术进行障碍物检测,以及如何设计一个实用的超声波测距...
激光传感器采集数据的障碍物特征提取:激光测距仪能采集到的数据是一个180度的扇形范围内每隔0.5度的距离数据,每次采集有361个数据,根据这些数据把空间中的障碍物建立出来,并把这些障碍物中的直线特征提取出来。
通过计算两个坐标之间的水平差(a)和垂直差(b),我们就能应用勾股定理求得角色到目标的直线距离(c)以及方向角度。这个角度可以用来决定角色转动头部和移动的方向。 角色转头的实现通常涉及到旋转矩阵或向量...