似乎Java中没有任何方法可以计算二次贝塞尔曲线的周长......或者至少我不认识它。
我在stackoverflow中搜索,我发现的只是其他编程语言中的方法。 如果有人能帮助我找到任何可以解决这个问题的库(或者只是一些数学解释,以便将其移植到Java),我将非常感激。
很抱歉,如果这是一个显而易见的问题,但我只是一个业余程序员而且对几何知识知之甚少。
抱歉(再次)为我糟糕的英语
感谢您的时间! :)
P.D。:周长=新标签? WAT
修改 Ooook,Google搜索得更好(感谢stackoverflow缺少“外围”标签......而且这......是......讽刺的)并找到这个: http://segfaultlabs.com/docs/quadratic-bezier-curve-length
计算长度是一种沉重而精确的方法。该网页甚至包括C
中的实现示例答案 0 :(得分:0)
您使用周边这个词表示您正在寻找边界形状。
立方 Bezier的边界四边形是由四个控制点定义的四边形。
二次贝塞尔曲线的边界三角形是由三个控制点定义的三角形。
但是,您发布的链接似乎正在讨论Bézier的长度。如果那是你真正想要的,那么我建议你把它作为答案发布并接受它。
维基百科上的Bézier curves很好的参考。
答案 1 :(得分:0)
这是您在Java中提供的链接上C代码的忠实翻译。请注意,它完全未经测试。我建议进一步重构以改进类和参数名称。
public class Bezier {
public static class v {
public double x;
public double y;
public v(double x, double y) {
this.x = x;
this.y = y;
}
}
public static double length(v p0, v p1, v p2) {
v a = new v(p0.x - (2 * p1.x) + p2.x, p0.y - (2 * p1.y) + p2.y);
v b = new v((2 * p1.x) - (2 * p0.x), (2 * p1.y) - (2 * p0.y));
double A = 4 * (a.x * a.x + a.y * a.y);
double B = 4 * (a.x * b.x + a.y * b.y);
double C = b.x * b.x + b.y * b.y;
double Sabc = 2 * Math.sqrt(A + B + C);
double A_2 = Math.sqrt(A);
double A_32 = 2 * A * A_2;
double C_2 = 2 * Math.sqrt(C);
double BA = B / A_2;
return (A_32 * Sabc + A_2 * B * (Sabc - C_2) + (4 * C * A - B * B) * Math.log((2 * A_2 + BA + Sabc) / (BA + C_2))) / (4 * A_32);
}
}