我想知道如何定义控制点,这是我现在所做的,但它实际上效率不高而且曲线不平滑。
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());
答案 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?
这篇文章的第一个答案给出了如何建立'好'贝塞尔控制点的一个很好的解释。我使用了类似的方法并得到了很好的结果,即平滑的曲线。
前一个答案的最后一段基本上描述了构建贝塞尔曲线(许多样条曲线之一)。