我需要一个算法来绘制任意多边形的回声路径 . 如果多边形是凸的问题很容易解决 . 要理解我的意思,请看下面的图片,其中黑色是原始多边形,红色是从原始多边形生成的回声多边形 .

d 是给定的回波路径之间的距离

知道我们所拥有的顶点坐标,很容易计算出角度

因此,您可以看到每个顶点我们可以计算 L ,从而为下一个回波路径提供新的顶点 .

问题是当我们在某一点上有凹多边形时,我们会得到一个自交叉多边形的丑陋图像 . 请看一下这张照片 .

我想要做的是生成没有自交叉部分的回波多边形,即没有带虚线的部分 . 算法或 java 代码将非常有用 . 谢谢 .

Edit

只需添加一段代码,为评论中提出的凸多边形生成回声路径 .

public List createEchoCoCentral( List pointsOriginal, float encoderEchoDistance, int appliqueEchoCount){

List contourPoints = pointsOriginal;

List echoPaths = new ArrayList<>();

for (int round = 0; round < appliqueEchoCount; round++) {

List echoedPoints = new ArrayList<>();

int size = contourPoints.size()+1;//+1 because we connect end to start

Point previousPoint = contourPoints.get(contourPoints.size() - 1);

for (int i = 0; i < size; i++) {

Point currentPoint;

if (i == contourPoints.size()) {

currentPoint = new Point(contourPoints.get(0));

} else {

currentPoint = contourPoints.get(i);

}

final Point nextPoint;

if (i + 1 == contourPoints.size()) {

nextPoint = contourPoints.get(0);

} else if (i == contourPoints.size()) {

nextPoint = contourPoints.get(1);

} else {

nextPoint = contourPoints.get(i + 1);

}

if (currentPoint.x == previousPoint.x && currentPoint.y == previousPoint.y) continue;

if (currentPoint.x == nextPoint.x && currentPoint.y == nextPoint.y) continue;

// signs needed o determine to which side of polygon new point will go

float currentSlope = (float) (Math.atan((previousPoint.y - currentPoint.y) / (previousPoint.x - currentPoint.x)));

float signX = Math.signum((previousPoint.x - currentPoint.x));

float signY = Math.signum((previousPoint.y - currentPoint.y));

signX = signX == 0 ? 1 : signX;

signY = signY == 0 ? 1 : signY;

float nextSignX = Math.signum((currentPoint.x - nextPoint.x));

float nextSignY = Math.signum((currentPoint.y - nextPoint.y));

nextSignX = nextSignX == 0 ? 1 : nextSignX;

nextSignY = nextSignY == 0 ? 1 : nextSignY;

float nextSlope = (float) (Math.atan((currentPoint.y - nextPoint.y) / (currentPoint.x - nextPoint.x)));

float nextSlopeD = (float) Math.toDegrees(nextSlope);

//calculateMidAngle - is a bit tricky function that calculates angle between two adjacent edges

double S = calculateMidAngle(currentSlope, nextSlope, signX, signY, nextSignX, nextSignY);

Point p2 = new Point();

double ew = encoderEchoDistance / Math.cos(S - (Math.PI / 2));

p2.x = (int) (currentPoint.x + (Math.cos(currentSlope - S)) * ew * signX);

p2.y = (int) (currentPoint.y + (Math.sin(currentSlope - S)) * ew * signX);

echoedPoints.add(p2);

previousPoint = currentPoint;

}

//createPathFromPoints just creates MyPath objects from given Poins set

echoPaths.add(createPathFromPoints(echoedPoints));

//remove last point since it was just to connect end to first point

echoedPoints.remove(echoedPoints.size() - 1);

contourPoints = echoedPoints;

}

return echoPaths;

}

java多边形生成_如何为凹多边形生成回声路径相关推荐

  1. java多边形填充_关于java:从图像(填充形状)生成多边形

    我正在尝试从预处理的世界地图生成多边形, 到目前为止,我所做的是: 1:为每个国家/地区生成等高线图,如下所示: 从这里开始,我用这些随机颜色填充了这些国家中的每个国家: 到目前为止,香港专业教育学院 ...

  2. 用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...

    最近在做一个https双向认证的工作,领导先让我实现,我之前写了一篇文章,把tomcat的生成证书和配置的实现写了出来. 现在领导给了我服务器的CA证书的客户端证书和私钥,服务端信任证书,分别是crt ...

  3. java 手绘_用普通照片生成手绘素描

    Java对图像的处理,具有相当强的表现能力,下列程序可以将普通照片生成类似于手绘的素描. import java.awt.color.ColorSpace; import java.awt.image ...

  4. java语言生成语法分析_语法分析器自动生成工具一览

    最近打算重做以前的一个留下遗憾的工作,当中的一项小任务就是要求编写一个简易SQL语言的语法分析器. 本科的<编译原理>课程依稀在我脑中留下些许映象.当初的课程大作业是写一个叫Dicuf(貌 ...

  5. java唯一码_唯一邀请码生成(Java版本)

    前言 之前收到一个需求,甲方说,他们想给用户生成一个唯一的邀请码,然后用户量在xxx之类的,例如我这里就随便说个5kw个吧.这个嘛,听起来都觉得挺简单的,毕竟每个用户基本上都有自己的唯一用户id,用那 ...

  6. eladmin代码自动生成_高效代码自动化生成

    最效率的代码自动化 前言 今天我们来看一下springboot中使用mybatis来自动生成代码,以前做ssh框架的时候实体和映射经常自己新建,浪费大量的时间,不过hibernate,到现在还是那么的 ...

  7. python ppt自动生成_实战 | Python自动生成PPT调研报告

    原标题:实战 | Python自动生成PPT调研报告 原文: 全文约 3821 字,读完可能需要 5 分钟. 文/JSong @2017.02.28 在数据分析里面有一句话是说,80%的时间要用于数据 ...

  8. python RTL自动生成_利用python自动生成证件照

    又到了一次交个人信息表的时候了,在word照片框贴照片时发现自己之前放在e盘的电子照片不见了,我丢.之前去照相馆就只留了一张底片,疫情当前(打游戏懒得出门),作为时代好青年,出门拍照是不可能的,为一张 ...

  9. c++ ea 代码 生成_看EA如何生成代码框架

    EA的使用给我们带来了极大的方便,同时,在对EA不断的深入使用过程中,我们也一步步的对其功能有了深层次的了解,这次我学到的新功能,就是通过EA,将类图转换成代码框架,这是如何做到的呢? 代码工程设置 ...

  10. python评语生成_电商 Python 生成补单公司需要的评论格式3

    一.整理一个包含刷单信息的excel excel的名字:excel_comment.xlsx excel的列名:买家会员名收货人金额评论 二.生成好的评论 注意:两边的数据条数必须一样,比如:有5个刷 ...

最新文章

  1. 我用Java+SeimiCrawler+Redis+ES+Kibana技术对数百万知乎用户进行了数据分析,得到了这些......
  2. java void方法_Java对象类的最终void wait(long ms)方法,包含示例
  3. zabbix mysql设置中文乱码_解决zabbix监控因php问题导致图形界面中文乱码方法
  4. springcloud 系列教程一:微服务与网站架构演变过程
  5. (80)FPGA复位激励(function)
  6. 深度学习自学(一):Loss function 损失函数
  7. 西方主要管理思想简介
  8. 2021年中国国家级高新区 (科技园)数量、产值及营业收入分析[图]
  9. 聊聊软件开发的REP、CCP、CRP原则
  10. iOS软键盘弹出后视图向上移动
  11. cortana连不上网络_Alexa,为什么Cortana仍在我的计算机上?
  12. 计算机毕业设计springboot+uniapp点餐外卖系统源码
  13. 量子计算 3 量子门与测量
  14. Redis之sql缓存
  15. 你要相信没有到不了的明天
  16. Java技术原理详解
  17. 创维e900v21e芯片_创维e900v21e网络机顶盒强制刷机教程及注意事项
  18. 关于硅胶按键丝印的表面问题及解决办法
  19. Unity基础学习六,网络同步
  20. 安卓版华为主题解析软件 一键解析收费主题

热门文章

  1. (四十七) 蓝牙自拍杆原理学习
  2. MyBatis 插件原理与实战
  3. shell学习教程(超详细完整)
  4. 基于Matlab的海洋监视雷达检测仿真(附源码)
  5. Python:Django面试题
  6. Linux内核panic到ramdump基本流程
  7. Maple_Vanderpol方程_摄动法公式符号推导
  8. 云时代的“双态IT”运维思路
  9. sudo chmod 755 ....指令分析
  10. 晶体管放大电路与Multisim仿真学习笔记