如何从一组直线获得曲线的控制点?

时间:2013-11-25 16:19:42

标签: java graphics processing bezier

我有一组n个点组成一条线,但我想有一条曲线而不是一条线。为了在处理中做曲线,有需要的控制点,我想知道我怎么能从n点的集合中获取控制点。我也会拖动曲线,因此我需要一直找到新的控制点?

2 个答案:

答案 0 :(得分:1)

好吧,你基本上可以解析坐标数组并使用它们在Processing中创建一个curveVertex()形状,如下所示:

// create an array of coordinates in x, y, x, y... format
int[] points = {  
  34, 163,
  67, 345,
  474, 84,
  682, 234,
  495, 396,
  174, 379,
  275, 574
};

void setup() {
  size(800, 600);
  smooth();  
  noFill();
}

void draw() {
  background(255);

  draw_curve_from_points(points);  // draw the curve
  draw_handles_on_points(points, 6, 126);  // draw the handles

}

// a function to draw the curve
void draw_curve_from_points(int[] _points) { 
  noFill();
  stroke(0);
  strokeWeight(1);

  int len = _points.length;
  beginShape();
  curveVertex(_points[0], _points[1]);  // the first point is duplicated to be used as control point
  for (int i = 0; i < len; i +=2) {
    curveVertex(_points[i], _points[i+1]);
  }
  curveVertex(_points[len-2], _points[len-1]);  // idem for last point
  endShape();
}

// draw handles on the points
void draw_handles_on_points(int[] _points, float _size, int _gray) {
  int len = _points.length;
  pushStyle();
  noStroke();
  fill(_gray);
  for (int i = 0; i < len; i +=2) {
    ellipse(_points[i], _points[i+1], _size, _size);
  }
  popStyle();
}

只需添加一些鼠标位置识别和鼠标交互来拖动周围的点。

答案 1 :(得分:0)

最简单的方法是将每条曲线视为由两个点和两个向量表示(每个向量从一个端点到达相应的控制点)。曲线将与端点处的矢量平行,因此如果想要避免两条曲线之间的点处的“扭结”,使得与该点相关联的第一曲线的矢量沿与第二曲线的矢量相反的方向。根据点序列可能表示的形状类型,有多种方法可以确定符合上述标准的矢量的方向和长度。一种简单的方法是确定与点相关联的矢量应该与其两侧的点之间绘制的线平行,并且与曲线相关联的矢量应该具有与该曲线的长度成比例的长度(围绕用缩放因子来看你喜欢什么)。请注意,向量越长,曲线越远离端点之间的线,但如果向量太长,则曲线可能会“循环”。