java多边形生成_如何为凹多边形生成回声路径

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

WT20H.png

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

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

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

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

MWoNd.png

我想要做的是生成没有自交叉部分的回波多边形,即没有带虚线的部分 . 算法或 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值