当前位置: 首页 > 知识库问答 >
问题:

如何为凹多边形生成回波路径

韩华美
2023-03-14

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

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

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

我想做的是生成没有自交叉部分的回波多边形,即没有带有虚线的部分。一个算法或Java代码将非常有帮助。多谢了。

编辑

只是添加了一段代码,生成凸多边形的回波路径,就像注释中要求的那样。

public List<MyPath> createEchoCoCentral( List<Point> pointsOriginal, float encoderEchoDistance, int appliqueEchoCount){

    List<Point> contourPoints = pointsOriginal;
    List<MyPath> echoPaths = new ArrayList<>();
    for (int round = 0; round < appliqueEchoCount; round++) {

        List<Point> 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;
}

共有2个答案

韶硕
2023-03-14

这个问题叫做计算多边形偏移。解决这个问题有两种常见的方法:

1)最有效的方法是通过计算缠绕数来计算偏置多边形(据我了解,这个算法是Clipper库使用的)

2)计算直线骨架图,帮助您建立偏移多边形

关于这个主题的有趣文章:

Chen,通过计算缠绕数实现多边形偏移

计算直线骨架Felkel算法

卓俊晖
2023-03-14

你在找笔直的骷髅:

null

 类似资料:
  • 我有一个二维点的列表,它是一个闭环,二维,凹形多边形。 我想生成第二个多边形,它完全在第一个多边形的内部,并且第一个多边形的每个顶点/边缘到第二个多边形的每个顶点/边缘具有恒定的距离。 基本上,第一个多边形是“外墙”,第二个多边形是“内壁”,两墙之间的距离不变。 怎么做这样的事?

  • 我有一组点(英国完整的邮政编码中心)。邮政编码与邮政编码扇区和邮政编码区之间存在等级关系。原来的扇区和区是毗连的。我希望推导出扇区和地区的近似边界,这样国家的任何部分都正好属于一个扇区和一个地区,所有得到的多边形理想地应该是连续的,而且(显然?)所有原点都应该在适当的多边形中。有没有合适的算法?更好的是,是否有一些适当的实现? 我想我一定解释得很差,因为我不认为这回答了我的问题。 让我们只谈部门,

  • 问题内容: 而闭合多边形的坐标是 . 我要区域边界 通过使用opencv裁剪的凹多边形。我找了其他类似的 但我没能找到正确的答案。所以我才这么问? 你能帮助我吗。 任何帮助都将不胜感激。!!! 问题答案: 步骤 使用多边形点查找区域 使用多边形点创建遮罩 做口罩修剪 如果需要,添加白色背景 代码:

  • 请问各位大佬 这种样式可以怎么画出来呢

  • 我正在用JavaScript(http://www.isogenicengine.com/demos/1.1.0/lander/)编写一个简单的月球着陆器克隆,而不是只有高低的基本景观,我想要一个算法来生成随机的洞穴状空间。给定一个矩形区域来处理[0,0,1920,1200],该算法应该能够生成如下图所示的内容。理想情况下,任何一个洞穴区域的“入口”都应该有一个设定的宽度,以便着陆器可以进入“内部

  • 我一直到这里。 底边如何曲线?感谢任何帮助。