计算由2条贝塞尔曲线定义的曲面的边缘点?

时间:2011-11-22 22:26:46

标签: math geometry 2d bezier curves

鉴于6个点定义了2个二次贝塞尔曲线,如何计算两条曲线的切线相同的点?

当切线重合时,切线之间的距离变小,最终达到0。如何在不循环一百次并检查每个部件的情况下计算出来?有这个数学解决方案吗?

enter image description here

2 个答案:

答案 0 :(得分:3)

方便的维基百科甚至会显示由P_0,P_1,P_2定义的quadratic Bezier curve的渐变,因此我们甚至不需要计算它。

gradient

因此,如果我们有2条由B_1(t)和B_2(t)定义的曲线,并且我们想要知道曲线B_2(t)中具有与例如B_1(0.5)相同的切线的位置。我们只需找到t,使得B_1'(0.5)= B_2'(t)。由于梯度是线性方程,因此解决这种平等应该是微不足道的。

编辑:这是一个很酷的问题,我不得不写一些代码:)

考虑这个数字: enter image description here

B = @(t,p0,p1,p2)((1-t)*((1-t)*p0 + t*p1) + t*((1-t)*p1 + t*p2)) 
C = @(t,p0,p1,p2)(2*(1-t)*(p1-p0) + 2*t*(p2-p1));

p0 = [1;2];
p1 = [3;5];
p2 = [6;-1];
X = [];
for t=0:0.05:1
    X = [X B(t,p0,p1,p2)];
end

q0 = [2;0];
q1 = [4;7];
q2 = [5;0];
Y = [];
for t=0:0.05:1
    Y = [Y B(t,q0,q1,q2)];
end

figure(1)
clf;
hold on;
plot([p0(1) p1(1) p2(1)], [p0(2) p1(2) p2(2)], 'ro:')
plot(X(1,:), X(2,:), 'g-');

plot([q0(1) q1(1) q2(1)], [q0(2) q1(2) q2(2)], 'bo:')
plot(Y(1,:), Y(2,:), 'm-');

% Consider: t = 0.2
% Note: B(0.2,p0,p1,p2) = [1.84; 2.84]
%       C(0.2,p0,p1,p2) = [4.4; 2.4]
%
% 2*(1-t)*([4;7] - [2;0]) + 2*t*([5;0]-[4;7]) = [4-2*t; 14-28*t]
% (4-2*t)/(14-28*t) = 4.4/2.4
% 9.6 - 4.8t = 61.6 - 123.2t
% 118.4t - 52 = 0
% t = 0.439
%
% B(0.439,q0,q1,q2) = [3.56; 3.45]

plot([1.84, 3.56], [2.84, 3.45], 'ks--')

这是matlab代码,我希望它有点清楚,如果你不使用matlab,请注意列向量表示为[a; b; c; d; ...]。所以我用点p0,p1,p2和q0,q1,q2定义2条曲线,然后创建一个函数来计算Bezier(B)和梯度(C)。然后我绘制曲线并考虑t = 0.2处的切线,我希望剩下的数学是清楚的,但是如果没有则只问一个问题。

另外,请注意我们并没有像我原先说的那样解决渐变问题!相反,我们需要求解具有相同x / y比率的梯度。如果没有解决方案,那么没有切线相等的地方。

答案 1 :(得分:1)

二次贝塞尔曲线P和Q

P(t)= P0 *(1-t)^ 2 + 2 * P1 *(1-t)* t + P2 * t ^ 2 = t ^ 2 *(P0-2 * P1 + P2)+ 2 * T *(P1-P0)+ P0

Q(t)= Q0 *(1-u)^ 2 + 2 * Q1 *(1-u)* u + Q2 * u ^ 2 = u ^ 2 *(Q0-2 * Q1 + Q2)+ 2 * T *(Q1-Q0)+ Q0

n阶Bezier曲线的导数是具有控制点的(n-1)阶曲线 二= N(P(i + 1的)-Pi)

D0 = 2(P1-P0)D1 = 2(P2-P1)

D = D0 *(1-t)+ D1 * t = 2 * t *(P2-2 * P1 + P0)+ 2 *(P1-P0) - 现在我们在参数t <的点处切线/ p>

标量形式:

Dx = 2 * t *(P2x-2P1x + P0x)+2(P1x-P0x)

的Dy = 2 * T *(受体P2y-2P1y + P0y)2(P1Y-P0y)

对于第二条曲线

例如= 2 * U *(Q2x-QP1x + Q0x)2(Q1x-Q0x)

安永= 2 * U *(Q2Y-QP1y + Q0y)2(Q1y-Q0y)

矢量平行的条件:

DX EY-镝用Ex = 0

P曲线的导数矢量触及Q曲线上对应点的条件

载体积(Q(u)-P(t))×D(t)= 0

现在我们有两个未知数的方程式 - t和u。

设PAx = P2x-2P1x + P0x,PBx = P1x-P0x,PAy,PBy,QAx,QAy,QBx,QBy的相同符号

现在方程系统是:

(T PAX + PBX)(U QAy + QBY) - (叔支付+ PBY)(U 卡希+ QBX)= 0

(u ^ 2 * QAx + 2 * u * QBx + Q0x-t ^ 2 * PAx-2 * t PBx-P0x)(t * PAy + PBy) - (u ^ 2 * QAy + 2 * U * QBY + Q0y叔^ 2 *付费2 * T PBY-P0y)(T * PAX + PBX)= 0

Maple用这样的结果解决了这个系统:

t = RootOf((PAx ^ 2 * PBy QAy + PBx PAy ^ 2 * QAx-PAx PBy PAy QAx-PBx PAy PAX QAy)* _ Z 2 3 +

( - 2 * PAX QBY 支付 QBX + PBX 支付 PBY 卡希+ PAX PBY PBX QAy + Q0x 支付 PAX QAy-PAX * PBY ^ 2 *卡希-PBX ^ 2 *支付 QAy + P0X 支付^ 2 *卡希-P0y < EM> PAX 支付卡希-Q0y PAX ^ 2 * QAy + P0y * PAX ^ 2 * QAy +支付^ 2 * QBX ^ 2-P0X 支付 PAX QAy + Q0y PAX 支付卡希+ PAX ^ 2 * ^ QBY 2- Q0x *支付^ 2 *卡希)* _ Z 2 2 +

(Q0y PBX 支付卡希+ Q0x PBY PAX QAy + Q0y PAX PBY *卡希+ 2 * PAX * QBY ^ 2 * PBX + 2 * *支付QBX ^ 2 * PBY-2 * PAX QBY PBY * QBX-2 * PBX QBY 支付 QBx- P0y PAX PBY 卡希-P0y PBX 交*卡希-2 * Q0x 支付 PBY *卡希+ 2 * P0y PAX PBX QAy-P0X 支付 PBX QAy + 2 * P0X 支付 PBY 卡希-P0X PBY PAX QAy-2 * Q0y PAX PBX QAy + Q0x 支付 PBX QAy)* _ž -

P0y PBX PBY 卡希-Q0x PBY ^ 2 *卡希-Q0y * PBX ^ 2 * QAy + P0y * PBX ^ 2 * QAy + P0X * PBY ^ 2 *卡希-2 * PBX QBY PBY * QBX + PBX ^ 2 * QBY ^ 2 + PBY ^ 2 * QBX ^ 2 + Q0y PBX PBY 卡希+ Q0x PBY PBX QAy-P0X PBY PBX * QAy)

该公式表示t是具有这些奇怪系数的三次方程的根。 Cubic是可以解决的。如果在范围[0..1]中存在t的实际值,那么我们可以计算并检查相同的范围。 当然,这是一个相当复杂的方法,我的计算可能包含错误和拼写错误

增加:3个实心立方根(和3个切线)的情况是可能的:

enter image description here