2013-08-27 2 views
1

이것은 명시/비모수 이차 베 지어 곡선에 관한 것입니다. 일반적으로 X 변수가 함수이기도하므로 (Bézier = 매개 변수 함수) 2 차 베 지어 곡선을 3 포인트에 맞출 수는 없지만 제어점이 등거리이면 다음과 같이 할 수 있습니다. 명시/비모수 베 지어 기능. 2 차원 평면에서 3 개의 무작위 점에 2 차 bernstein 다항식을 맞추고 싶습니다. 3 개의 제어점의 x 축 좌표는 등거리 여야합니다. 또한 (외부) 제어점은 평소처럼 2 개의 외부 데이터 점과 일치하지 않아도됩니다.2D의 비점 수 2 차 베 지어 곡선 (in R)

방정식 세트를 해결해야하지만, 어떤 방정식을 해결해야할까요? 그리고 내가 설정 한 한계를 감안할 때 (3 개의 데이터 포인트, 제어 포인트가 동일한 수평 거리, 데이터 포인트가 아닌 제어 포인트로 곡선을 그리는 경우) R에서 어떻게해야합니까?

2 차 베 지어 함수는 B (t)입니다. 당신은 R이를 실행하면 = (1-t)^2 * P0 + 2 * t의 * (1-t) * P1의 + t^2 * P2,

, 당신은 무슨 의미가 표시됩니다

Here '

# 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) 
은 유사하지만 동일하지 않은 주제를이야. Herehere 멋진 베 지어 애니메이션.

답변

0

은 보통 3 점은 3 개의 자유도를 가지고있는 3 점을 맞게 할 수 있어야 의미

, 2 차 베 지어 곡선은 3 개 개의 통제 지점을 가지고에 차 베 지어 곡선을 맞지 않을 수 있습니다 문제없이. 선형 베 지어 곡선은 문제가 있지만 2 차 이상이라면 문제가 없습니다. 매개 변수화 된 베 지어에 맞추려면 원하는 각 점에 대해 t 값을 지정해야하지만 이는 까다로운 비트입니다.

명시적인 베 지어를 원한다면 그렇게 할 수 있습니다. 나는 당신이 맞추려고하는 점들이 당신의 x 범위에 있다고 가정합니다 [-20..20]?

그렇다면 가장 먼저해야 할 일은 피팅 할 각 포인트의 x 값을 찾은 다음 그 값을 t 값으로 변환하는 것입니다. 귀하의 예제에서 x 범위는 [-20..20]이고 t 범위는 [0..1]이므로 코드를 올바르게 읽고 있으므로 정규화해야합니다. 귀하의 t 값은 (x + 20)/40입니다.

3 개의 t 값을 모두 갖게되면 3 개의 미지수에 대한 3 개의 방정식을 풀 수 있습니다. 미지수는 제어점의 y 값입니다.

(1 tfit)^2 * Y0 + 2 * tfit * (1-tfit) * Y1 + tfit^2 * Y2 = yfit

tfit : 3 식 모두 구체적으로 동일한 형태를 가질 당신이 맞추려고하는 점의 t 값이고, yfit는 같은 점의 y 값입니다.

y0, y1 및 y2에 대한 방정식 세트를 계산합니다.


그럼 샘플 데이터를 살펴 보겠습니다.

rmin = -20 
rmax = 20 

이제 우리는 데이터 점을 t 값을 계산

우리는 또한 입력으로 사용자의 명시 적 차 베 지어 곡선의 범위를 할게요

d0 = (-4.8000, 0.3648) 
d1 = (7.2000, -0.9792) 
d2 = (8.4000, -1.1928) 

: 우리는 당신의 3 데이터 점 입력으로 할게요

t0 = (d0.x - rmin)/(rmax - rmin) 
t1 = (d1.x - rmin)/(rmax - rmin) 
t2 = (d2.x - rmin)/(rmax - rmin) 

구체적으로, 이것들은 :

t0 = 0.38000000000000000 
t1 = 0.68000000000000005 
t2 = 0.70999999999999996 
01,235,164 우리는 명시 베 지어 곡선의 y 값이다 Y0, Y1, 및 Y2에 대한 해결된다

(1-t0)*(1-t0)*y0 + 2*(1-t0)*t0*y1 + t0*t0*y2 = d0.y 
(1-t1)*(1-t1)*y0 + 2*(1-t1)*t1*y1 + t1*t1*y2 = d1.y 
(1-t2)*(1-t2)*y0 + 2*(1-t2)*t2*y1 + t2*t2*y2 = d2.y 

:

우리는 지금 식 (3)을 갖는다.

저는 편리하게 LSQ 솔버를 사용 했으므로 다른 방법을 사용해도 문제가 없습니다. 여기

0.38440000000000002 0.47120000000000001 0.14440000000000000 | 0.36480000000000001 
0.10239999999999996 0.43519999999999998 0.46240000000000009 | -0.97919999999999996 
0.084100000000000022 0.41180000000000005 0.50409999999999999 | -1.1928000000000001 

하고 제작 한 솔루션입니다 : : 도움이

y0 = -2.6513220228646483e-014 
y1 = 2.0000000000000262 
y2 = -4.0000000000000169 

희망 ... :)

+0

감사 | 여기

내가 (나 A)를 넣어 행렬입니다 당신의 답장을 위해, 그러나 "나는 당신이 맞추려고하는 점들이 당신의 x 범위 [-20..20]에 있다고 생각합니까?" 아닙니다. 제어점의 위치가 어디인지, 단지 등거리가되어야하는지, 데이터 점의 3 개의 X 축 좌표가 제어점의 X 축 좌표 사이가 될지, . – MisterH

+0

나는 또한 이것을 http://pomax.github.io/bezierinfo/#moulding (및 다음 섹션)에서 다루고 있으며 소스는 링크되어 있다고 덧붙이고 싶다. 몇 가지 자유도가 있습니다 : 2 차 곡선의 경우 "중간"점에서 나타낼 "t"값을 선택하면 비교적 간단합니다. 3 차 곡선의 경우 접선 벡터뿐만 아니라 "t"값을 선택해야합니다. 그러면 다시 간단한 솔루션입니다. –

+0

""중간 점 "을 나타낼"t "값을 선택하게되지만, 내 질문과 같이 이것이 명확하지 않으면 어떻게됩니까? 이것은 비모수 이차 베 지어 곡선을 3 점에 맞추는 것이 아닙니다 : 바깥 쪽 컨트롤 포인트가 바깥 쪽 데이터 포인트와 일치하지 않습니다. 나는 이것이 대부분의 질문 들과는 다소 다르다는 것을 알고 있습니다. 그러나 그것이 흥미로운 것입니다. – MisterH