用Java计算Bezier曲线的周长

时间:2012-02-12 01:34:28

标签: java bezier curve

似乎Java中没有任何方法可以计算二次贝塞尔曲线的周长......或者至少我不认识它。

我在stackoverflow中搜索,我发现的只是其他编程语言中的方法。 如果有人能帮助我找到任何可以解决这个问题的库(或者只是一些数学解释,以便将其移植到Java),我将非常感激。

很抱歉,如果这是一个显而易见的问题,但我只是一个业余程序员而且对几何知识知之甚少。

抱歉(再次)为我糟糕的英语

感谢您的时间! :)

P.D。:周长=新标签? WAT

修改 Ooook,Google搜索得更好(感谢stackoverflow缺少“外围”标签......而且这......是......讽刺的)并找到这个: http://segfaultlabs.com/docs/quadratic-bezier-curve-length

计算长度是一种沉重而精确的方法。该网页甚至包括C

中的实现示例

2 个答案:

答案 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);
  }
}