2016-06-09 11 views
0

Sample image for the requirement UIBezier 경로 코드를 사용하여 닫힌 경로 베 지어 곡선을 그렸습니다. 화면상의 접촉점이 닫힌 베 지어 경로 경계에 있는지를 확인할 수 있습니다. 또는 그 바깥 쪽. 요구 사항 : - 사용자가 닿은 점을 닫힌 경로 베 지어 곡선 경계 위로 드래그하고 닫힌 경로 베 지어 곡선을 연장해야합니다.[iOS Objective C] 닫힌 베 지어 곡선 경로의 점에서 베 지어 곡선 끌기

다음을 참조하십시오 : - 아래 질문은 내 것과 동일하지만 해결책을 찾을 수 없습니다. https://math.stackexchange.com/questions/53819/changing-a-bezier-curve-by-dragging-a-point-on-the-curve-itself-rather-than-a-co

위의 기능을 수행하는 데 Objective C 코드 또는 알고리즘을 사용할 수 있다면 큰 도움이 될 것입니다.

안녕하세요 팡, 요구 사항을 보여주는 내 게시물에 이미지를 게시했습니다. 현재 사용자 A와 점 B 만 사용자가 터치하고 움직이는 지점입니다. 포인트 C와 D를 계산하고 원래의 곡선이 사용자 손가락 이동 방향으로 방금 확장 된 것처럼 보이도록 경로 CD를 제거해야합니다.

참고 : - 닫힌 커브를 얻을 때이 모든 작업을 수행합니다. 사용자가 닫을 수없는 경우 달성 할 수있는 자유로운 손을 그릴 수 있습니다. 현재 내 요구 사항에 맞게 커브를 사용합니다.

도움이 될 것입니다.

+0

귀하의 게시물에있는 링크는 두 가지 솔루션을 제공합니다. 드래그하는 포인트와 관련된 매개 변수를 알고 있으면 솔루션 1을 사용하는 것이 더 쉽습니다. 솔루션 1은 인근 제어 포인트의 새 위치를 계산합니다. 그렇지 않으면 단순히 베 지어 곡선 보간법 인 솔루션 2로 이동하십시오. – fang

+0

위의 링크에서 볼 수 있듯이 솔루션이 작동 중임은 분명하지 않습니다. –

+0

두 가지 해결책이 모두 적용됩니다. 자세한 내용을 읽고 이해하지 못하는 부분에 질문을 게시하고 설명을 시도합니다. – fang

답변

0

당신이 차 베 지어 곡선 C (t)가 가정 및 드래그하고 싶은 점 A가 매개 변수 T0에있다, 우리는,

A=C(t0)=(1-t0)^2*P0+2t0(1-t0)*P1+t0^2*P2  (1) 

지금, 당신은 B에게 A 점을 드래그해야 우리가 동일한 엔드 포인트를 공유 C (t)와 D (t)를하고자하기 때문에 우리는

B=D(t0)=(1-t0)^2*Q0+2t0(1-t0)*Q1+t0^2*Q2  (2) 

, 그래서 우리는 P0 = P2 = Q0 및 Q2를 갖는다. 만약 큐빅 베 지어 곡선이 경우, 식에 (1)과 (2), 우리는 마찬가지로

B-A = 2t0(1-t0)(Q1-P1), or 
Q1 = (B-A)/(2t0(1-t0)) + P1 

이 우리 결합 다시

A=C(t0)=(1-t0)^3*P0+3t0(1-t0)^2*P1+3t0^2(1-t0)*P2+t0^3*P3  (3) 
B=D(t0)=(1-t0)^3*Q0+3t0(1-t0)^2*Q1+3t0^2(1-t0)*Q2+t0^3*Q3  (4) 

있을 것이다 (3) 및 (4)와 같은 엔드 포인트 P0 = Q0 유지 및 P3은 = Q3은

B-A = 3t0(1-t0)^2*(Q1-P1)+3t0^2(1-t0)*(Q2-P2), 

될 것이며 우리

Q1= w(B-A)/(3t0(1-t0)^2) + P1, and 
    Q2= (1-w)(B-A)/(3t0^2(1-t0)) + P2 
01을

여기서 w는 [0,1] 사이의 가중치입니다.

큐빅 베 지어 곡선의 경우 P1 및 P2 이동에 대한 무한한 솔루션이 있으므로 점 C (t0)가 점 A에서 점 B로 이동하도록 선택할 수 있습니다. P1 만 이동하도록 선택할 수 있습니다 또는 P2 (w를 0.0 또는 1.0으로 설정) 또는 둘 다 이동 (w를 0.0과 1.0 사이의 값으로 설정). 더 복잡한 알고리즘은 C (t)와 D (t)의 적분 된 차이를 최소화함으로써 w의 값을 결정할 것입니다. 그러나 우리는 거기에 갈 필요가 없다고 생각합니다.

위의 내용은 게시물의 링크에 언급 된 "해결책 1"에 대한 자세한 설명입니다. 솔루션 2와 비교할 때이 접근법을 사용하는 것이 좋습니다.2 차 또는 3 차 베 지어 곡선이있는 경우 C (t0)에있는 점과 연관된 매개 변수 t0을 찾는 것은 2 차 또는 3 차 다항식의 근원을 찾는 것일뿐입니다.

+0

안녕하세요 송곳니, 솔루션 주셔서 감사. 내가 종이에 그것을 해결하는 동안 방정식 Q1 = (B-A)/(2t0 (1-t0)) + P1 P1 및 Q1 2 알 수없는 변수를 발견했다. 제발 내가 A, B, t0를 가지고이 방정식을 푸는 방법을 안내해주십시오. 3 차 곡선에도 똑같이 적용됩니다. Q2 = (1-w) (B-A)/(3t0^2 (1-t0)) + P22. 또한 사용자가 점 A에서 점 B로 이동할 때 t도 변경된다고 가정합니다. 가능한 경우 접촉 된 점에 대한 t 값을 얻기 위해 eqation을 제공하십시오. –

+0

또한 쿼드가 그려지는 시작 및 끝점 (C 및 D) 계산 요구 사항을 보여주는 위의 편집 된 질문을 확인하십시오. –

+0

P1 (또는 입방 형의 경우 P1과 P2)은 원래 베 지어 곡선의 제어점으로 알려야합니다. 어떤 이유로 P1이 없지만 매개 변수가 t0이면 식 (1)에서 P1을 얻을 수 있습니다. – fang