Тема: Дивний float з буковкою E ніяк не обробляється [ВИРІШЕНО]
Хай. Суть задачі була така - зайти в Unity3D, експортувати дані карти висот в файлик, потім зайти в Java-проект, завантажити ці дані, і по ним побудувати таку ж карту, яка була в Unity3D.
Простіше кажучи - перенести зображення 3D об'єкту, котрий задається картою висот з одної проги в іншу.
Ну от я напісюлькав такий код в Java. З комунтарями!
private void Import(String path) throws Exception
{
byte[] bytes = Files.readAllBytes(Paths.get(path)); // зчитую дані з файла
int resolution = (int)Math.sqrt(bytes.length/4); // дані були типу float[,] , тому таким чином я дізнаюсь розмірність матриці
float[] floats=new float[resolution*resolution]; // завантажую всі ці дані в одномірний масив, тому що не існує ніяких матриць, є тільки масиви!!1
ByteBuffer.wrap(bytes).asFloatBuffer().get(floats); // перетворюю масив байтиків в масив float'ів
float step = 100/(resolution-1.0f); // визначаю "проміжність" між вертексами, в даному коді не використовується
for(int i =0; i<20; i++) // тестую з 20*20 квадратиками, в фінальній версії тут буде resolution-1
{
for(int j =0; j<20; j++)
{
vectors.add(new Vector3f(i,(float)Math.ceil(floats[i*resolution+j]),j)); // визначаю 4 вертекси майбутнього кваду
vectors.add(new Vector3f(i+1,(float)Math.ceil(floats[(i+1)*resolution+j]),j));
vectors.add(new Vector3f(i+1,(float)Math.ceil(floats[(i+1)*resolution+(j+1)]),j+1));
vectors.add(new Vector3f(i,(float)Math.ceil(floats[i*resolution+(j+1)]),j+1));
System.out.println((float)Math.ceil(floats[i*resolution+j])); // висвітлюю значення висот для перевірки
System.out.println((float)Math.ceil(floats[(i+1)*resolution+j]));
System.out.println((float)Math.ceil(floats[(i+1)*resolution+(j+1)]));
System.out.println((float)Math.ceil(floats[i*resolution+(j+1)]));
}
}
}
Квади будуються от так
Біда в тому, що в масиві з висотами знаходяться от такі дані (я їх спробував округлити, аби обійти проблеми кривих float'ів, але ті криві флоати мають імунітет до округлення)
Як бачите, деякі float'и округлились, а от ті з експонентою - ні.
Як то вирішити? Округлювати дані вже при записі, чи як?
p.s. от сітка, котра будується, якщо замінити висоти на константу
код виглядає так
for(int i =0; i<20; i++) // тестую з 20*20 квадратиками, в фінальній версії тут буде resolution-1
{
for(int j =0; j<20; j++)
{
vectors.add(new Vector3f(i,0,j)); // визначаю 4 вертекси майбутнього кваду
vectors.add(new Vector3f(i+1,0,j));
vectors.add(new Vector3f(i+1,0,j+1));
vectors.add(new Vector3f(i,0,j+1));
System.out.println((float)Math.ceil(floats[i*resolution+j])); // висвітлюю значення висот для перевірки
System.out.println((float)Math.ceil(floats[(i+1)*resolution+j]));
System.out.println((float)Math.ceil(floats[(i+1)*resolution+(j+1)]));
System.out.println((float)Math.ceil(floats[i*resolution+(j+1)]));
}
}
а сітка так
тобто проблема саме в висотах