기본적인 Bézier-Curve 기능을 재사용하여 Bézier 곡선의 일부를 그리는가?

StackOverflow https://stackoverflow.com/questions/878862

문제

필요한 4 가지 포인트를 지정하여 베 지어 곡선을 그릴 수있는 그래픽 API를 사용한다고 가정합니다.시작, 끝, 두 개의 제어 지점.

내가 할 수 있습니까? 이 기능을 재사용하십시오 그리기 위해 X 퍼센트 '원래'곡선 (제어점과 종점을 조정하여)?

아니면 불가능합니까?

불필요한 정보, 누군가가 돌봐야하는 경우 :

  • 원본의 모든 n %를 그릴 수있는 모든 것이 필요합니다.
    색상 및/또는 라인 스타일이 다른 Bezier 곡선
  • Bezier 곡선을 그리기 위해 Java의 Path2D를 사용하고 있습니다.

    Path2D p = new GeneralPath();
    p.moveTo(x1, y1);
    p.curveTo(bx1, by1, bx2, by2, x2, y2);
    g2.draw(p);
    
도움이 되었습니까?

해결책

당신이 필요로하는 것은 De Casteljau 알고리즘. 이렇게하면 곡선을 원하는 세그먼트로 나눌 수 있습니다.

그러나 입방 곡선 만 다루고 있기 때문에 세그먼트를 제공 할 수있는 공식을 사용하는 것이 약간 더 쉽습니다. t0 에게 t1 어디 0 <= t0 <= t1 <= 1. 여기 몇 가지 의사 코드가 있습니다.

u0 = 1.0 - t0
u1 = 1.0 - t1

qxa =  x1*u0*u0 + bx1*2*t0*u0 + bx2*t0*t0
qxb =  x1*u1*u1 + bx1*2*t1*u1 + bx2*t1*t1
qxc = bx1*u0*u0 + bx2*2*t0*u0 +  x2*t0*t0
qxd = bx1*u1*u1 + bx2*2*t1*u1 +  x2*t1*t1

qya =  y1*u0*u0 + by1*2*t0*u0 + by2*t0*t0
qyb =  y1*u1*u1 + by1*2*t1*u1 + by2*t1*t1
qyc = by1*u0*u0 + by2*2*t0*u0 +  y2*t0*t0
qyd = by1*u1*u1 + by2*2*t1*u1 +  y2*t1*t1

xa = qxa*u0 + qxc*t0
xb = qxa*u1 + qxc*t1
xc = qxb*u0 + qxd*t0
xd = qxb*u1 + qxd*t1

ya = qya*u0 + qyc*t0
yb = qya*u1 + qyc*t1
yc = qyb*u0 + qyd*t0
yd = qyb*u1 + qyd*t1

그런 다음 Bézier 곡선을 그립니다 (xa,ya), (xb,yb), (xc,yc) 그리고 (xd,yd).

주목하십시오 t0 그리고 t1 곡선의 정확한 비율이 아닙니다 거리 오히려 곡선 매개 변수 공간. 당신이 절대적으로 거리가 있어야한다면 상황이 훨씬 더 어렵습니다. 이것을 시도하고 그것이 필요한 일을하는지 확인하십시오.

편집하다: 이 방정식이 어느 쪽이든 상당히 단순화한다는 점은 주목할 가치가 있습니다. t0 또는 t1 0 또는 1입니다 (예 : 한쪽에서만 다듬기를 원합니다).

또한 관계 0 <= t0 <= t1 <= 1 엄격한 요구 사항이 아닙니다. 예를 들어 t0 = 1 그리고 t1 = 0 곡선을 뒤로 "플립"하는 데 사용될 수 있습니다. t0 = 0 그리고 t1 = 1.5 원래 끝을지나 곡선을 확장하는 데 사용될 수 있습니다. 그러나 곡선은 당신이 그것을 지나서 확장하려고하면 곡선이 기대하는 것과 다르게 보일 수 있습니다. [0,1] 범위.

edit2 : MVG는 원래 대답 후 3 년 이상 내 방정식에서 오류를 지적했습니다. 마지막 단계 (최종 제어 지점을 얻기 위해 추가 선형 보간)를 잊어 버렸습니다. 위의 방정식이 수정되었습니다.

다른 팁

~ 안에 답변 에게 다른 질문 방금 입방 곡선의 섹션에 대한 제어점을 계산하기위한 몇 가지 공식을 포함 시켰습니다. 와 함께 = 1 − , 입방 베 지어 곡선은 다음과 같이 설명됩니다

비() = 3 1 + 32 2 + 3ut2 3 + 3 4

1 곡선의 시작점입니다. 4 그것의 종말점. 2 그리고 3 제어점입니다.

두 개의 매개 변수가 주어졌습니다 0 그리고 1 (그리고 함께 0 = (1 − 0), 1 = (1 − 1))), 간격의 곡선 부분 [0, 1]는 새로운 제어 지점으로 설명됩니다

  • 1 = 000 1 + (000 + 000 + 000) 2 + (000 + 000 + 000) 3 + 000 4
  • 2 = 001 1 + (001 + 001 + 001) 2 + (001 + 001 + 001) 3 + 001 4
  • 3 = 011 1 + (011 + 011 + 011) 2 + (011 + 011 + 011) 3 + 011 4
  • 4 = 111 1 + (111 + 111 + 111) 2 + (111 + 111 + 111) 3 + 111 4

괄호화 된 표현식에서 적어도 일부 용어는 동일하며 결합 할 수 있습니다. 나는 여기에 언급 된 공식이 패턴을 더 명확하게 만들 수 있으므로 그렇게하지 않았다고 생각합니다. 당신은 단순히 해당 계산을 독립적으로 실행할 수 있습니다 엑스 그리고 와이 새로운 제어 지점을 계산하는 지시 사항.

매개 변수 범위의 주어진 백분율은 일반적으로 길이의 동일한 백분율에 해당하지 않습니다. 따라서 경로 길이를 매개 변수로 다시 돌리기 위해 곡선을 통합해야 할 가능성이 높습니다. 또는 근사치를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top