我有一组n个点组成一条线,但我希望有一条曲线而不是一条线。在处理曲线时,需要控制点,我想知道如何从n个点上的集合中获得控制点。此外,我会拖动曲线,因此我需要一直寻找新的控制点?
好吧,你基本上可以解析坐标数组,并使用它们在处理中创建一个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();
}
只需添加一些鼠标位置识别和鼠标交互即可拖动点。
最容易将每条曲线想象为由两个点和两个向量表示(每个向量从一个端点到其相应的控制点)。曲线将与端点处的向量平行,因此,如果希望避免在两条曲线之间的某个点处出现"扭结",则与该点关联的第一条曲线的向量将与第二条曲线的矢量相反。根据点序列可能表示的形状类型,有多种方法可以根据上述标准决定向量的方向和长度。一种简单的方法是计算与一个点相关的向量应该平行于在其两侧的点之间绘制的线,并且与曲线相关的向量的长度应该与该曲线的长度成比例(使用缩放因子来查看您喜欢的内容)。请注意,向量越长,曲线偏离端点之间的直线的距离就越远,但如果向量太长,曲线可能会"弯曲"。