GeneralPath curveTo

时间:2011-06-16 07:08:42

标签: java swing curve

我想知道如何定义控制点,这是我现在所做的,但它实际上效率不高而且曲线不平滑。

MyPoint pointStart = list.get(0);
    path.moveTo(pointStart.getLocationX(), pointStart.getLocationY());
    MyPoint pointEnd = list.get(list.size() - 1);
    for (int i = 1; i < list.size() - 1; i++) {
        MyPoint point = list.get(i);
        if (i % 3 == 0) {
            MyPoint controlPoint1 = list.get(i - 2);
            MyPoint controlPoint2 = list.get(i - 1);
            MyPoint endPoint = point;
            path.curveTo(controlPoint1.getLocationX(), controlPoint1.getLocationY(), controlPoint2.getLocationX(), controlPoint2.getLocationY(), endPoint.getLocationX(), endPoint.getLocationY());
            ((Graphics2D) g).draw(path);
        }
    }
    path.lineTo(pointEnd.getLocationX(), pointEnd.getLocationY());

2 个答案:

答案 0 :(得分:2)

GeneralPath.curveTo()使用Bézier curves,其控制点不应该是曲线本身的一部分,而是在这里确定曲线在端点处的拐点(如下所示)在以前的维基百科链接上绘制的曲线。)

您正在寻找的是spline curve,它与所有提供的点相交。不幸的是,Java2D似乎不支持这种类型的曲线。但是你可以实现它,如果你有一些好的几何知识(并且在维基百科的帮助下)并且有时间浪费。

另一种方式,可能是(我还没试过),对于给定的一对点Pi&amp; Pi + 1用曲线连接,根据前一个和下一个点Pi-1和Pi + 2确定控制点;可能值得调查。

答案 1 :(得分:1)

这个问题在以下文章中有所涉及。我首先看到了这个帖子,所以我为其他来这里的人添加链接。

How do I create a Bezier curve to represent a smoothed polyline?

这篇文章的第一个答案给出了如何建立'好'贝塞尔控制点的一个很好的解释。我使用了类似的方法并得到了很好的结果,即平滑的曲线。

前一个答案的最后一段基本上描述了构建贝塞尔曲线(许多样条曲线之一)。

相关问题