这是关于显式/非参数二次贝塞尔曲线。通常你不能将二次贝塞尔曲线拟合到 3 个点,因为 X 变量也是一个函数(贝塞尔 = 参数函数),但是当控制点等距时,你可以:它被称为显式/非参数贝塞尔功能。我想将二次伯恩斯坦多项式拟合到 2D 平面中的 3 个随机点,并且 3 个控制点的 x 轴坐标必须是等距的。此外,(外部)控制点不必像通常那样与 2 个外部数据点重合。
我想这需要求解一组方程,但是哪些方程呢?鉴于我设置的限制,我如何在 R 中做到这一点(曲线通过 3 个数据点,控制点相同的水平距离,控制点不一定在数据点上?
二次贝塞尔函数为 B(t)=(1-t)^2*P0+2*t*(1-t)*P1+t^2*P2,
如果你在 R 中运行它,你会明白我的意思:
# control points are equidistant: here the horizontal distance is 20
cpx<-c(-20,0,20)
# y-values can be random
cpy<-c(0,2,-4)
t<-seq(0,1,len=101)
# the 3 control points
P0<-matrix(data=c(cpx[1],cpy[1]),nrow=1,ncol=2,byrow=FALSE,dimnames=NULL)
P1<-matrix(data=c(cpx[2],cpy[2]),nrow=1,ncol=2,byrow=FALSE,dimnames=NULL)
P2<-matrix(data=c(cpx[3],cpy[3]),nrow=1,ncol=2,byrow=FALSE,dimnames=NULL)
# the quadratic Bernstein polynomial:
B<-(1-t)^2%*%P0+2*t*(1-t)%*%P1+t^2%*%P2
par(mfrow=c(1,1))
plot(cpx,cpy,type="p",pch=20,xlab="",ylab="")
abline(v=c(min(cpx),max(cpx)),lty=3,col='red')
text(cpx[1],cpy[1],"P0",cex=.8,pos=4)
text(cpx[2],cpy[2],"P1",cex=.8,pos=1)
text(cpx[3],cpy[3],"P2",cex=.8,pos=2)
segments(cpx[1],cpy[1],cpx[2],cpy[2],lty=3);segments(cpx[2],cpy[2],cpx[3],cpy[3],lty=3)
lines(B,col="DeepSkyBlue")
# 3 random points on the curve:
pnts<-sort(sample(1:length(t),3,replace=F),decreasing=F)
point1<-pnts[1]
point2<-pnts[2]
point3<-pnts[3]
points(B[point1,1],B[point1,2],col='orange',pch=20)
points(B[point2,1],B[point2,2],col='orange',pch=20)
points(B[point3,1],B[point3,2],col='orange',pch=20)
segments(B[point1,1],B[point1,2],B[point2,1],B[point2,2],lwd=2,col='orange',lty=1)
segments(B[point2,1],B[point2,2],B[point3,1],B[point3,2],lwd=2,col='orange',lty=1)