2017-05-20 2 views
1

저는 베 지어 커브와 관련된 개인 프로젝트를 진행하고 있습니다. 저는 2 차 곡선과 3 차 곡선을 개별적으로 처리하는 많은 구현을 보았습니다. 그러나 커브의 차수를 늘리거나 줄여 제어점을 추가하고 제거 할 수있는 좀 더 일반화 된 알고리즘을 만들려고합니다.다른 차수 (순서)의 베 지어 곡선 간의 변환

이것은 내 주요 질문의 일부는 아니지만 누구나 볼 수있는 일반화 알고리즘의 예를 알고 있다면 그 방향을 지적 할 수 있다면 고맙겠습니다.

우선 저차 곡선에서 고차 곡선으로의 변환은 근사값이며 이에 상응하는 값이 아니라는 것을 이해합니다. 나는 "충분히 가깝게"계산적으로 만족합니다.

둘째, 고차에서 저차 곡선으로 내려갈 때 정보가 손실된다는 사실을 알고 있습니다. 상위 차수 곡선의 곡선이 더 커지므로 낮은 차수 곡선은 근사치를 구할 수 없으므로 피할 수없는 현상입니다.

원하는 기능을 위해 곡선 내 제어점을 더하거나 뺄 필요가 있기 때문에 이러한 제한이 있습니다.

내 첫 번째 질문이 일에 관련되어 5 년 전 약 질문 : Convert quadratic curve to cubic curve

, 2 차 곡선 세 (3) 제어 지점이 있습니다

Vector3 Start; 
Vector3 Control1; 
Vector3 End; 

우리가 소개 입방로 변환 제 4 제어 포인트 ...

Vector3 Control2; 

... "사이"Control1과 End. 다음과 같이 Control1과 Control2를 설정합니다.

Control2 = new Vector3(
    End.x + ((2.0f/3.0f) * (Control1.x - End.x)), 
    End.y + ((2.0f/3.0f) * (Control1.y - End.y)), 
    End.z + ((2.0f/3.0f) * (Control1.z - End.z)) 
); 
Control1 = new Vector3(
    Start.x + ((2.0f/3.0f) * (Control1.x - Start.x)), 
    Start.y + ((2.0f/3.0f) * (Control1.y - Start.y)), 
    Start.z + ((2.0f/3.0f) * (Control1.z - Start.z)) 
); 

정확하지 않을 수도 있습니다. 이 예에서는 'x'구성 요소 만 설정되었습니다. 나는 그것으로부터 'y'와 'z'를 단지 외삽했다. 이것이 올바르지 않다면, 나는 옳은 것이 무엇인지 아는 것에 감사 할 것입니다.

이 예제는 2 차 곡선에서 3 차 곡선으로의 변환에 대해서만 설명합니다. 제어 값은 좌표 설정에서 (2.0f/3.0f)로 나타납니다. 그렇다면 3 차에서 4 차로의 변환은 (2.0f/4.0f) 또는 (3.0f/4.0f) 또는 완전히 다른 것입니까? 임의의 곡선 순서에 대해이 변환에 대해 적절하게 일반화 된 함수는 무엇입니까?

내 프로젝트 또한 스플라인을 사용하여 작업 할 예정입니다. 나는 가장자리가 임의로 정렬 된 커브 1 (a 라인)에서 n으로 정의되는 내 스플라인을 구성하기 위해 edge to edge 메서드를 사용합니다. 여기서 제어 포인트 목록의 첫 번째 및 마지막 Vector3은 모서리 및 연결 모서리는 이전 모서리의 끝점을 다음 모서리의 시작점과 공유합니다.

베 지어 곡선과 달리 제어점을 더하거나 뺍니다. 대신 가장자리를 나누고 결합합니다. 원래 커브를 근사하는 2보다 작지 않은 두 개의 하위 차수 곡선으로 커브를 세분화하는 좋은 방법은 무엇입니까? 마찬가지로 두 개의 곡선을 하나의 고차 곡선으로 결합하는 좋은 방법은 무엇입니까?

나는 이것이 하나의 글에서 많은 질문을한다는 것을 깨닫는다.하지만 나는 그것을 나누는 것보다는 하나의 주제로 함께 생각하는 것이 더 좋다고 느꼈다.

도움 주셔서 감사합니다.

+0

감사합니다. 마이크. 나는 이것이 정확히 내가 무엇을 찾고 있다고 생각한다. – memBrain

+0

기본적으로 대답이기 때문에 대답으로 바꾸어 봅시다. –

답변

0

당신은 거의 사소한 높은 순서로 곡선을 올리기까지 http://pomax.github.io/bezierinfo/#reordering 방법에 대한을 읽을 수 있습니다 : 당신이 실제로 무엇을 각 보면 무서운 보일 수 있지만,

enter image description here

3 학기 중 3 개 모두가 초등 학교 수학의 어리석은 단순 비트입니다. 일반적으로 새 가중치를 원하므로 새로운 좌표 목록으로 생성하는 것은 절대적으로 사소하고 약 1 분 만에 작성됩니다. 자바 스크립트 :

function getOneHigher(x, y): 
    n = x.length; 
    k = n + 1; 
    s = n - 1; 

    let nx = [], ny =[]; 
    nx[0] = x[0]; nx[n] = x[s]; 
    ny[0] = y[0]; ny[n] = y[s]; 

    for (let i=1; i<n; i++) { 
    nx[i] = (n*x[i] + i*x[i-1])/k; 
    ny[i] = (n*y[i] + i*y[i-1])/k; 
    } 

    return {nx, ny}; 
} 

이제 끝났습니다. getOneHigher(x, y)을 호출하면 같은 커브에 대해 두 개의 새로운 좌표 배열이 만들어 지는데,이 커브는 우리가 넣는 것보다 1 단계 높은 베 지어 커브로 표현됩니다. 이것이 의미하는 것은 커브 좌표 집합을 동일하게 유지한다는 것입니다 (그대로 : 함수가 동일 함) (각 파생물은 이 아니기 때문에이 아니기 때문에 각 좌표에서 접선을 줄임)이 곡선이 따라가는 경로를 이동하는 모든 것을 효과적으로 "감속"합니다.

그러면 Sirver 's Castle에 대한 링크 (how to do the lossy conversion down in a way that minimizes loss of information 설명)를 따르기를 원할 것입니다. 그리고 이것은 여러 질문이었을 것입니다. 이것은 Q & 사이트입니다. 특정 질문을하지 않고 기술적으로 관련이없는 몇 가지 항목을 단일 게시물에 결합하면 장래 방문자가 특정 질문에 대한 답변을 찾을 수 없습니다.

+0

이것은 확실히 내가 찾고있는 것입니다. 다시 한 번 감사드립니다! – memBrain