![JAR search and dependency download from the Maven repository](/logo.png)
org.meteoinfo.chart.jogl.mc.ExtractHandler Maven / Gradle / Ivy
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.meteoinfo.chart.jogl.mc;
import java.io.*;
import java.util.ArrayList;
/**
* Created by Primoz on 11. 07. 2016.
*/
public class ExtractHandler {
public static void extractHandlerChar(File inputFile, File outFile, final int[] size, final float voxSize[], final char isoValue, int nThreads) {
char[] scalarField;
if (inputFile != null) {
System.out.println("PROGRESS: Reading input data.");
try {
int idx = 0;
scalarField = new char[size[0] * size[1] * size[2]];
DataInputStream in = new DataInputStream(new FileInputStream(inputFile));
while (in.available() > 0) {
// Size does not match
if (idx >= scalarField.length) {
in.close();
System.out.println("Invalid volume size was specified.");
return;
}
scalarField[idx++] = (char) in.readByte();
}
in.close();
// Size does not match
if (idx != scalarField.length) {
System.out.println("Invalid volume size was specified.");
return;
}
}
catch (Exception e) {
System.out.println("Something went wrong while reading the volume");
return;
}
}
else {
System.out.println("PROGRESS: Generating volume data.");
scalarField = VolumeGenerator.generateScalarFieldChar(size);
}
final char[] finalScalarField = scalarField;
ArrayList threads = new ArrayList<>();
final ArrayList> results = new ArrayList<>();
// Thread work distribution
int remainder = size[2] % nThreads;
int segment = size[2] / nThreads;
// Z axis offset for vertice position calculation
int zAxisOffset = 0;
System.out.println("PROGRESS: Executing marching cubes.");
for (int i = 0; i < nThreads; i++) {
// Distribute remainder among first (remainder) threads
int segmentSize = (remainder-- > 0) ? segment + 1 : segment;
// Padding needs to be added to correctly close the gaps between segments
final int paddedSegmentSize = (i != nThreads - 1) ? segmentSize + 1 : segmentSize;
// Finished callback
final CallbackMC callback = new CallbackMC() {
@Override
public void run() {
results.add(getVertices());
}
};
// Java...
final int finalZAxisOffset = zAxisOffset;
// Start the thread
Thread t = new Thread() {
public void run() {
MarchingCubes.marchingCubesChar(finalScalarField, new int[]{size[0], size[1], paddedSegmentSize}, size[2], voxSize, isoValue, finalZAxisOffset, callback);
}
};
threads.add(t);
t.start();
// Correct offsets for next iteration
zAxisOffset += segmentSize;
}
// Join the threads
for (int i = 0; i 0) {
// Size does not match
if (idx >= scalarField.length) {
in.close();
System.out.println("Invalid volume size was specified.");
return;
}
scalarField[idx++] = in.readShort();
}
in.close();
// Size does not match
if (idx != scalarField.length) {
System.out.println("Invalid volume size was specified.");
return;
}
}
catch (Exception e) {
System.out.println("Something went wrong while reading the volume");
return;
}
}
else {
System.out.println("PROGRESS: Generating volume data.");
scalarField = VolumeGenerator.generateScalarFieldShort(size);
}
final short[] finalScalarField = scalarField;
ArrayList threads = new ArrayList<>();
final ArrayList> results = new ArrayList<>();
// Thread work distribution
int remainder = size[2] % nThreads;
int segment = size[2] / nThreads;
// Z axis offset for vertice position calculation
int zAxisOffset = 0;
System.out.println("PROGRESS: Executing marching cubes.");
for (int i = 0; i < nThreads; i++) {
// Distribute remainder among first (remainder) threads
int segmentSize = (remainder-- > 0) ? segment + 1 : segment;
// Padding needs to be added to correctly close the gaps between segments
final int paddedSegmentSize = (i != nThreads - 1) ? segmentSize + 1 : segmentSize;
// Finished callback
final CallbackMC callback = new CallbackMC() {
@Override
public void run() {
results.add(getVertices());
}
};
// Java...
final int finalZAxisOffset = zAxisOffset;
// Start the thread
Thread t = new Thread() {
public void run() {
MarchingCubes.marchingCubesShort(finalScalarField, new int[]{size[0], size[1], paddedSegmentSize}, size[2], voxSize, isoValue, finalZAxisOffset, callback);
}
};
threads.add(t);
t.start();
// Correct offsets for next iteration
zAxisOffset += segmentSize;
}
// Join the threads
for (int i = 0; i 0) {
// Size does not match
if (idx >= scalarField.length) {
in.close();
System.out.println("Invalid volume size was specified.");
return;
}
scalarField[idx++] = in.readInt();
}
in.close();
// Size does not match
if (idx != scalarField.length) {
System.out.println("Invalid volume size was specified.");
return;
}
}
catch (Exception e) {
System.out.println("Something went wrong while reading the volume");
return;
}
}
else {
System.out.println("PROGRESS: Generating volume data.");
scalarField = VolumeGenerator.generateScalarFieldInt(size);
}
final int[] finalScalarField = scalarField;
ArrayList threads = new ArrayList<>();
final ArrayList> results = new ArrayList<>();
// Thread work distribution
int remainder = size[2] % nThreads;
int segment = size[2] / nThreads;
// Z axis offset for vertice position calculation
int zAxisOffset = 0;
System.out.println("PROGRESS: Executing marching cubes.");
for (int i = 0; i < nThreads; i++) {
// Distribute remainder among first (remainder) threads
int segmentSize = (remainder-- > 0) ? segment + 1 : segment;
// Padding needs to be added to correctly close the gaps between segments
final int paddedSegmentSize = (i != nThreads - 1) ? segmentSize + 1 : segmentSize;
// Finished callback
final CallbackMC callback = new CallbackMC() {
@Override
public void run() {
results.add(getVertices());
}
};
// Java...
final int finalZAxisOffset = zAxisOffset;
// Start the thread
Thread t = new Thread() {
public void run() {
MarchingCubes.marchingCubesInt(finalScalarField, new int[]{size[0], size[1], paddedSegmentSize}, size[2], voxSize, isoValue, finalZAxisOffset, callback);
}
};
threads.add(t);
t.start();
// Correct offsets for next iteration
zAxisOffset += segmentSize;
}
// Join the threads
for (int i = 0; i 0) {
// Size does not match
if (idx >= scalarField.length) {
in.close();
System.out.println("Invalid volume size was specified.");
return;
}
scalarField[idx++] = in.readFloat();
}
in.close();
// Size does not match
if (idx != scalarField.length) {
System.out.println("Invalid volume size was specified.");
return;
}
}
catch (Exception e) {
System.out.println("Something went wrong while reading the volume");
return;
}
}
else {
System.out.println("PROGRESS: Generating volume data.");
scalarField = VolumeGenerator.generateScalarFieldFloat(size);
}
final float[] finalScalarField = scalarField;
// TIMER
ArrayList threads = new ArrayList<>();
final ArrayList> results = new ArrayList<>();
// Thread work distribution
int remainder = size[2] % nThreads;
int segment = size[2] / nThreads;
// Z axis offset for vertice position calculation
int zAxisOffset = 0;
System.out.println("PROGRESS: Executing marching cubes.");
for (int i = 0; i < nThreads; i++) {
// Distribute remainder among first (remainder) threads
int segmentSize = (remainder-- > 0) ? segment + 1 : segment;
// Padding needs to be added to correctly close the gaps between segments
final int paddedSegmentSize = (i != nThreads - 1) ? segmentSize + 1 : segmentSize;
// Finished callback
final CallbackMC callback = new CallbackMC() {
@Override
public void run() {
results.add(getVertices());
}
};
// Java...
final int finalZAxisOffset = zAxisOffset;
// Start the thread
Thread t = new Thread() {
public void run() {
MarchingCubes.marchingCubesFloat(finalScalarField, new int[]{size[0], size[1], paddedSegmentSize}, size[2], voxSize, isoValue, finalZAxisOffset, callback);
}
};
threads.add(t);
t.start();
// Correct offsets for next iteration
zAxisOffset += segmentSize;
}
// Join the threads
for (int i = 0; i 0) {
// Size does not match
if (idx >= scalarField.length) {
in.close();
System.out.println("Invalid volume size was specified.");
return;
}
scalarField[idx++] = in.readDouble();
}
in.close();
// Size does not match
if (idx != scalarField.length) {
System.out.println("Invalid volume size was specified.");
return;
}
}
catch (Exception e) {
System.out.println("Something went wrong while reading the volume");
return;
}
}
else {
System.out.println("PROGRESS: Generating volume data.");
scalarField = VolumeGenerator.generateScalarFieldDouble(size);
}
final double[] finalScalarField = scalarField;
// TIMER
ArrayList threads = new ArrayList<>();
final ArrayList> results = new ArrayList<>();
// Thread work distribution
int remainder = size[2] % nThreads;
int segment = size[2] / nThreads;
// Z axis offset for vertice position calculation
int zAxisOffset = 0;
System.out.println("PROGRESS: Executing marching cubes.");
for (int i = 0; i < nThreads; i++) {
// Distribute remainder among first (remainder) threads
int segmentSize = (remainder-- > 0) ? segment + 1 : segment;
// Padding needs to be added to correctly close the gaps between segments
final int paddedSegmentSize = (i != nThreads - 1) ? segmentSize + 1 : segmentSize;
// Finished callback
final CallbackMC callback = new CallbackMC() {
@Override
public void run() {
results.add(getVertices());
}
};
// Java...
final int finalZAxisOffset = zAxisOffset;
// Start the thread
Thread t = new Thread() {
public void run() {
MarchingCubes.marchingCubesDouble(finalScalarField, new int[]{size[0], size[1], paddedSegmentSize}, size[2], voxSize, isoValue, finalZAxisOffset, callback);
}
};
threads.add(t);
t.start();
// Correct offsets for next iteration
zAxisOffset += segmentSize;
}
// Join the threads
for (int i = 0; i > results, File outFile) {
try {
BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(outFile));
int idx = 0;
for (int i = 0; i < results.size(); i++) {
ArrayList resSeg = results.get(i);
for (int j = 0; j < resSeg.size(); j++) {
if (idx % 3 == 0) {
stream.write(("f " + (idx + 1) + " " + (idx + 2) + " " + (idx + 3) + "\n").getBytes());
}
idx ++;
stream.write(("v " + resSeg.get(j)[0] + " " + resSeg.get(j)[1] + " " + resSeg.get(j)[2] + "\n").getBytes());
}
}
stream.flush();
stream.close();
}
catch (Exception e) {
System.out.println("Something went wrong while writing to the output file");
return;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy