catmull rom 곡선에 대해..

수학, 물리학 등 게임 프로그래밍의 기반이 되는 이론에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

catmull rom 곡선에 대해..

Post by 비회원 »

제가 여러 가지 곡선에 대해서 테스트중에 있습니다.

그 중에 점을 지나는 곡선인 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;
} 

비회원

Post by 비회원 »

catmull-rom spline interpolation은 tangent vector를 구하는 식의 tension 값에 따라 curve의 모양이 달라집니다.
tension값을 줄여서 새 cardinal spline을 만들 수도 있지만 point가 길 때는 또 얘기가 달라지죠.
각각의 point에 직접 관여하기 위해서는 tangent vector를 직접 지정하는 hermite curve interpolation을 사용하는 게 확실합니다.
비회원

아... 답변 감사합니다 ^^

Post by 비회원 »

다시금 궁금한게 있습니다 ^^;

tangent vector를 직접 지정하게 된다면

한점에 대한 tangent vector를 수정하게 될때

그 주위 곡선에도 영향을 받을 수 있나요?

vector p0, p1, p2 여기에

tangent t1, t2가 있을떄

t1이 p0, p1 과 t2가 p1,p2와 관계할때

t1을 수정하게 된다면 p0, p1의 곡선 뿐 아니라 p1,p2의 곡선에도

영향이 가겠죠??

ㅠㅠ

CAD 쪽에서 그리는 interpolation curve 들은

catmull rom, hermite curve

이렇게 사용될까요?

catmull은 그냥 점만 찍는 점에서 편의 성이 높지만

원하는 결과를 얻기 힘들고

hermite curve는

원하는 결과를 얻을 수 있지만 전체적인 모형이 엉클어 질 수 있고

또한 tangent vector를 일일이 지정해야 하는 번거로움이 있네요 ㅠㅠ

그래도 hermite curve가 더 좋을까요??
Locked