По своей природе сплайн является приближенным. Вы можете уменьшить количество используемых сплайнов, чтобы достичь более высокой степени сжатия.
Вы также можете добиться сжатия без потерь, используя какую-то схему кодирования. Я просто придумываю это, набирая текст, используя пример диапазона в предыдущем ответе (1000 для x и 400 для y),
- Каждой точке нужно только 19 бит (10 для x, 9 для y). Вы можете использовать 3 байта для представления координаты.
- Используйте 2 байта для представления смещения до +/- 63.
- Используйте 1 байт для представления короткого смещения до +/- 7 для x, +/- 3 для y.
Чтобы правильно декодировать последовательность, вам понадобится некоторый префикс для определения типа кодирования. Допустим, мы используем 110 для полной точки, 10 для смещения и 0 для короткого смещения.
Битовая разметка будет выглядеть так:
Coordinates: 110xxxxxxxxxxxyyyyyyyyyy
Dislacement: 10xxxxxxxyyyyyyy
Short Displacement: 0xxxxyyy
Если ваша последовательность не является полностью случайной, вы можете легко достичь высокой степени сжатия с помощью этой схемы.
Давайте посмотрим, как это работает, на коротком примере.
3 балла: A (500, 400), B (550, 380), C (545, 381)
Допустим, вы использовали 2 байта для каждой координаты. Кодирование без сжатия займет 16 байт.
Для кодирования последовательности с использованием схемы сжатия,
A - первая точка, поэтому будет использоваться полная координата. 3 байта.
Смещение B от A равно (50, -20) и может быть закодировано как смещение. 2 байта.
Смещение C от B равно (-5, 1) и соответствует диапазону короткого смещения 1 байт.
Таким образом, вы экономите 10 байтов из 16 байтов. Реальная степень сжатия полностью зависит от структуры данных. Лучше всего работает на точках, образующих движущийся путь. Если очки случайные, экономия может достигать только 25%.