Совмещаем 3 поплавка? - PullRequest
       1

Совмещаем 3 поплавка?

1 голос
/ 04 марта 2012

Я работаю с огромными 3D-моделями, и мне нужно записать их в файл для последующего использования.У меня ограниченное дисковое пространство, поэтому мне нужно найти способ сэкономить место.

Для каждой вершины в модели, которую я хотел бы как-то «объединить» значения X, Y и Z (с плавающей точкой), а затембыть в состоянии расшифровать их при загрузке данных.

Поплавки будут иметь максимальную точность не более 3 цифр (т. е. 3.456).

Сначала у меня была идея получить среднее значение, если3 с плавающей запятой, и затем имеют другое значение, из которого я могу каким-то образом извлечь значения X и Y, из которых затем я могу получить значение Z из среднего значения.Но, попробовав это, я не смог заставить его работать должным образом.

Моя цель - каким-то образом объединить 3 числа с плавающей точкой в ​​одно целое число, но я не думаю, что это возможно.

У кого-нибудь есть идеи, как мне это сделать?

Спасибо!;)

Ответы [ 4 ]

2 голосов
/ 04 марта 2012

Если числа действительно имеют точность до 3 цифр (например, 3,45), и все они имеют значения от 0 до 9,99, то вы можете легко поместить их в одно 32-разрядное целое число:

int value =
  (int)Math.Round(x * 100.0) * 1000000 +
  (int)Math.Round(y * 100.0) * 1000 +
  (int)Math.Round(z * 100.0);

Если числа имеют точность до 4 цифр (например, 3.456), то вам нужно еще несколько битов, то есть как минимум 40. Если значения могут быть больше 9.99, вам нужно еще шесть бит, чтобы описать, где должен быть размещен десятичный разделитель .

1 голос
/ 04 марта 2012

Использование библиотеки сжатия, такой как zlib, обычно более эффективно, чем умение сохранять биты.(На самом деле, быть умным может навредить вам, если вы все-таки решите использовать zlib.)

Если вы знали, что вам нужна точность, и все 3 числа находятся в одной шкале, вы можете сохранить один показатель3 мантиссы.Но сначала я попробую zlib, прежде чем перейти к такому подходу.

Я добавлю, что, zlib или нет, будет полезно сохранить каждое число как смещение относительно некоторой близлежащей точки привязки.Многие форматы трехмерных моделей уже делают это, имея иерархию относительно позиционированных объектов.Таким образом, смещение может быть меньше, поэтому для одинаковой абсолютной точности необходимо меньше битов.

1 голос
/ 04 марта 2012

Нет. Принцип голубиных отверстий .

Или в битах: 10.xyz, независимо от двоичного представления, уже занимает не менее 13 бит; 3 * 13 - это 39, которые не помещаются в 32 бита.

0 голосов
/ 04 марта 2012

Я не знаю, насколько хорошо CLR справится с этим, но в Ada вы можете определить числовые типы с фиксированной запятой и указать размер, который он должен занимать.

type MY_FIXED is delta 0.001  range -4.0..12.0; -- Or whatever your valid range.
For MY_FIXED'Size use SIZE_IN_BITS;

Вы можете получить компилятор .NET Ada здесь: http://libre.adacore.com/libre/download2

(Убедитесь, что у вас есть windows-dotnet) ... Я этого не делал, но слышу, что вы можете интегрировать его в Visual Studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...