2012-09-29 3 views
0

나는 부드러운 선을 그리려는 포인트 목록을 가지고 있습니다. 드로잉에 RVG 라이브러리를 사용하고 있기 때문에 SVG 문자열을 얻을 수 있다면 행복 할 것입니다. 주변을 검색하여 Catmull-Rom이 아마도 사용할 알고리즘임을 알게되었습니다.Ruby에서 Catmull-Rom 보간

Kamelopard 및 Rubyvis 라이브러리에서 일부 구현을 찾았지만 내 포인트 목록에서이를 사용하는 방법을 이해할 수 없었습니다.

그럼, (x, y) 점의 배열을 가져 와서 Catmull-Rom 보간 된 SVG 커브를 어떻게 얻을 수 있습니까?

+1

Catmull-Rom 자체는 루프 및 기타 아티팩트가 발생하기 쉽습니다. 더 나은 구현은 여기에서 자세히 설명 된 구심력 매개 변수화 된 버전입니다. http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/19283471#19283471 – Ted

답변

1

아마도 Catmull-Rom이 좋은 출발점 일 것입니다. 최근에 Kamelopard 버전을 다시 구현하여 도움이되었습니다. http://www.cs.cmu.edu/~462/projects/assn2/assn2/catmullRom.pdf

매트릭스 곱셈을 이해한다면 매우 간단합니다. 그리는 경로의 한 지점에 한 번씩 여러 번 평가할 때 필요한 행렬 방정식으로 끝납니다. 제어점 A, B, C 및 D가 있고 B와 C 사이에 곡선을 그리려면 A, B, C 및 D 행이있는 행렬을 만들어서 방정식에 내가 연결된 종이의 맨. 목록의 마지막 행렬이됩니다. 당신이 알아야 할 다른 값은 0에서 1까지의 범위 인 "u"와 스플라인의 "장력"인 "T"입니다. 방정식을 여러 번 평가하여 매번 도메인에서 u를 증가시킵니다. 텐션을 0에서 1 사이의 원하는 값으로 설정할 수 있습니다. 그러면 스플라인 곡선이 얼마나 날카롭게 영향을 미치는지 알 수 있습니다. 0.5는 공통 값입니다.

예를 들어 목록의 처음 두 제어점 또는 마지막 두 제어점 사이의 커브를 평가하려는 경우 두 제어점이 필요하므로 행렬을 만드는 데 문제가 있음을 알 수 있습니다 당신이 평가하고있는 지점의 양쪽에. 이러한 경우 필요에 따라 첫 번째 또는 마지막 제어점을 복제하면됩니다.