如何计算二次贝塞尔曲线

时间:2014-10-21 07:42:08

标签: java andengine bezier

我想把一些精灵放在路上。我考虑计算bezier路径,然后将精灵放在计算点上。但我无法在java方法中找到它。


解决

这是我绘制图像线的主要方法

private List<Sprite> drawStarLine(Point start, Point end, Point control1, Point control2, int starsCount,TextureRegion pTexture) {
    ArrayList<Sprite> starsForReturn = new ArrayList<Sprite>();
    ArrayList<Point> points = new ArrayList<Point>(generateBezierPath(start, end, control1, control2, starsCount));
    for (int i = 0; i < points.size(); i++) {
        Point p = points.get(i);
        Sprite s = new Sprite((float) p.getX(), (float) p.getY(), pTexture, activity.getVertexBufferObjectManager());
        s.setScale(mainScaleX / 2);
        starsForReturn.add(s);
    }
    return starsForReturn;
}

这就是我计算bezier路径的方法

private List<Point> generateBezierPath(Point origin, Point destination, Point control1, Point control2, int segments) {
    ArrayList<Point> pointsForReturn = new ArrayList<Point>();

    float t = 0;
    for (int i = 0; i < segments; i++) {
        Point p = new Point();
        p.setX(Math.pow(1 - t, 3) * origin.x + 3.0f * Math.pow(1 - t, 2) * t * control1.x + 3.0f * (1 - t) * t * t * control2.x + t * t * t * destination.x);
        p.setY(Math.pow(1 - t, 3) * origin.y + 3.0f * Math.pow(1 - t, 2) * t * control1.y + 3.0f * (1 - t) * t * t * control2.y + t * t * t * destination.y);
        t += 1.0f / segments;
        pointsForReturn.add(p);
    }
    pointsForReturn.add(destination);
    return pointsForReturn;
}

1 个答案:

答案 0 :(得分:0)

只需计算二次曲线坐标(对于位置)和切线(对于方向)。代码很简单。

double[] getPoint(double[] x, double[] y, double t) {
  double mt = 1-t;
  return new double[]{
    x[0]*mt*mt + 2*x[1]*mt*t + x[2]*t*t,
    y[0]*mt*mt + 2*y[1]*mt*t + y[2]*t*t
  };
}

double[] getTangent(double[] x, double[] y, double t) {
  double mt = t-1; // note: NOT 1-t
  return new double[]{
    2*(x[0]*mt - x[1]*(2*t-1) + x[2]*t),
    2*(y[0]*mt - y[1]*(2*t-1) + y[2]*t)
  };
}

将你的“东西”放在从getPoint得到的坐标处,然后如果你需要“跟随”你的路径,旋转你的东西,使它的旅行轴与你离开的切线对齐getTangent。完成。