2012-07-03 3 views
10

저는 큐빅 베 지어 곡선에서 Y 좌표를 찾을 수있게 해주는 일종의 방법을 찾고있었습니다. 여기에 x 좌표가 주어졌습니다.큐빅 베 지어 곡선에서 Y 주어진 X 찾기?

큐빅 함수를 처리하고 뿌리를 찾으려는 장소가 많이 있습니다. 큐빅 베 지어 곡선의 방정식 (x 좌표)은 다음과 같습니다. X 1 * t * 2 * X2 + t^3 * X3

무엇이 무엇인가? (1-t)^3 * X0 + 3 * (1-t) 나를 혼란스럽게하는 것은 (1-t) 값을 더하는 것입니다. 예를 들어, 임의의 숫자로 X 값을 채운다면 ...

400 = (1-t)^3 * 100 + 3 * (1-t)^2 * t * 600 + 3 * (1-t) *의 t^2 * 800 + t^3 * 800

후 삼차 수식 스타일로 재 배열 :

800t^3 + 3 * (1-t) 800t^2 + 3 (1-t)^2 * 600t + (1-t)^3 * 100-400 = 0

여전히 (1-t) 블록의 문제가 있습니다. 나는 (1-t)가 처음에는 알려지지 않았을 때 내가 어떻게 t를 풀어야하는지 생각해 낼 수 없다.

아이디어가 있으십니까?

+1

더 많은 수학 질문 ... –

+1

아주 좋아, 나는 수학 사람들에게 대신 물어볼 것입니다. 나는 컴퓨팅에 사용된다고 여기에서 사람들이 알 수있을 것이라고 생각했다. 고맙습니다. –

답변

2

이 질문은 공정한 CS 문제라고 생각합니다. 그래서 어떻게 해결했는지 보여 드리겠습니다. 주어진 x는 그와 연관된 y 값이 둘 이상일 수 있습니다. 내가 이것을 필요로하는 경우에, 그것은 사실이 될 수 없다는 것이 보장되었으므로, 당신이 원하는 것을 결정하는 방법을 알아 내야 할 것입니다.

x 및 y 값의 배열을 생성하는 동안 반복되었습니다. 제 목적을 위해 상당히 높은 해상도로했습니다. (저는 8 비트 룩업 테이블을 생성하려고 했으므로 ~ 1000 포인트를 사용했습니다.) 방금 배열을 저장하기 위해 다음 x 및 다음 y 좌표의 베 지어 방정식에 t를 연결했습니다. 전체 내용을 생성하고 나면 배열을 스캔하여 가장 가까운 2 개의 x 값을 찾습니다. (또는 정확히 일치하는 것이 있다면 그것을 사용했습니다.) 그런 다음, 필자는 필자가 필요로하는 y 값을 얻기 위해 그 아주 작은 선분에 대해 선형 보간법을 사용했습니다.

5

큐빅 베 지어 곡선을 표현하는 세 가지 일반적인 방법이 있습니다. X

이 처음 두
y(x) = sum(f_i(x) a_i) 
    = (1-x)^3 * y0 + 3*(1-x)^2 * x * y1 + 3*(1-x) * x^2 * y2 + x^3 * y3 

의 함수로서

x(t) = sum(f_i(t) a_i) 
    = (1-t)^3 * x0 + 3*(1-t)^2 * t * x1 + 3*(1-t) * t^2 * x2 + t^3 * x3 

둘째 Y t

의 함수로서

먼저 X는 변수에 대한 다른 이름을 사용하여 수학적으로 동일하다.

설명에 따르면 "큐빅 베 지어 곡선에 Y 좌표가 있으며 x 좌표가 있습니다." 두 번째 방정식을 사용하여 질문을 얻었을 것입니다. 첫 번째 방정식을 다시 정리하려고합니다. 그렇다면 재배치 나 해결이 필요하지 않습니다. x 값을 연결하면 해결할 수 있습니다.

당신은 세 번째 종류의 방정식을 가질 가능성이 있습니다. 이것은 추한 하드 케이스입니다. 이것은 x 및 y 매개 변수 둘 다 세 번째 변수 t의 3 차 베 지어입니다.

x(t) = sum(f_i(t) x_i) 
y(t) = sum(f_i(t) y_i) 

이 경우입니다.알려 주시면 문제를 해결하기 위해해야 ​​할 일을 자세히 설명해 드리겠습니다.

+0

매개 변수화 된 버전을 해결할 수 있습니까? 나는 매개 변수화 된'x'와'y'를 가진다. ''x '가 주어지면''y' '가 필요합니다. 그래서 저는't'을 모르지만'x'를 알고 있습니다. – activatedgeek

+1

@activatedGeek - 귀하의 사건을 반드시 해결할 수있는 것은 아닙니다. 해결책, 해결책, 많은 해결책 또는 무한히 많은 해결책 (슬픈)이 있을지도 모릅니다. 가장 좋은 방법은 베 지어 곡선이 제어점의 볼록한 선체 안에 들어가는 것을 보장하는 것입니다. 그런 다음 각 세그먼트 CVH가 x 값을 넘을 수 있는지 여부를 고려하십시오 (목록을 무시한 경우). 이제 각 세그먼트에서 베 지어 중간 점 분할을 적용하여 베 지어 세그먼트의 새 목록을 가져옵니다. 모든 세그먼트가 충분히 "작을 때까지 폐기 및 분리를 반복하십시오. 그것들은 당신의 솔루션입니다. –

+0

좋아, 나는 소스로 곧장 갈 것이다. [this (http://cubic-bezier.com/#.17,.67,.83,.67)]이 어떻게 작동하는지 알려 주실 수 있습니까? 커브가 왼쪽에 그려져있는 방법을 이해합니다. 내가 이해할 수없는 것은 어떻게하면 애니메이션의 시간을 변환하여 '베 지어 곡선'의 't'매개 변수를 'T 초'에 애니메이션을 포함하도록 매핑 할 수 있다는 것입니다. – activatedgeek

1

을 실행하면 더 당신이 (1 - t) 요인

제거해야 발현을 개발 :

wxMaxima 또는 Maple (당신이 생각이 하나의 매개 변수 t을 추가해야합니다) 중 하나에서
expand(800*t^3 + 3*(1-t)*800*t^2 + 3*(1-t)^2*600*t + (1-t)^3*100 -400 = 0); 

, 당신은 얻는다 :

100*t^3 - 900*t^2 + 1500*t - 300 = 0 

를위한 새로운 입방 방정식을 얻으십시오 10 (당신이 그것에 대해 the cubic equation formula을 사용할 수 있습니다) 당신이 t을 얻었다 후, 당신은 x 일을 찾을 수 있습니다 : 그래서 방법의 일종 주위를 찾고 있었어요

x = (x4 - x0) * t  (asuming x4 > x0) 
0

은 나를 Y- 찾을 수 있도록 큐빅 베 지어 커브에서 x 좌표가 주어지면 좌표를 지정합니다.

제어점이 (0, 33) 및 (0, 66) 인 점 (0, 0)과 점 (0, 100) 사이의 3 차 곡선을 생각해보십시오. 주어진 X에 대해 Y의 무한 개수가 있습니다. 따라서 주어진 임의의 3 차 베 지어에 대해 X를 주어진 Y를 풀 수있는 방정식은 없습니다. 강력한 솔루션에 대한

, 당신은 가능성이 각각의 세그먼트가 직선에 근접 할 때까지 반복적으로 De Casteljau's algorithm

분할과 곡선을 시작할 수 있습니다. 그런 다음 이러한 다양한 선분이 사용자의 x를 가로 채는지 여부 및 x 및 x가 찾고자하는 x에 해당하는 수직 선분인지 여부를 감지 할 수 있습니다 (위의 예 참조).