演进式设计——扫地机器人
一,需求
1,迭代1
设置指定位置(x, y, heading)
获取当前位置(x, y, heading)
右转90度,位置不变
左转90度,位置不变
2, 迭代2
前进一步,方向不变
后退一步,方向不变
转180度 位置不变
3,迭代3
右转45度,位置不变
左转45度,位置不变
注解:当角度为45 奇数倍时,前进一步需要向x y轴都需要变化
4,迭代4
forward n step 沿当前方向前进n步, 方向不变
backward n setp 沿当前方向后退n步, 方向不变
repet command n time:将指定的动作(左转右转前进后退,一共8个动作)重复执行N次
二,实现
头文件:
enum {NORTH,NORTHEAST,EAST,EASTSOUTH,SOUTH,SOUTHWEST,WEST,WESTNORTH
};typedef struct Position {int locx, locy;int direc; // 方向,0,1,2,3对应北东南西
} position;typedef enum Command{FORWARD,BACKWARD,TURNRIGHT,TURNLEFT,TURNROUND,TURNRIGHT45DEG,TURNLEFT45DEG,COMMAND_ONE_BUT,FORWARDN,BACKWARDN,COMMAND_TWO_BUT
}Command;void Create();
void Init(int x, int y, int heading);
position GetPosition();
void Forward();
void Backward();
void TurnRight();
void TurnLeft();
void TurnRound();
void TurnRight45deg();
void TurnLeft45deg();
void ForwardN(int n);
void BackwardN(int n);
void Repeat(int m,Command command, ...);
源代码:
#include <stdarg.h>const int dx[]={ -1, -1, 0, 1, 1, 1, 0 , -1};
const int dy[]={ 0, 1, 1, 1, 0, -1, -1, -1 };
static position sp;void Init(int x, int y, int heading)
{sp.locx = x;sp.locy = y;sp.direc = heading;
}void Create()
{Init(0,0,NORTH);
}position GetPosition()
{return sp;
}static void Move(int dis)
{sp.locx += dx[sp.direc] * dis;sp.locy += dy[sp.direc] * dis;
}void Forward()
{Move(1);
}void Backward()
{Move(-1);
}void ForwardN(int n)
{Move(n);
}void BackwardN(int n)
{Move(-n);
}static void Turn(int d)
{sp.direc += d;sp.direc %= 8;
}void TurnRight()
{Turn(2);
}void TurnLeft()
{Turn(6);
}void TurnRound()
{Turn(4);
}void TurnRight45deg()
{Turn(1);
}void TurnLeft45deg()
{Turn(7);
}int isOneParaCommand(Command command)
{return command<COMMAND_ONE_BUT;
}void ExecutCommand(Command command, int n)
{switch(command){case FORWARD:return Forward();case BACKWARD:return Backward();case TURNLEFT:return TurnLeft();case TURNRIGHT:return TurnRight();case TURNROUND:return TurnRound();case TURNLEFT45DEG:return TurnLeft45deg();case TURNRIGHT45DEG:return TurnRight45deg();case FORWARDN:return ForwardN(n);case BACKWARDN:return BackwardN(n);}
}void Execut(Command command, va_list arg)
{int n=0;if (!isOneParaCommand(command)) {n = va_arg(arg, int);}ExecutCommand(command,n);va_end(arg);
}void Repeat(int m,Command command, ...)
{va_list arg;va_start(arg, command);while(m--){Execut(command,arg);}va_end(arg);
}
三,测试用例
#define ASSERT_POSITION(x,y,h) position sp = GetPosition();\GTEST_ASSERT_EQ((x),sp.locx);\GTEST_ASSERT_EQ((y),sp.locy);\GTEST_ASSERT_EQ((h),sp.direc);TEST_F(MockCppTest, get_default_location)
{ASSERT_POSITION(0, 0, NORTH);
}TEST_F(MockCppTest, init_config)
{Init(1, 2, WEST);ASSERT_POSITION(1, 2, WEST);
}TEST_F(MockCppTest, turn_left)
{Init(1, 2, WEST);TurnLeft();ASSERT_POSITION(1, 2, SOUTH);
}TEST_F(MockCppTest, turn_right)
{Init(1, 2, WEST);TurnRight();ASSERT_POSITION(1, 2, NORTH);
}TEST_F(MockCppTest, forward)
{Init(0, 0, WEST);Forward();ASSERT_POSITION(0, -1, WEST);
}TEST_F(MockCppTest, backward)
{Init(0, 0, WEST);Backward();ASSERT_POSITION(0, 1, WEST);
}TEST_F(MockCppTest, turn_round)
{Init(0, 0, WEST);TurnRound();ASSERT_POSITION(0, 0, EAST);
}TEST_F(MockCppTest, turn_left_45degree)
{Init(1, 2, WEST);TurnLeft45deg();ASSERT_POSITION(1, 2, SOUTHWEST);
}TEST_F(MockCppTest, turn_right_45degree)
{Init(1, 2, WEST);TurnRight45deg();ASSERT_POSITION(1, 2, WESTNORTH);
}TEST_F(MockCppTest, forward_to_WESTNORTH)
{Init(0, 0, WESTNORTH);Forward();ASSERT_POSITION(-1, -1, WESTNORTH);
}TEST_F(MockCppTest, forwardN)
{Init(0, 0, WEST);ForwardN(3);ASSERT_POSITION(0, -3, WEST);
}TEST_F(MockCppTest, backwardN)
{Init(0, 0, WEST);BackwardN(5);ASSERT_POSITION(0, 5, WEST);
}TEST_F(MockCppTest, repeat_forward)
{Init(0, 0, WEST);Repeat(10,FORWARD);ASSERT_POSITION(0, -10, WEST);
}TEST_F(MockCppTest, repeat_forward_N)
{Init(0, 0, WEST);Repeat(10,FORWARDN, 5);ASSERT_POSITION(0, -50, WEST);
}
演进式设计——扫地机器人相关推荐
- 扫地机器人水箱背景_你真的懂扫地机器人吗?这些不为人知的小细节值得一看...
扫地机器人在人们的家中可谓十分常见,虽说功能上大相径庭,扫地.拖地永远是它们的主打,但在设计上却有着许多不同,其中更是蕴藏了许多不为人知的巧思.今天,我们就以石头扫地机器人系列产品举例,来看看扫地机器 ...
- 好评度前五的扫地机器人
随着扫地机器人的普及程度越来越高,解决了人们地面清扫的一大难题,如果你是一名朝九晚五,偶尔加班的上班族,那么扫地机器人带来的好处则更加的明显,帮你解决做家务的难题,由此扫地机器人更加受到用户的喜爱. ...
- 扫地机器人湿地_扫地机器人的制作方法
本发明涉及智能家居领域,尤其涉及一种扫地机器人. 背景技术: 计算机技术.微电子技术等方面的快速发展,推动了智能家居在家庭中的应用.随着老百姓生活水平逐渐提高,工作和生活节奏加快,使用可靠.高效的智能 ...
- 选择智能扫地机器人的三个要点
智能扫地机器人选购攻略,智能吸尘器该如何选择.各种智能产品的出现及普及使得人们对人工智能已经并不陌生.近年来,随着科技的飞速发展,各种智能机器产品在其性能上都有了不同程度的较大进步,智能扫地机器人便是 ...
- 基于视觉的扫地机器人导航系统(模块设计)
摘要 自20世纪60年代以来,机器人的各项相关技术取得了巨大的进步.而就扫地机器人而言,扫地机器人受到越来越多家庭的欢迎,国外先进的扫地机器人主要采用了视觉导航技术,而国内在基于视觉导航机器人的应用上 ...
- 基于51单片机的扫地小车,扫地机器人设计 主要功能有寻迹避障,来回清扫功能,往返清扫功能
基于51单片机的扫地小车,扫地机器人设计. 有原理图,程序代码,原文. 可做实物. 主要功能有寻迹避障,来回清扫功能,往返清扫功能. YID:3350665853241481南唐开心的卷柏
- stm32毕设 stm32智能扫地机器人设计与实现
文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2.1 电机驱动 2.2 红外线传感器 2.3 超声波传感器 2.4 MPU6050 2.5 ATK-ESP8266 WI FI 模块 2.6 ...
- 单片机毕设 stm32智能扫地机器人设计与实现
文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2.1 电机驱动 2.2 红外线传感器 2.3 超声波传感器 2.4 MPU6050 2.5 ATK-ESP8266 WI FI 模块 2.6 ...
- 毕设分享 stm32的智能扫地机器人设计与实现 - 单片机 物联网
文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2.1 电机驱动 2.2 红外线传感器 2.3 超声波传感器 2.4 MPU6050 2.5 ATK-ESP8266 WI FI 模块 2.6 ...
最新文章
- 前端 ----jQuery的动画效果
- 特约专栏丨陈纯院士:大规模动态时序图实时处理技术、平台及应用
- MySQL跑在CentOS 6 和 7上的性能比较
- XTUOJ 1206 Dormitory's Elevator
- 【EventBus】EventBus 源码解析 ( 取消订阅 )
- Android中TextView限制一行显示及其它效果
- vue 多选自动触发_Vue,初次邂逅(二)
- 【POJ - 1050】To the Max (dp)
- java监听双按键_java 键盘监听 按一次键监听到两次
- LaTeX设置参考文献条目行距以及条目内行距的方法
- android button imagebutton 区别,android - 可点击的ImageView和ImageButton之间的区别
- 添加七牛云存储_七牛云存储如何正确设置流量带宽告警配置(阈值告警)?
- GLKVector3参考
- html jwt权限控制,SpringBoot+SpringSecurity+JWT实RESTfulAPI权限控制
- Error creating bean with name 'rocketMQTemplate' defined in class path resource
- solr的索引库配置
- IE9如何降级返回IE8
- DSP与FPGA的SRIO通信实现
- 如何下载大同市卫星地图高清版大图
- 《财务共享服务》读书笔记
热门文章
- http://www.xueh188.top/index.php/archives/33/
- Android | ListView、RecyclerView 实现一键回到顶部
- CodeForces 630I Parking Lot (组合计数)
- c语言printf char数组,在C中输出二维char数组的最快方法
- python位运算(、|、^、~、>>、<<)
- mac系统自动登录的方法
- 自动化测试记录--beautifulreport报告改变用例描述
- 自定义VBA函数(Fucntion)怎样才能只被VBA引用?
- B站笔试真题之[编程题]简单表达式计算
- 常见2D和3D视觉算法