기본적인 Bézier-Curve 기능을 재사용하여 Bézier 곡선의 일부를 그리는가?
-
22-08-2019 - |
문제
필요한 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 + 3유2티 피2 + 3ut2 피3 + 티3 피4
피1 곡선의 시작점입니다. 피4 그것의 종말점. 피2 그리고 피3 제어점입니다.
두 개의 매개 변수가 주어졌습니다 티0 그리고 티1 (그리고 함께 유0 = (1 − 티0), 유1 = (1 − 티1))), 간격의 곡선 부분 [티0, 티1]는 새로운 제어 지점으로 설명됩니다
- 큐1 = 유0유0유0 피1 + (티0유0유0 + 유0티0유0 + 유0유0티0) 피2 + (티0티0유0 + 유0티0티0 + 티0유0티0) 피3 + 티0티0티0 피4
- 큐2 = 유0유0유1 피1 + (티0유0유1 + 유0티0유1 + 유0유0티1) 피2 + (티0티0유1 + 유0티0티1 + 티0유0티1) 피3 + 티0티0티1 피4
- 큐3 = 유0유1유1 피1 + (티0유1유1 + 유0티1유1 + 유0유1티1) 피2 + (티0티1유1 + 유0티1티1 + 티0유1티1) 피3 + 티0티1티1 피4
- 큐4 = 유1유1유1 피1 + (티1유1유1 + 유1티1유1 + 유1유1티1) 피2 + (티1티1유1 + 유1티1티1 + 티1유1티1) 피3 + 티1티1티1 피4
괄호화 된 표현식에서 적어도 일부 용어는 동일하며 결합 할 수 있습니다. 나는 여기에 언급 된 공식이 패턴을 더 명확하게 만들 수 있으므로 그렇게하지 않았다고 생각합니다. 당신은 단순히 해당 계산을 독립적으로 실행할 수 있습니다 엑스 그리고 와이 새로운 제어 지점을 계산하는 지시 사항.
매개 변수 범위의 주어진 백분율은 티 일반적으로 길이의 동일한 백분율에 해당하지 않습니다. 따라서 경로 길이를 매개 변수로 다시 돌리기 위해 곡선을 통합해야 할 가능성이 높습니다. 또는 근사치를 사용합니다.