그 중에 점을 지나는 곡선인 catmull rom 곡선을 테스트 하다가
궁금한게 있어서 질문 올립니다.
http://luciyel.tistory.com/entry/catmull-rom-test
위 문제 때문에 머리가 복잡합니다 ㅠㅠ
제어점 p1,p2,p3,p4 가 있을때
p2와 p3이 가까워 지게 되면
위 링크의 그림과 같이 곡선이 꼬이더라구요.
혹시 제가 공식을 잘 못 사용한 걸까요?
아님 다른 문제가 있을까요?
혹시 혹시 p2와 p3이 가까워 졌을때는 다른 처리를 해야 될까요?
밑에는 구현 소스 입니다. catmull rom을 구현한 소스가
인터넷에 있어서 빌렸습니다;;; ( 나중에 갚을게요 ㅠ )
Code: Select all
CPoint
CatMullRomCurve::CalCurve(double t, Point3D p1, Point3D p2, Point3D p3, Point3D p4 )
{
double tt = t*t ;
double ttt = tt * t ;
double x = 0.5 * ((-p1.getX() + 3*p2.getX() -3*p3.getX() + p4.getX())*ttt
+ (2*p1.getX() -5*p2.getX()+ 4*p3.getX() - p4.getX())*tt
+ (-p1.getX()+p3.getX())*t
+ 2*p2.getX()) ;
double y = 0.5 * ((-p1.getY() + 3*p2.getY() -3*p3.getY() + p4.getY())*ttt
+ (2*p1.getY() -5*p2.getY() + 4*p3.getY() - p4.getY())*tt
+ (-p1.getY()+p3.getY())*t
+ 2*p2.getY()) ;
return CPoint(int(x+.5), int(y+.5)) ;
}
void
CatMullRomCurve::DrawCatmullRom()
{
if(degree < 4) return;
Point3D* CurveP = new Point3D [degree+1];
for(int i = 0; i < degree ; i++)
{
CurveP[i] = controlPoint[i];
}
for(int i = 0; i <degree>MoveTo(CurveP[i].getX(), CurveP[i].getY());
for(int it = 1; it <= 20; it++)
{
CPoint X = CalCurve(double(it)/20, CurveP[i-1<0?0:i-1], CurveP[i], CurveP[i+1], CurveP[i+2>degree-1?degree-1:i+2]);
m_pDC->LineTo(X);
}
};
delete [] CurveP;
}