AI简单平移追踪算法
1.比较坐标追踪法
追踪者会不停地比较自身和目标的x坐标和y坐标,每x和y上一个单位的移动为一个周期,该算法虽然简单好用,但实用性差且不智能化,如果追踪者数量增加,路线会显得单调,由于都是先走个对角线再一路直行,很可能造成多个追踪者拥堵在一起。
代码:
while(!(rigesha.x==killer.x&&rigesha.y==killer.y)){ if(rigesha.x>killer.x){
killer.goRight();
}else if(rigesha.x<killer.x){
killer.goLeft();
} if(rigesha.y>killer.y){
killer.goDown();
}else if(rigesha.y<killer.y){
killer.goUp();
} }
2.射线动态追踪法
先在追踪者和目标之间建立一条直线,如图所示,然后再通过三角形面积公式法,模拟上行或左行一个单位后,距离该直线的距离,比较这两个距离,执行最短距离所对应的操作。
这样一来,追踪路线会尽可能接近直线,AI效果会更逼真。
在追踪过程中,如果监测到目标改变位置(此例假设目标每一帧都逃跑),那么追踪者就会重新建立两者之间的直线,然后沿着该直线继续追踪(如图所示)。
代码:
rigeshaX = rigesha.x;
rigeshaY = rigesha.y;
killerX = killer.x;
killerY = killer.y;
while(!(rigesha.x==killer.x&&rigesha.y==killer.y)){ if(Random(0,1)>0.5){
if(rigesha.x>killer.x){rigesha.goRight();}else{rigesha.goLeft();}
}else{
if(rigesha.y>killer.y){rigesha.goDown();}else{rigesha.goUp();}
}
rigesha.move = true;
} if(rigesha.move){
caculaterLine();
} float rightDistanse = xORy(++killer.x,killer.y);
float leftDistance = xORy(--(--killer.x),killer.y);
float upDistance = xORy(++killer.x),--killer.y);
float downDistance = xORy(killer.x,++(++killer.y));
killer.y--; if(rigesha.x<=killer.x&&rigesha.y<=killer.y){
if(leftDistance<=upDistance){
killer.goLeft();
}else{
killer.goUp();
}
rigesha.move = false;
continue;
} if(rigesha.x>=killer.x&&rigesha.y<=killer.y){
if(rightDistance<=upDistance){
killer.goRight();
}else{
killer.goUp();
}
rigesha.move = false;
continue;
} if(rigesha.x>=killer.x&&rigesha.y>=killer.y){
if(rightDistance<=downDistance){
killer.goRight();
}else{
killer.goDown();
}
rigesha.move = false;
continue;
} if(rigesha.x<=killer.x&&rigesha.y>=killer.y){
if(leftDistance<=downDistance){
killer.goLeft();
}else{
killer.goDown();
}
rigesha.move = false;
continue;
} } void caculaterLine(){
rigeshaX = rigesha.x;
rigeshaY = rigesha.y;
killerX = killer.x;
killerY = killer.y;
} float xORy(x,y){
float S = x*killerY + killerX*rigeshaY + rigeshaX*y - x*rigeshaY - killerX*y - rigeshaX*killerY;
if(S<0){S = -S;}
float lengthDI = sqrt((killerX-rigashaX)*(killerX-rigashaX)+(killerY-rigashaY)*(killerY-rigashaY))
distance = S/lengthDI;
return distance;
}
AI简单平移追踪算法的更多相关文章
- Unity人工智能学习—确定性AI算法之追踪算法二
转自:http://blog.csdn.net/zhangxiao13627093203/article/details/47658673 上一篇讲到了追踪算法的比较简单的形式,看上去比较假,因为AI ...
- 让AI简单且强大:深度学习引擎OneFlow技术实践
本文内容节选自由msup主办的第七届TOP100summit,北京一流科技有限公司首席科学家袁进辉(老师木)分享的<让AI简单且强大:深度学习引擎OneFlow背后的技术实践>实录. 北京 ...
- 浅谈压缩感知(九):正交匹配追踪算法OMP
主要内容: OMP算法介绍 OMP的MATLAB实现 OMP中的数学知识 一.OMP算法介绍 来源:http://blog.csdn.net/scucj/article/details/7467955 ...
- 匹配追踪算法(MP)简介
图像的稀疏表征 分割原始图像为若干个\[\sqrt{n} \times \sqrt{n}\]的块. 这些图像块就是样本集合中的单个样本\(y = \mathbb{R}^n\). 在固定的字典上稀疏分解 ...
- html5游戏-追踪算法
追踪算法的原理:目标位置 - 当前位置 / 速度,即: dx = targetX - currentX / speed, dy = targetY - currentY / speed var get ...
- 非刚性图像配准 matlab简单示例 demons算法
2011-05-25 17:21 非刚性图像配准 matlab简单示例 demons算法, % Clean clc; clear all; close all; % Compile the mex f ...
- 如何简单解释 MapReduce算法
原文地址:如何简单解释 MapReduce 算法 在Hackbright做导师期间,我被要求向技术背景有限的学生解释MapReduce算法,于是我想出了一个有趣的例子,用以阐释它是如何工作的. 例子 ...
- 简单的PHP算法题
简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...
- 冒泡排序算法和简单选择排序算法的js实现
之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...
随机推荐
- Java开发环境之------MyEclipse快捷键和排除错误第一选择ctrl+1(***重点***:ctrl+1,快速修复---有点像vs中的快速using
using Java开发环境之------MyEclipse快捷键和排除错误第一选择ctrl+1(***重点***:ctrl+1,快速修复---有点像vs中的快速using 2015-06-29 浏览 ...
- centos7 单台zookeeper安装
1.创建 /usr/local/services/zookeeper 文件夹: mkdir -p /usr/local/services/zookeeper 2.进入到 /usr/local/ser ...
- 2016-2017-20155329 《Java程序设计》第6周学习总结
学号 2016-2017-20155329 <Java程序设计>第6周学习总结 教材学习内容总结 数据从来源取出:输入串流 java.io.InputStream 写入目的的:输出串流 j ...
- UITableView.separatorInset
[UITableView.separatorInset] separatorInset指定每行row之间的分隔线的长度,iOS7.0后提供,官方文档如下: 示例截图如下,分隔线没有紧贴着左右边界:
- Hello_Depth_Perception 任务二:Project Tango采集深度感知数据
Java API Depth Perception Tutorial深度感知教程 Configuration 配置信息 In order to use depth perception, your T ...
- RSA加密解密总结
简单的控制台程序 #include"stdafx.h" #include <math.h> #include<string.h> /*/求解密密钥d的函数( ...
- [label][JavaScript][The Defined Guide of JavaScript] 变量的作用域
变量的作用域 一个变量的作用域(scope)是程序中定义这个变量的区域. 全局(global)变量的作用域(scope)是全局性的,即在JavaScript代码中,它处处都有定义. 而在函数之内 ...
- Markdown编辑器——常用语法
Markdown是什么? 简短来说,他就是一款特别适用于写博客的编辑器.为什么适合呢,因为它特别的方便.以博客园的编辑界面来说,它原本的界面是这样的(有没有一种Word2003的既视感): 但是,当你 ...
- 配置git使用socks5代理
git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'socks5://1 ...
- 记一次Angular2环境搭建及My First Angular App小demo呈现
参考连接?不如说是照搬链接.AngularJs官网地址快速起步地址. 对于一个一直只是用jq,偶尔学习点Knockout js,了解一点mvvm结构的前端来说,学习Angular2还是有点困难的.好了 ...