2013-03-28 2 views
1

기본적으로 다각형을 그리기를 원하지만 가장자리가 딱딱하지 않고 부드럽게 보입니다. 다각형의 모양이 중요하기 때문에 모서리가 점을 지나야합니다.점 집합에 닫힌 커브를 그리려면 어떻게해야합니까?

열린 커브 (예 : 커브를 감싸고 있지 않은 커브)에 대해 모노톤 3 차 스플라인이 정확하지만 찾은 알고리즘은 0과 N을 사전 계산합니다. 닫힌 커브로 작업 하시겠습니까?

JavaScript로 구현 중이지만 가상 코드도 마찬가지입니다.

+0

당신이 캔버스에 의미합니까? –

+0

좌표를 알아 내야하기 때문에 관련이 없습니다. 하지만 그렇습니다. 솔루션이 있다면 SVG도 괜찮을 것입니다.이 경우 솔루션을 캔버스로 변환 할 수 있습니다. – Blixt

+0

'가장자리가 부드럽게 보임'을 의미합니까? '부드럽게 보이는 점'을 의미합니까? –

답변

5

There is an easy method (Maxim Shemanarev가 개발)을 사용하여 점 집합에 설정된 잘 드러난 닫힌 베 지어 곡선을 만듭니다. 예 : 너 한테의

enter image description here

중요한 순간 ​​:

enter image description here enter image description here enter image description here enter image description here

및 샘플 코드 :

// Assume we need to calculate the control 
    // points between (x1,y1) and (x2,y2). 
    // Then x0,y0 - the previous vertex, 
    //  x3,y3 - the next one. 

    double xc1 = (x0 + x1)/2.0; 
    double yc1 = (y0 + y1)/2.0; 
    double xc2 = (x1 + x2)/2.0; 
    double yc2 = (y1 + y2)/2.0; 
    double xc3 = (x2 + x3)/2.0; 
    double yc3 = (y2 + y3)/2.0; 

    double len1 = sqrt((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0)); 
    double len2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1)); 
    double len3 = sqrt((x3-x2) * (x3-x2) + (y3-y2) * (y3-y2)); 

    double k1 = len1/(len1 + len2); 
    double k2 = len2/(len2 + len3); 

    double xm1 = xc1 + (xc2 - xc1) * k1; 
    double ym1 = yc1 + (yc2 - yc1) * k1; 

    double xm2 = xc2 + (xc3 - xc2) * k2; 
    double ym2 = yc2 + (yc3 - yc2) * k2; 

    // Resulting control points. Here smooth_value is mentioned 
    // above coefficient K whose value should be in range [0...1]. 
    ctrl1_x = xm1 + (xc2 - xm1) * smooth_value + x1 - xm1; 
    ctrl1_y = ym1 + (yc2 - ym1) * smooth_value + y1 - ym1; 

    ctrl2_x = xm2 + (xc2 - xm2) * smooth_value + x2 - xm2; 
    ctrl2_y = ym2 + (yc2 - ym2) * smooth_value + y2 - ym2; 
+0

당신의 대답에이 쉬운 방법을 자세히 설명해 주시겠습니까? 이것이 의미 하듯이, 대답의 가치는 전적으로 해당 URL에서 페이지를 내려 보내거나 이동하지 않는 것에 달려 있습니다. –

+0

@Asad 예, 그 의미가 있습니다 – MBo

+0

고마워요! +1 좋은 답변. –