//widget.h
#ifndef WIDGETS
#define WIDGETS#include "common.h"void InitWidget(int argc, char **argv);//前进
void Avance(const char *str);//后退
void Recule(const char *str);//左转
void Gauche(const char *str);//右转
void Droite(const char *str);//清除画面
void Nettoie();//移动机器人
void Allera(const char *str);//提笔
void LeveCrayon();//落笔
void BaisseCrayon();//隐藏机器人
void Cache();//显示机器人
void Montre();void Couleur(const char *str);//操作机器人
void ManipRobot(const char *str);#endif // WIDGETS
//Widgets.c
#include "widgets.h"
#include "common.h"
#include <string.h>
#include <stdio.h>
#include <math.h>extern Widgets g_widgets;void update(Widget w, int width, int height, void *data)
{UNUSED(w);UNUSED(width);UNUSED(height);UNUSED(data);ClearDrawArea();if (g_widgets.robotIsShow){DrawFilledBox(g_widgets.x, g_widgets.y, UUNIT, UUNIT);}for (int i = 0; i < g_widgets.index / 2; i++){DrawLine(g_widgets.point[i*2].x,g_widgets.point[i*2].y + UUNIT / 2,g_widgets.point[i*2+1].x,g_widgets.point[i*2+1].y + UUNIT / 2);}}void Avance(const char *str)
{int n = 0;sscanf(str, "AVANCE %d", &n);if (g_widgets.x + UUNIT * n >= WIDTH)return;//左边旋转或者右边旋转 左边旋转为逆时针 右边旋转为顺时针if (g_widgets.angle < 0 || g_widgets.angle > 0){int l = UUNIT * n;int y2 = g_widgets.y + l * sin(g_widgets.angle * M_PI / 180.0);int x2 = g_widgets.x + l * cos(g_widgets.angle * M_PI / 180.0);//如果为提笔状态 则计算移动的轨迹坐标if (g_widgets.isDrawTrack){g_widgets.point[g_widgets.index].x = x2;g_widgets.point[g_widgets.index].y = y2;}g_widgets.x = x2;g_widgets.y = y2;}else{//如果为提笔状态 则计算移动的轨迹坐标if (g_widgets.isDrawTrack){g_widgets.point[g_widgets.index].x = g_widgets.x + UUNIT * n;g_widgets.point[g_widgets.index].y = g_widgets.y;}g_widgets.x += UUNIT * n;}//如果为提笔状态 则计算移动的轨迹坐标if (g_widgets.isDrawTrack){++g_widgets.index;//得到上一个坐标g_widgets.point[g_widgets.index].x = g_widgets.point[g_widgets.index-1].x;g_widgets.point[g_widgets.index].y = g_widgets.point[g_widgets.index-1].y;++g_widgets.index;}
}void Recule(const char *str)
{int n = 0;sscanf(str, "RECULE %d", &n);if (g_widgets.x - UUNIT * n < 0)return;//左边旋转或者右边旋转 左边旋转为逆时针 右边旋转为顺时针if (g_widgets.angle > 0 || g_widgets.angle < 0){int l = UUNIT * n;int y2 = g_widgets.y + -l * sin(g_widgets.angle * M_PI / 180.0);int x2 = g_widgets.x + -l * cos(g_widgets.angle * M_PI / 180.0);//如果为提笔状态 则计算移动的轨迹坐标if (g_widgets.isDrawTrack){g_widgets.point[g_widgets.index].x = x2;g_widgets.point[g_widgets.index].y = y2;}g_widgets.x = x2;g_widgets.y = y2;}else{//如果为提笔状态 则计算移动的轨迹坐标if (g_widgets.isDrawTrack){g_widgets.point[g_widgets.index].x = g_widgets.x - UUNIT * n;g_widgets.point[g_widgets.index].y = g_widgets.y;}g_widgets.x -= UUNIT * n;}//如果为提笔状态 则计算移动的轨迹坐标if (g_widgets.isDrawTrack){++g_widgets.index;g_widgets.point[g_widgets.index].x = g_widgets.point[g_widgets.index-1].x;g_widgets.point[g_widgets.index].y = g_widgets.point[g_widgets.index-1].y;++g_widgets.index;}
}void Gauche(const char *str)
{int n = 0;sscanf(str, "GAUCHE %d", &n);g_widgets.angle -= n;
}void Droite(const char *str)
{int n = 0;sscanf(str, "DROITE %d", &n);g_widgets.angle += n;
}void Nettoie()
{g_widgets.x = OGX;g_widgets.y = OGY;g_widgets.index = 0;g_widgets.point[g_widgets.index].x = OGX;g_widgets.point[g_widgets.index].y = OGY;g_widgets.robotIsShow = 1;g_widgets.isDrawTrack = 1;g_widgets.angle = 0;++g_widgets.index;
}void Allera(const char *str)
{int x = 0, y = 0;sscanf(str, "ALLERA %d %d", &x, &y);int x1 = x * UUNIT;int y1 = y * UUNIT;//超出边界 不操作if (x1 < 0 || x1 > WIDTH)return;if (y1 < 0 || y1 > HEIGHT)return;g_widgets.x = OGX + (x * UUNIT);g_widgets.y = OGY + (y * UUNIT);
}void LeveCrayon()
{g_widgets.isDrawTrack = 0;
}void BaisseCrayon()
{g_widgets.isDrawTrack = 1;
}void Cache()
{g_widgets.robotIsShow = 0;
}void Montre()
{g_widgets.robotIsShow = 1;
}void Couleur(const char *str)
{char buf[20];sscanf(str, "COULEUR %s", buf);//根据颜色名字得到颜色int color = GetNamedColor(buf);//小于0为无效值if (color < 0)return;//设置颜色SetFgColor(g_widgets.graphics, color);}void ManipRobot(const char *str)
{if (strstr(str, "AVANCE") != NULL){Avance(str);}else if (strstr(str, "RECULE") != NULL){Recule(str);}else if (strstr(str, "LEVE_CRAYON") != NULL){LeveCrayon();}else if (strstr(str, "BAISSE_CRAYON") != NULL){BaisseCrayon();}else if (strstr(str, "CACHE") != NULL){Cache();}else if (strstr(str, "MONTRE") != NULL){Montre();}else if (strstr(str, "GAUCHE") != NULL){Gauche(str);}else if (strstr(str, "DROITE") != NULL){Droite(str);}else if (strstr(str, "NETTOIE") != NULL){Nettoie();}update(g_widgets.graphics, WIDTH, HEIGHT, NULL);
}void btnExecClicked(Widget w, void *data)
{UNUSED(w);UNUSED(data);char *str = GetStringEntry(g_widgets.entryExec);ManipRobot(str);
}void btnReadFileClicked(Widget w, void *data)
{UNUSED(w);UNUSED(data);FILE *fp;char strLine[30];//判断文件是否存在及可读if((fp = fopen("data", "r")) == NULL){return;}//循环读取每一行,直到文件尾while (!feof(fp)){//将fp所指向的文件一行内容读到strLine缓冲区if (fgets(strLine, 30, fp) != NULL){ManipRobot(strLine);}}fclose(fp);
}void InitWidget(int argc, char **argv)
{if (OpenDisplay(argc, argv) == FALSE)return;g_widgets.entryExec = MakeStringEntry(NULL, 300, NULL, NULL);g_widgets.graphics = MakeDrawArea(WIDTH, HEIGHT, update, NULL);g_widgets.btnExec = MakeButton("exec", btnExecClicked, NULL);g_widgets.btnReadFile = MakeButton("readFile", btnReadFileClicked, NULL);SetWidgetPos(g_widgets.graphics, PLACE_UNDER, g_widgets.entryExec, NO_CARE, NULL);SetWidgetPos(g_widgets.btnExec, PLACE_RIGHT, g_widgets.graphics, NO_CARE, NULL);SetWidgetPos(g_widgets.btnReadFile, PLACE_RIGHT, g_widgets.btnExec, NO_CARE, NULL);SetWidgetPos(g_widgets.graphics, PLACE_UNDER, g_widgets.entryExec, NO_CARE, NULL);Nettoie();ShowDisplay();GetStandardColors();MainLoop();
}
//Common.h
#ifndef COMMON_H
#define COMMON_H#include <libsx.h>#define WIDTH   300
#define HEIGHT  300
#define UUNIT   10
#define OGX     WIDTH/2-10
#define OGY     WIDTH/2-10
#define UNUSED(x) (void)x;
#define MAXPOINT 2000typedef struct
{int x;int y;
}Point, *pPoint;typedef struct
{Widget graphics;Widget btnExec;Widget btnReadFile;Widget entryExec;int x;int y;Point point[2000];int index;int robotIsShow;int isDrawTrack;int angle;
}Widgets, *pWidgets;Widgets g_widgets;#endif // COMMON_H
//main.c
#include "widgets.h"int main(int argc, char **argv)
{InitWidget(argc, argv);return 0;
}

基于libsx库实现的模拟机器人运动相关推荐

  1. 文献阅读1:基于旋量理论的串联机器人运动特性研究现状

    从机构学与机器人学的发展历史上来看,机构学与机器人学的发展与数学工具是息息相关的.与机构学与机器人学联系紧密的数学工具有很多:如传统意义上的 线性代数与矩阵理论.用于拓扑结构分析及综合的图论(grap ...

  2. 【IEEE2014】EET:基于采样的机器人运动规划中的平衡勘探与开发

    EET:基于采样的机器人运动规划中的平衡勘探与开发 摘要: 本文提出了一种用于运动规划的探索/利用树(EET)算法.EET规划者故意用概率的完整性来换取计算效率.这种权衡使EET规划器能够比最先进的基 ...

  3. STM32外挂FLASH模拟U盘(基于HAL库)

    STM32外挂FLASH模拟U盘(基于HAL库) 1.背景 1.1这篇文章能给你带来什么 1.2根据你要解决的问题,精确快速跳转到相应位置 1.3我在做完这个后还有不明白的地方,希望能有大触解答困惑 ...

  4. STM32V107VCT6,基于HAL库的用IO口模拟I2C的0.96寸OLED驱动

    前言 作为一个初学者,当然希望有比较好的范例可以学习,但在CSDN和众多家的单片机学习网站,没发现现成的I2C模拟接口的HAL库的0.96寸的OLED驱动,经过努力,把这个代码调试出来,为此,基于技术 ...

  5. 基于ROS实现的机器人运动PID控制器

    下面是一个基于ROS实现的机器人运动PID控制器的例子: 首先,需要定义机器人的运动控制器节点,例如: ros::NodeHandle nh; ros::Publisher cmd_vel_pub = ...

  6. 初中计算机教案3D,基于3D 仿真平台的初中机器人 教学设计

    原标题:基于3D 仿真平台的初中机器人 教学设计 本文发表于 <数字教育> 2018年第5期(总第23期)实践案例栏目,页码:71-77.转载请注明出处. 摘 要:本文采用实践教学法,以社 ...

  7. 基于气动人工肌肉的双足机器人关节设计

    介绍了一种由气动人工肌肉构建的双足机器人关节,该关节利用气动人工肌肉的柔性特性,可以有效控制双足机器人快速行走或跑步时的落地脚冲击问题. 详细给出了气动人工肌肉的工作原理以及由其构成的关节系统的硬件架 ...

  8. 【机器视觉系统】基于3DOF机械臂的五子棋机器人(1)

    基于3DOF机械臂的五子棋机器人 文章目录 基于3DOF机械臂的五子棋机器人 1. 前言 2. 机器视觉系统概述 2.1 机器 2.2 视觉 2.3 系统 3. 系统组成概述 3.1 使用工具盘点 3 ...

  9. 星敏感器 matlab,基于星敏感器的星图模拟与去噪技术研究

    2017年 9月上 论述 247 基于星敏感器的星图模拟与去噪技术研究 刘奕君 ,薄宇阳 (北京市第三十五中学,北京市西城区 100032) [摘 要]随着小卫星应用技术的日趋成熟,测量精度高的 CC ...

最新文章

  1. Smarty模板的基础
  2. 离散傅里叶变换(DFT)(为了使用而学习的DFT)
  3. Koa与Node.js开发实战(1)——Koa安装搭建(视频演示)
  4. c mysql 连接实例_c连接mysql数据库实例
  5. git2.29.2.2怎么安装_MySQL5.5怎么安装
  6. 全国计算机考试光盘,全国计算机一级模拟考试题(光盘).doc
  7. bert性能优化之——用另一种方式整合多头注意力
  8. MyBatis——MyBatis Generator插件使用(配置详解)
  9. librdkafka编译及简单使用过程简介
  10. 仿秒秒测日历页面和部分功能
  11. ODL中的Karaf命令使用
  12. C++ 设计模式 建造者模式(复杂对象的构建与其表示分离)肯德基不同烧鸡的制作过程
  13. 安卓手机更新过程手机乱码_王者荣耀安卓更新更新时出现乱码解决办法
  14. 中国企业数智化价值不高,主要是因为三个问题
  15. D-脱硫生物素dethiobiotinCAS号:533-48-2
  16. win10 win11睡眠后系统无法唤醒解决办法
  17. 【EasyRL学习笔记】第八章 针对连续动作的深度Q网络
  18. 鸿蒙系统生态建设怎样了,鸿蒙系统正式发布-华为OS生态建设开始布局
  19. 20岁以后增高方法大全
  20. vFloppy1.5-虚拟启动软盘

热门文章

  1. 灵遁者:谁来告诉我,生命将走向哪里?
  2. SSM酒店(宾馆)管理系统
  3. 我,30多岁的土木工程人,终于转行了
  4. kaggle房价预测(House Prices: Advanced Regression Techniques)数据内容超级详细整理
  5. 信安实验一:自建CA搭建https
  6. 关于zuul的一些配置说明
  7. 搞科研论文看不懂咋办?
  8. 皮卡丘为什么不进化_神奇宝贝中皮卡丘和喵喵为什么不进化?这些理由扎心了!...
  9. 金额达 500 亿美元,AMD 完成收购赛灵思
  10. 关于双击.py文件闪退的问题