2009-08-11 6 views
1

포인트 데이터의 배열을 가지며 점의 값은 x 좌표와 y 좌표로 표현됩니다.포인트 데이터의 압축 표현 및 전달

이 점수는 500 포인트 이상 2000 포인트 이상일 수 있습니다.

데이터는 단순한 것에서 매우 복잡한 것까지 범위를 가질 수있는 모션 경로를 나타내며 그 안에 교두를 가질 수도 있습니다.

이 데이터를 하나의 스플라인 또는 스플라인 모음 또는 매우 엄격한 압축을 사용하는 다른 형식으로 나타낼 수 있습니까?

나는 베지에 컬렉션을 표현하려고 노력했지만, 기껏해야 40 %의 절약 효과를 얻고 있습니다. 예를 들어 500 점의 배열이 있다면 1000 개의 데이터 조각이 있으므로 500 x 및 500 y 값을 얻을 수 있습니다. 약 100 개의 이차 베 지어가 있습니다. 각 베 지어는 controlx, controly, anchorx, anchory로 표시됩니다. 은 100 x 4 = 400 PC 데이터를 제공합니다. 그래서 입력 = 1000pcs, 출력 = 400pcs.

나는 이것을 더 자극하고 싶습니다. 어떤 제안입니까?

+0

x 및 y는 어떤 데이터 유형입니까? 어떤 정밀도와 범위가 필요합니까? 스플라인 또는 베 지어 피트는 손실 압축 형식입니다. 어떻게하면 건강에 좋지 않은지 결정할 수 있습니까? –

+0

저는 actionscript 2.0에서 작업 중이며 데이터 유형은 Number입니다. Number 클래스의 범위는 다음과 같습니다. Number.MIN_VALUE = 4.94065645841247e-324 Number.MAX_VALUE = 1.79769313486232e + 308 –

+0

손실에 대해서는 오류 매개 변수가 있습니다.이 매개 변수를 사용하여 베 지어 곡선을 포인트. –

답변

2

본질적으로 스플라인은 근사치입니다. 더 높은 압축 비율에 도달하는 데 사용하는 스플라인 수를 줄일 수 있습니다.

일종의 인코딩 스키마를 사용하여 무손실 압축을 구현할 수도 있습니다. I는 (1,000 X 및 Y 400) 이전 답변의 범위 예를 이용하여, 입력 이대로 단지

  1. 각 점은 19 비트 (X 10, Y 9)를 필요 이것을 만들고있다. 3 바이트를 사용하여 좌표를 나타낼 수 있습니다.
  2. 변위를 최대 +/- 63로 나타낼 때 2 바이트를 사용하십시오.
  3. x는 +/- 7, y는 +/- 3까지의 짧은 변위를 나타내는 데 1 바이트를 사용하십시오.

시퀀스를 올바르게 디코딩하려면 인코딩 형식을 식별 할 수있는 몇 가지 프리픽스가 필요합니다. 전체 점을 110, 변위를 10, 짧은 변위를 0으로 가정 해 봅시다. 당신의 순서가 완전히 무작위 않는

비트 레이아웃과 같이 표시됩니다,

Coordinates:  110xxxxxxxxxxxyyyyyyyyyy 
Dislacement:  10xxxxxxxyyyyyyy 
Short Displacement: 0xxxxyyy 

, 당신은 쉽게 체계 높은 압축 비율을 달성 할 수있다.

간단한 예를 사용하여 작동 원리를 알아 보겠습니다.

3 점 : A (500, 400), B (550, 380), C (545, 381)

는 이제 각 좌표에 대한 2 바이트를 사용했다라고하자. 이것을 압축하지 않고 인코딩하려면 16 바이트가 필요합니다.

의 압축 방식을 이용하여 시퀀스를 인코딩하기

A는 사용되는 좌표 가득 제 점이다. 3 바이트. A에서 B의 변위는 (50, -20)이며 변위로 인코딩 될 수 있습니다. 2 바이트. C에서 B까지의 변위는 (-5, 1)이며 짧은 변위 1 바이트의 범위에 해당합니다.

따라서 16 바이트 중 10 바이트를 절약 할 수 있습니다. 실제 압축 비율은 전적으로 데이터 패턴에 따라 다릅니다. 이동 경로를 형성하는 지점에서 가장 잘 작동합니다. 포인트가 무작위 인 경우 25 % 만 절약 할 수 있습니다.

+0

이 점을 이해하는 것이 약간 어렵다는 것을 알고 있습니다.보기를 설명하고 압축률을 얼마나 높일 수 있습니까? –

+0

고주파수 단발 변위, 변위 및 좌표가 있다고 가정하십시오. 게재 빈도 분포에 실제 차이가 없다면 2 비트 프리픽스를 사용할 수 있습니다. – Indy9000

+0

이 메모 상자에 세부 정보를 입력하기가 너무 어렵습니다. 답변에 추가 한 예를 참조하십시오. –

1

예를 들어 포인트 코드에 32 비트 정수를 사용하고 범위 제한이있는 경우 x : 0..1000, y : 0..400과 같은
과 같이 하나의 32 비트에 (x, y)를 팩할 수 있습니다 비트 변수.

이렇게하면 50 %의 압축률을 달성 할 수 있습니다.

+0

좋은 아이디어! 필자는 입력 데이터를 통해이를 검증해야 할 것입니다. 필자의 포인트 데이터가 어떤 한계를 넘어서는 지 알지 못하기 때문에 데이터가 서명되는 경우가 있습니다. 때로는 좌표가 음수 일 수도 있으므로, 32K 제한 대신 -16k ~ + 16k 범위. –

1

당신은 여기에 물론 내가 막연하게 Huffman coding

+0

좋은 제안, 당신이 말한 응용 프로그램에 관한 예제를 줄 수 있고 어떻게 스크립트에 적용 할 수 있습니다. –

1

는 첫째 만 충분히 소수점을 유지 설명하고, 당신이 인코딩을 나타내는 비트 길이를 변화 사용하려고하는 숫자의 주파수 분석을 할 수있는 당신의 당신이 실제로 필요로하는 데이터. 이들을 제거하면 정확도는 떨어지지 만 계산 된 손실은 줄어 듭니다. 이를 위해 숫자를 문자열로 변환하고 도트의 위치를 ​​찾은 다음 끝에있는 많은 문자를 잘라냅니다. 그것은 수학보다 더 빨리 진행될 수 있습니다, IMO. 마지막으로 다시 숫자로 변환 할 수 있습니다.

150.234636746 -> "150.234636746" -> "150.23" -> 150.23 


둘째, 마지막 번호 ("상대 값")에 관련된 데이터를 저장하려고합니다. 기본적으로이 번호를 빼십시오. 그런 다음 나중에 "압축 해제"하기 위해 누적 기 변수를 유지하고이를 추가 할 수 있습니다.

A A A    A R R 
150, 200, 250  -> 150, 50, 50 
+1

가장 중요한 점은 (1) 소수를 자르고 (2) 친척으로 변환하기 위해 빼기를 기억하십시오. 이 주문을 반대로하면 데이터가 올바르게 합산되지 않으므로 압축 해제 끝에 많은 증분 손실이 발생합니다! –

관련 문제