「引」 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度附近的距离时,需特别注意坐标系统的正负号以及可能的...
3. **Voronoi Diagrams 和 Delaunay Triangulation**:这两种几何构造可以用于创建障碍物之间的最近邻关系,从而帮助找到没有障碍的路径。 4. **Grid-based Pathfinding**:在MATLAB中,可以将地图划分为网格,每个...
在障碍物检测系统中,超声波作为主要的信息载体,通过发射并接收超声波脉冲来计算与障碍物的距离。 系统的核心部件是超声波传感器,如常见的HC-SR04或SGP30等型号。这些传感器能发射超声波脉冲,并在接收到反射回波...
传统的单一传感器在检测障碍物时存在局限性,例如视觉传感器受光线条件影响较大,而超声波传感器和红外传感器则在检测距离和角度上各有不足。为了解决这些问题,科研人员提出了基于多传感器信息融合的机器人障碍物...
这种方法的优点在于它考虑了实际地理环境的复杂性,不仅关注两点之间的直线距离,还考虑了实际的可达性和障碍物的影响。 总之,路网中的最近邻查询是空间数据库研究中的一个重要课题,尤其在存在障碍物的复杂环境中...
聚类算法则有助于区分和识别不同的障碍物,提高检测的准确性。 【实验结果】表明,改进后的U-V视差算法在障碍物检测上表现出更快的速度和更高的精度,对凹凸障碍物的检测尤为有效。这种算法对于智能车辆的安全行驶...
在障碍物检测领域,双目视觉系统因其无需先验知识、对环境变化有较强适应性,且能提供距离信息,成为一种实用的解决方案。本文主要介绍了一种基于V-视差图的障碍物检测算法,它尤其适用于复杂背景下的障碍物识别。 ...
这些步骤有助于突出图像中的障碍物并减少背景干扰。 3. **特征提取**:通过边缘检测、区域生长等方法,识别出图像中的障碍物边界。例如,Canny边缘检测算法可用于找出图像中的轮廓。 4. **障碍物识别**:将提取的...
8. 三维激光雷达的应用:尽管V-视差算法主要基于图像处理技术,但三维激光雷达在自动驾驶障碍物检测中也有应用。激光雷达能够提供精确的深度信息,与V-视差算法相结合,可以进一步提升障碍物识别的准确性和可靠性。 ...
障碍物的识别则通过Hough变换或直线拟合等方法,找到V视差图中的直线,确定障碍物的位置和高度。障碍物的宽度可以通过U视差图计算或水平搜索来确定。 6. 结论: 结合道路检测方法,可以更准确地识别和定位障碍物,...
该方法首先使用两个或多个摄像机从不同视角同时获取场景图像,然后通过图像匹配发现障碍物并得到图像间的视差,最后根据障碍物在图像中的位置、视差以及摄像机标定参数计算出障碍物的实际距离。 三、算法的对比分析...
常见的启发式包括曼哈顿距离和欧几里得距离,它们分别计算目标节点与当前节点在x轴和y轴上的直线距离。然而,在有障碍物的地图上,实际移动距离可能会更长,因此可能需要采用更加精确的启发式,如切比雪夫距离或实际...
除了视觉检测,雷达和LiDAR也能提供距离信息,帮助确认障碍物的位置和形状。这些传感器的数据可以与摄像头的视觉信息结合,以提高检测的准确性和鲁棒性。例如,雷达可以提供精确的距离测量,而LiDAR则能生成高精度的...
- 障碍物的触地点可通过两条直线的交点确定,而障碍物的高度则由垂直线段的高度给出。 - 为了更全面地描述障碍物形状,还可以引入U-视差图方法,通过沿水平方向(U方向)累加相同视差值的像素点数来进一步细化障碍...
在数学和几何学中,欧几里得距离是最直观的距离度量方式,它是两点之间的直线距离。在3D空间中的点云数据中,欧几里得聚类是一种将相似点聚集在一起形成簇的方法,这些簇通常代表了现实世界中的物体或障碍物。通过...
超声波障碍物测距系统的设计与研究是一个重要的领域,特别是在自动化和机器人技术中,它为设备提供了一种有效避开障碍物的能力。本文主要探讨了如何利用超声波技术进行障碍物检测,以及如何设计一个实用的超声波测距...
激光传感器采集数据的障碍物特征提取:激光测距仪能采集到的数据是一个180度的扇形范围内每隔0.5度的距离数据,每次采集有361个数据,根据这些数据把空间中的障碍物建立出来,并把这些障碍物中的直线特征提取出来。
通过计算两个坐标之间的水平差(a)和垂直差(b),我们就能应用勾股定理求得角色到目标的直线距离(c)以及方向角度。这个角度可以用来决定角色转动头部和移动的方向。 角色转头的实现通常涉及到旋转矩阵或向量...
该工程是opencv提取障碍物轮廓,然后进行多边形近似,之后为了设置安全距离,对多边形顶点进行外扩,最后连成直线并显示出来。 原理以及效果见博客https://blog.csdn.net/hjk61314/article/details/82112610
例如,在游戏开发中,角色与障碍物之间的距离计算可以防止角色穿过障碍物。 3. **距离相等问题**: 当题目要求两点到直线的距离相等时,这可能对应于寻找中位线、等腰三角形的性质或者寻找平行线等几何问题。在...