合肥工业大学机器人技术期末_机器人技术第三次作业(HFUT)

第三次作业

本人代码水平十分有限,仅供参考,有错误请指出

java源码:

package robathomework3;

import java.lang.Math;

//点类

class point {

double x = 0;

double y = 0;

point(double x, double y) {

this.x = x;

this.y = y;

}

void print() {

System.out.println("(" + x + "," + y + ")");

}

}

//圆类,给定圆心点和半径R即可确定唯一一个圆

class Circle {

private double x;

private double y;

private double r;

//构造函数,用point对象和一个double变量初始化

public Circle(point point, double R) {

this.x = point.x;

this.y = point.y;

this.r = R;

}

public double getX() {

return x;

}

public void setX(double x) {

this.x = x;

}

public double getY() {

return y;

}

public void setY(double y) {

this.y = y;

}

public double getR() {

return r;

}

public void setR(double r) {

this.r = r;

}

public void print() {

System.out.println("(" + this.x + "," + this.y + ")" + this.r);

}

}

//计算类

class Function {

// 初始化,防止Nullpointer异常

private Circle c1 = new Circle(new point(0, 0), 0);

private Circle c2 = new Circle(new point(0, 0), 0);

// deg1/2是储存以自身为中心的极角

private double deg1;

private double deg2;

//构造函数,截取字符串,初始化各个变量

public Function(String s) {

String[] s1 = s.substring(1, s.indexOf(")")).split(" ");

String[] s2 = s.substring(s.indexOf(")") + 3, s.length() - 1).split(" ");

this.c1 = new Circle(Getpoint(s1[0]), Double.parseDouble(s1[1]));

this.c2 = new Circle(Getpoint(s2[0]), Double.parseDouble(s2[1]));

this.deg1 = Double.parseDouble(s1[2]);

this.deg1 = Double.parseDouble(s2[2]);

}

//通过字符标志返回点

public point Getpoint(String p) {

switch (p) {

case "P1":

return new point(-52.5, -32);

case "P2":

return new point(-52.5, 32);

case "P3":

return new point(52.5, 32);

case "P4":

return new point(52.5, -32);

case "P5":

return new point(0, -32);

case "P6":

return new point(0, 32);

case "P7":

return new point(-30, -7);

case "P8":

return new point(-30, 7);

case "P9":

return new point(30, 7);

case "P10":

return new point(30, -7);

case "C":

return new point(0, 0);

case "G1":

return new point(-52.5, 0);

case "G2":

return new point(52.5, 0);

case "T1":

return new point(2, 0);

case "T2":

return new point(0, 1);

default:

return new point(0, 0);

}

}

//判断两个圆有几个交点

public int Judeg() {

double d = Math.sqrt(

(c1.getX() - c2.getX()) * (c1.getX() - c2.getX()) + (c1.getY() - c2.getY()) * (c1.getY() - c2.getY()));

if (this.c1.getR() + this.c2.getR() < d) {

return 0;

} else if (this.c1.getR() + this.c2.getR() == d) {

return 1;

} else {

return 2;

}

}

//关键方法,如果有两个交点,判断哪个交点是机器人所在位置

//主要思路:假定机器人所在位置是坐标原点,建立一个直角坐标系,通过给定的两个点,可分别求出其在上述坐标轴中,与机器人所在点形成的连线与X轴的夹角

//此夹角配合给定的自身极角,就可以分别计算出头部在此坐标系中面向的角度。

//理论上,正确的位置,两个定点求出的头部方向应该相同,但是,计算难免有误差,因此我想到,用这两个 头部角度做差

//理论上的正确位置的差,就算计算有误差,其值应该也比非正确位置上的差小。这样,通过比较差值,便可选择到正确的点。

public double IsMyPoint(point point) {

double deg_1 = 0, deg_2 = 0;

deg_1 = Math.acos(Math.abs((c1.getX() - point.x) / Math

.sqrt((c1.getX() - point.x) * (c1.getX() - point.x) + (c1.getY() - point.y) * (c1.getY() - point.y))));

deg_1 = Math.toDegrees(deg_1);

deg_2 = Math.acos(Math.abs((c2.getX() - point.x) / Math

.sqrt((c2.getX() - point.x) * (c2.getX() - point.x) + (c2.getY() - point.y) * (c2.getY() - point.y))));

deg_2 = Math.toDegrees(deg_2);

//以机器人自身为原点建立坐标系,为了保证角度计算的一致性,我们可以讨论顶点落在的象限,就可以统一角度

//这里我规定了逆时针方向为增,同时所有象限的角都为正,即从x轴正方向开始,0-360.

//而机器人的视野角度是规定的逆时针为负,因此可以看到,后面是减去机器人的自身极角的

if (point.x <= c1.getX() && point.y <= c1.getY()) {

;

} else if (point.x > c1.getX() && point.y <= c1.getY()) {

deg_1 = 180 - deg_1;

} else if (point.x > c1.getX() && point.y > c1.getY()) {

deg_1 = 180 + deg_1;

} else {

deg_1 = 360 - deg_1;

}

if (point.x <= c2.getX() && point.y <= c2.getY()) {

;

} else if (point.x > c2.getX() && point.y <= c2.getY()) {

deg_2 = 180 - deg_2;

} else if (point.x > c2.getX() && point.y > c2.getY()) {

deg_2 = 180 + deg_2;

} else {

deg_2 = 360 - deg_2;

}

deg_1 = deg_1 - this.deg1;

deg_2 = deg_2 - this.deg2;

// System.out.println(deg_1);

// System.out.println(deg_2);

if (deg_1 < 0) {

deg_1 = 360 - deg_1;

}

if (deg_2 < 0) {

deg_2 = 360 - deg_2;

}

return Math.abs(deg_1 - deg_2);

}

//计算函数,计算交点,配合上述选择交点的函数,返回一个正确位置

public point GetIntersection() {

double a = 0, b = 0, c = 0;

// double d =Math.sqrt((c1.getX()-c2.getX())+(c1.getY()-c2.getY()));

double x1 = 0, y1 = 0, x2 = 0, y2 = 0;

if (c1.getY() != c2.getY()) {

double A = (c1.getX() * c1.getX() - c2.getX() * c2.getX() + c1.getY() * c1.getY() - c2.getY() * c2.getY()

+ c2.getR() * c2.getR() - c1.getR() * c1.getR()) / (2 * (c1.getY() - c2.getY()));

double B = (c1.getX() - c2.getX()) / (c1.getY() - c2.getY());

a = 1 + B * B;

b = -2 * (c1.getX() + (A - c1.getY()) * B);

c = c1.getX() * c1.getX() + (A - c1.getY()) * (A - c1.getY()) - c1.getR() * c1.getR();

if (Judeg() == 2) {

x1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);

x2 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);

y1 = A - B * x1;

y2 = A - B * x2;

if (IsMyPoint(new point(x1, y1)) < IsMyPoint(new point(x2, y2))) {

return new point(x1, y1);

} else {

return new point(x2, y2);

}

} else if (Judeg() == 1) {

return new point(-b / (2 * a), A - B * x1);

} else {

System.out.println("两个圆不相交");

return null;

}

} else if (c1.getX() != c2.getX()) {

// 当y1=y2时,x的两个解相等

x1 = x2 = (c1.getX() * c1.getX() - c2.getX() * c2.getX() + c2.getR() * c2.getR() - c1.getR() * c1.getR())

/ (2 * (c1.getX() - c2.getX()));

a = 1;

b = -2 * c1.getY();

c = c1.getY() * c1.getY() - c1.getR() * c1.getR() + (x1 - c1.getX()) * (x1 - c1.getX());

if (Judeg() == 2) {

y1 = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);

y2 = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);

if (IsMyPoint(new point(x1, y1)) < IsMyPoint(new point(x2, y2))) {

return new point(x1, y1);

} else {

return new point(x2, y2);

}

} else if (Judeg() == 1) {

y1 = y2 = -b / (2 * a);

return new point(x1, y1);

} else {

System.out.println("两个圆不相交");

return null;

}

} else {

System.out.println("两圆心重合");

return null;

}

}

}

public class RobatHomework3 {

public static void main(String args[]) {

// 返回的是一个点对象

Function function = new Function("(C 2 0) (T1 2 60)");

function.GetIntersection().print();

Function function2 = new Function("(C 2 0) (T1 2 -60)");

function2.GetIntersection().print();

Function function3 = new Function("(P7 7 0) (P8 7 -180)");

function3.GetIntersection().print();

Function function4 = new Function("(P8 22 0) (P7 15 30)");

function4.GetIntersection().print();

Function function5 = new Function("(P6 30 0) (P3 22.5 180)");

function5.GetIntersection().print();

}

}

运行效果图:

输入数据分别为:

(C 2 0) (T1 2 60) 其中T1(2,0)

(C 2 0) (T1 2 -60)

(P7 7 0) (P8 7 -180)

(P8 22 0) (P7 15 30)

(P6 30 0) (P3 22.5 180)

所用公式:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化

java se 导原码我很自豪&#xff0c;像其他专业团队成员一样&#xff0c;是采用OpenJDK的成员之一&#xff0c;但是从过去8个月就加入了&#xff0c;我们经历了Java SE 8 开发&#xff0c;编译&#xff0c;编码&#xff0c;讨论等各个阶段&#xff0c;直到将其付诸实践为止。 。…

linux将日期和日历信息追加到文件中_Linux任务调度

crontab 任务调度crontab 进行定时任务的设置概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序。任务调度分类&#xff1a;1.系统工作&#xff1a;有些重要的工作必须周而复始地执行&#xff0c;如病毒扫描等 。2.个别用户工作&#xff1a;个别用户可能希望…

android sdk build-tools_从零开始仿写一个抖音App——视频编辑SDK开发(一)

本文首发于微信公众号——世界上有意思的事&#xff0c;搬运转载请注明出处&#xff0c;否则将追究版权责任。交流qq群&#xff1a;859640274。大家好久不见&#xff0c;又有一个多月没有发文章了。不知道还有哪些读者记得我的 从零开始仿写抖音App 的系列文章&#xff0c;这个…

爱默生E系列服务器机柜托盘,艾默生通信电源PS48300-3B/1800 一体化室内机柜

PS48300-3B/1800电源系统PS48300-3B/1800电源系统是艾默生网络能源集多年开发和网上运行经验&#xff0c;采用 DSP控制技术&#xff0c;为满足3G网络需求而设计的高可靠、高功率密度、高性能、全数 字化通信电源系统。根据交流配电和机柜高度。一、特点 1、休眠节能专利技术&am…

功能Java示例 第8部分–更多纯函数

这是第8部分&#xff0c;该系列的最后一部分称为“ Functional Java by Example”。 我在本系列的每个部分中发展的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在上一期文章中&#xff0c;我们已经使用Vavr库看到了一些模式匹配&#xff0c;并且还将故障也视为数据…

tensorflow 小于_坐姿不对,屏幕就变模糊!教你用TensorFlow做一款“隐形背背佳”...

大数据文摘出品作为一个上班族&#xff0c;每天坐在电脑前那么久&#xff0c;难免出现腰酸背痛的情况&#xff0c;时间长了甚至脊柱都歪曲变形了&#xff0c;这可不行&#xff01;一定要克制住自己的坐姿。这里有款“隐形背背佳”&#xff0c;要不要了解一下&#xff1f;一位名…

python处理csv文件列错位_CSV文件分割与列异常处理的python脚本

#codingutf-8 ‘‘‘脚本说明 用来解决csv文件的列异常问题&#xff08;以逗号分隔符为例&#xff09;&#xff1a; csv文件有些列含有换行符、逗号等特殊符号&#xff0c;这就导致csv文件出现列异常的情况。 此脚本将csv文件输出成如下文件&#xff1a;源文件名-正确列-文件序…

文本分类和提取关键词算法_文本内容之间的关键词提取和相似度计算

文本分类和提取关键词算法背景 Web应用程序变得越来越智能。 从网站上使用服务的日子已经一去不复返了&#xff0c;用户不得不填写一个巨大的表格。 假设您有一个适合书迷的网站。 在Web 2.0之前&#xff0c;像这样的网站曾经以诸如年龄&#xff0c;阅读的书籍&#xff0c;喜欢…

python里随机抽取样本_概率分布和抽样分布基础知识及Python实现

本文主要介绍推论统计中的概率分布和抽样分布,本文结构如下: 一、概率分布 随机变量:在一定条件下,某件事情可能发生或者不发生,这个事件就叫随机事件。例如抛硬币哪面朝上。随机变量X就是用来量化随机事件的函数,是将随机事件每一个可能出现的结果映射到数值的一个函数。…

php 创建目录_使用SMB绕过PHP远程文件包含限制

译文声明本文是翻译文章&#xff0c;文章原作者mannulinux&#xff0c;文章来源&#xff1a;mannulinux.org 原文地址&#xff1a;http://www.mannulinux.org/2019/05/exploiting-rfi-in-php-bypass-remote-url-inclusion-restriction.html译文仅供参考&#xff0c;具体内容表达…

eas系统服务器地址,EAS7.0EAS7.5服务端及其客户端标准配置介绍

金蝶EAS是基于JavaEE的大型企业应用。目前服务端支持以下主流软硬件环境。适用版本&#xff1a;EAS7.0 EAS703 EAS7.51.金蝶EAS服务端支持的软硬件环境注&#xff1a;标志为部署支持的环境&#xff0c;可以正常安装配置&#xff0c;但是正式运行前需联系金蝶技术支持。2.客户端…

Java的Kafka:构建安全,可扩展的消息传递应用程序

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 当今的用户希望可以通过其计算机&#xff0c;手机&#xff0c;平板电脑或任何其他设备访问您的应用程序&#xff01; …

background复合属性顺序_CSS有哪些好用的字体属性?

本文创建于2020年9月&#xff0c;以下为正文&#xff1a;CSS中有哪些字体属性呢&#xff1f;font&#xff1a;复合属性。设置或检索对象中的文本特征。font-style&#xff1a;设置或检索对象中的字体样式。用于定义字体的风格&#xff0c;如&#xff1a;斜体&#xff08;italic…

转译和编译_10个有趣又能编译为JavaScript的语言,你用过哪些?

点击上方“IT平头哥联盟”&#xff0c;选择“置顶或者星标”你的关注意义重大&#xff01;来源&#xff1a;https://www.sitepoint.com/现代应用相比普通的网页有不同的要求。但是浏览器是一个有着一套(大部分)固定可用的技术的平台&#xff0c;JavaScript依然是web应用的核心语…

OPC服务器如何采集设备的信息,如何将OPC服务器采集的设备数据转为MQTT方式,实现云端发布或订阅...

通过与PLC、智能仪表等硬件设备&#xff0c;以及OPC服务器、数据库等软件建立通讯&#xff0c;进行实时数据采集监控&#xff0c;然后将相关数据转换为数据库、OPC&#xff0c;以及MQTT、HTTP等多种服务接口&#xff0c;实现各类自动化与信息化系统软件灵活对接。MQTT智能网关案…

jboss7 关闭日志打印_使用自定义日志记录处理程序在JBoss AS 7中跟踪SQL语句

jboss7 关闭日志打印使用ORM从您的特定数据库中提取数据并让其创建和发布您必须亲自编写的所有SQL语句似乎很方便。 这就是使ORM解决方案受欢迎的原因。 但是它也有一个缺点&#xff1a;由于ORM为您做了很多工作&#xff0c;您在某种程度上失去了对生成SQL的控制&#xff0c;因…

微信小程序摄像头监控_微信必备黑科技小程序!

↑点击上方蓝字关注极物推荐欢迎分享到朋友圈-不花冤枉钱&#xff0c;历史见真谛对于喜欢购物的朋友们&#xff0c;这绝对是一把利器。只需把商品链接复制粘贴到上面&#xff0c;就可以轻松的查阅到该商品的历史价格&#xff0c;轻松直观的了解商品过去的价格波动&#xff0c;同…

无线打印 airprint 服务器,如何让 Windows 的共享打印机支持 AirPrint

对很多办公室环境来说&#xff0c;局域网共享打印机往往都是刚需&#xff0c;而如果局域网内的设备大多为 Windows 设备&#xff0c;通过 网络共享 的方式就可以轻松将所连接的 USB 打印机共享到局域网。但对同一个局域网内的 Apple 设备而言&#xff0c;因为很多打印机的 Mac …

硒测试中所需的功能和示例

所需功能是用于声明一组基本要求&#xff08;例如浏览器&#xff0c;操作系统&#xff0c;浏览器版本等的组合&#xff09;的类&#xff0c;以对Web应用程序执行自动跨浏览器测试。 当我们尝试通过Selenium自动化测试来自动化测试脚本时&#xff0c;我们需要考虑这些组合&…

边沿触发是什么意思_集基耦合双稳电路,集成化单稳电路,数字逻辑电路,门电路,触发器...

1).箝位器能把脉冲电压维持在某个数值上而使波形保持不变的电路称为箝位器。它也是整形电路的一种。例如电视信号在传输过程中会造成失真&#xff0c;为了使脉冲波形恢复原样&#xff0c;接收机里就要用箝位电路把波形顶部箝制在某个固定电平上。下图中反相器输出端上就有一个箝…