如何找到贝塞尔曲线的中点?
How to find a middle point of a beizer curve?
我想制作 'named' 贝塞尔曲线。我希望它被命名为 one-word 这样我就不必担心 word-wrap.
我通过 P5 bezier(sx,sy,c1x,c1y,c2x,c2y,ex,ey)
函数制作贝塞尔曲线,我希望在贝塞尔曲线的中间显示一个字符串。但我不知道如何找到 'the middle' 的曲线。
现在我的结果是这样的
(我不知道从哪里开始解决这个问题,所以我采用了更简单的方法,即在曲线的起点打印文本):
但我希望它看起来像这样:
这意味着我需要P1和P2坐标:
对不起,我还没有我的代码。一拿到手,我就会把它加在这里。
这是绘制曲线的代码:
let
b = dest.inTriangle.middle, // destination triangle
g = this.outTriangle.p3, // tip of out triangle
c = {x:b.x-g.x,y:b.y-g.y}, // distance between objects
r1 = {}, // bezier point 1
r2 = {}; // bezier point 2
if(c.x > 0){
// b is on left
r1 = {
x: g.x + c.x/2,
y: g.y
};
r2 = {
x: b.x - c.x/2,
y: b.y
};
}
else {
// b is on right
r1 = {
x: g.x - c.x/2,
y: g.y + c.y
};
r2 = {
x: b.x + c.x/2,
y: b.y - c.y
};
}
noFill();
stroke(0);
bezier(
g.x, g.y,
r1.x, r1.y,
r2.x, r2.y,
b.x, b.y
);
noStroke();
fill(0);
text(this.name, g.x, (g.y-this.h/2))
因此,随时间平移函数中的 4 个点的公式如下(图片来自维基百科):
因为你想要中间的,而t
的范围是0到1,你只需要设置t = 1/2
所以
B(1/2) = 1/8 P0 + 3/8 P1 + 3/8 P2 + 1/8 P3
可以使用P5.js自带的bezierPoint()
功能。
noFill();
var x1 = 85,
x2 = 10,
x3 = 90,
x4 = 15;
var y1 = 20,
y2 = 10,
y3 = 90,
y4 = 80;
bezier(x1, y1, x2, y2, x3, y3, x4, y4);
fill(255);
var steps = 10;
for (var i = 0; i <= steps; i++) {
var t = i / steps;
var x = bezierPoint(x1, x2, x3, x4, t);
var y = bezierPoint(y1, y2, y3, y4, t);
ellipse(x, y, 5, 5);
}
您可能希望对 t
使用值 0.5
以获得中点。
我想制作 'named' 贝塞尔曲线。我希望它被命名为 one-word 这样我就不必担心 word-wrap.
我通过 P5 bezier(sx,sy,c1x,c1y,c2x,c2y,ex,ey)
函数制作贝塞尔曲线,我希望在贝塞尔曲线的中间显示一个字符串。但我不知道如何找到 'the middle' 的曲线。
现在我的结果是这样的 (我不知道从哪里开始解决这个问题,所以我采用了更简单的方法,即在曲线的起点打印文本):
但我希望它看起来像这样:
这意味着我需要P1和P2坐标:
对不起,我还没有我的代码。一拿到手,我就会把它加在这里。
这是绘制曲线的代码:
let
b = dest.inTriangle.middle, // destination triangle
g = this.outTriangle.p3, // tip of out triangle
c = {x:b.x-g.x,y:b.y-g.y}, // distance between objects
r1 = {}, // bezier point 1
r2 = {}; // bezier point 2
if(c.x > 0){
// b is on left
r1 = {
x: g.x + c.x/2,
y: g.y
};
r2 = {
x: b.x - c.x/2,
y: b.y
};
}
else {
// b is on right
r1 = {
x: g.x - c.x/2,
y: g.y + c.y
};
r2 = {
x: b.x + c.x/2,
y: b.y - c.y
};
}
noFill();
stroke(0);
bezier(
g.x, g.y,
r1.x, r1.y,
r2.x, r2.y,
b.x, b.y
);
noStroke();
fill(0);
text(this.name, g.x, (g.y-this.h/2))
因此,随时间平移函数中的 4 个点的公式如下(图片来自维基百科):
因为你想要中间的,而t
的范围是0到1,你只需要设置t = 1/2
所以
B(1/2) = 1/8 P0 + 3/8 P1 + 3/8 P2 + 1/8 P3
可以使用P5.js自带的bezierPoint()
功能。
noFill();
var x1 = 85,
x2 = 10,
x3 = 90,
x4 = 15;
var y1 = 20,
y2 = 10,
y3 = 90,
y4 = 80;
bezier(x1, y1, x2, y2, x3, y3, x4, y4);
fill(255);
var steps = 10;
for (var i = 0; i <= steps; i++) {
var t = i / steps;
var x = bezierPoint(x1, x2, x3, x4, t);
var y = bezierPoint(y1, y2, y3, y4, t);
ellipse(x, y, 5, 5);
}
您可能希望对 t
使用值 0.5
以获得中点。