2

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

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());
4

2 回答 2

2

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

看来您正在寻找的是与所有提供的点相交的样条曲线。不幸的是,Java2D 似乎不支持这种类型的曲线。但是,如果您有一些良好的几何知识(并在 Wikipedia 的帮助下)并且可以浪费一些时间,您可能会实现它。

另一种方法,可能是(虽然我没有尝试过),对于给定的点 Pi 和 Pi+1 与曲线连接,根据前一个和下一个点 Pi-1 和 Pi+2 确定控制点;可能值得研究。

于 2011-06-16T08:31:06.947 回答
1

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

如何创建贝塞尔曲线来表示平滑的折线?

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

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

于 2013-02-20T07:09:48.023 回答