Bicubic Spline Mapping
1.1.1 개요
Bicubic spline mapping은 주어진 데이터 포인트 사이를 부드럽게 연결하는 방법 중 하나로, 특히 2차원 이미지나 곡선 데이터의 매끄러운 보간에 유용합니다. 이 방법은 각 방향(보통 X축과 Y축)에서 이차적인 곡선을 이용하여 전체적으로 부드러운 표면을 생성하며, 모션 좌표 보정 등에 사용될 수 있습니다.
1.1.2 기본 동작
Source control point와 Target control point를 설정하고 알고리즘을 동작하면 Control point 사이의 모든 위치에 대해 이차적인 곡선을 따라 부드러운 표면의 값을 계산하여 좌표 변환이 가능합니다. 아래의 이미지는 빨간색 Source control Point와 파란색 Target control point를 설정하여 Mapping을 진행한 후에, 그 사이의 좌표들을 변환한 결과입니다. Source -> Target 으로 변환이 가능하며, Target -> Source 로의 복원 변환도 지원합니다.

1.1.3 세부 동작
Mapping Grid 범위를 설정하고 가상 확장 영역을 지정하여 초기화를 먼저 진행합니다. Grid 범위에 맞는 Control point들을 설정하고 Finish 함수를 호출하여 Mapping을 진행합니다. Mapping이 완료되면 Save 함수를 통해 파일에 저장이 가능하며, 세팅이 완료된 상태에서 변환을 진행합니다.
1.1.3.1 초기화
Initialize 함수로 그리드 크기를 설정하고 확장 영역을 지정합니다.
CBicubicSplineMapping bcsMapping;
CFLPoint<int32_t> flpGridSize(5, 5);
const int32_t i32Extension = 3;
bcsMapping.Initialize(flpGridSize, i32Extension);
flpGridSize
: 그리드 크기입니다. 위의 예시에서는 5x5 크기로 설정하였습니다.i32Extension
: 확장 영역입니다. Grid를 가상으로 추가 확장하는 범위이며, 위의 예시처럼 설정하게 되면 상하좌우 3씩 증가하여 총 11x11의 Grid 범위를 Mapping합니다.
1.1.3.2 Control Point 설정
SetControlPoint 함수를 통해 각 그리드 Index에 해당하는 Source 좌표와 Target 좌표를 설정합니다. 초기화 시 설정했던 Grid 수에 맞는 좌표들을 모두 설정해주어야 합니다.
bcsMapping.SetControlPoint(flpGridIndex, flpSource, flpTarget);
flpGridIndex
: Control Point를 설정할 Grid 순서쌍입니다. (int32_t 타입의 CFLPoint)flpSource
: Source Control 포인트입니다(double 타입의 CFLPoint). 모션 매핑을 진행할 때에는 보정하기 전 모션 좌표가 이에 해당됩니다.flpTarget
: Target Control 포인트입니다(double 타입의 CFLPoint). 모션 매핑을 진행할 때에는 보정 결과로 희망하는 좌표가 이에 해당됩니다.
1.1.3.3 Mapping
초기화한 Grid Size에 해당하는 Control Point를 모두 설정하였으면, Finish 함수를 호출하여 설정한 데이터를 통해 Mapping을 진행합니다. Finish 함수 동작에 성공하면 좌표변환을 사용할 수 있으며, Save 함수로 Mapping 데이터를 파일로 저장하여 이후 실행에서 Finish 함수 없이 데이터를 Load 하여 바로 재사용이 가능합니다.
if(bcsMapping.Finish().IsOK())
{
bcsMapping.Save(L"C:/Manual/MappingData.flbcs");
}
데이터가 있을 경우 Finish 없이 Load 하여 사용 가능
bcsMapping.Load(L"C:/Manual/MappingData.flbcs");
1.1.3.4 좌표 변환 및 검증
ConvertSourceToTarget 함수를 사용하여 초기화 시 설정한 Grid 범위 내의 임의의 좌표를 변환할 수 있습니다. ConvertTargetToSource 함수를 사용하면 Target에 해당하는 Grid 범위 내의 임의의 좌표를 본래 Source 좌표로 역변환 할 수 있습니다.
bcsMapping.ConvertSourceToTarget(flpSource, flpTarget);
flpSource
: Source 공간의 범위 내 임의의 좌표입니다(double 타입의 CFLPoint). 모션 매핑의 경우, 보정하기 전 모션 좌표가 이에 해당됩니다.flpTarget
: Target 공간으로 변환된 좌표입니다(double 타입의 CFLPoint). 모션 매핑의 경우, 보정된 모션 좌표가 얻어집니다.
bcsMapping.ConvertTargetToSource(flpTarget, flpConvertedSource);
flpTarget
: Target 공간의 범위 내 임의의 좌표입니다(double 타입의 CFLPoint).flpConvertedSource
: Source 공간으로 역변환된 좌표입니다(double 타입의 CFLPoint).