use of org.twak.utils.geom.ObjDump in project chordatlas by twak.
the class SliceSolver method buildRunGurobi.
private void buildRunGurobi(Slice slice, double delta, List<State> states) {
double[][] fit = new double[states.size()][states.size()];
System.out.println("data fit");
for (int i = 0; i < states.size(); i++) {
for (int j = 0; j < states.size(); j++) {
fit[i][j] = dataFit(states.get(i).filtered, states.get(j).con.out);
System.out.print(fit[i][j] + " ");
}
System.out.println();
}
System.out.println("slice align");
double[][] align = new double[states.size()][states.size()];
for (int i = 0; i < states.size(); i++) {
for (int j = 0; j < states.size(); j++) {
align[j][i] = align(states.get(i).con.out, states.get(j).con.out);
System.out.print(align[j][i] + " ");
}
System.out.println();
}
// for ( int j = 0; j < states.size(); j++ ) {
// double t = 0;
// for ( int i = 0; i < states.size(); i++ ) {
// if (fit[i][j] != Double.MAX_VALUE)
// t += fit[i][j];
// }
// System.out.println(" j " +j +" ++ "+t);
// }
int[] res = sliceOptimize(states.size(), fit, align);
if (res == null) {
System.err.println("no solution found");
return;
}
ObjDump out = new ObjDump();
states.stream().forEach(x -> CutHoles.cutHoles(x.con.out, P.CON_TOL / 5));
double height = slice.min[slice.majorAxis];
for (int i = 0; i < res.length; i++) {
System.out.print(res[i] + ", ");
State s = states.get(res[i]);
Slice.extrude(out, s.con.out, height, height + delta);
Slice.capAtHeight(out, s.con.out, false, height);
Slice.capAtHeight(out, s.con.out, true, height + delta);
height += delta;
}
out.dump(outfile);
}
use of org.twak.utils.geom.ObjDump in project chordatlas by twak.
the class SliceSolver method slicesByDataFit.
private void slicesByDataFit(Slice slice, double delta, List<State> states) {
{
Cache<State, Double> cache = new Cache<State, Double>() {
@Override
public Double create(State i) {
double out = 0;
for (State s : states) {
double d = dataFit(s.filtered, i.con.out);
if (d != Double.MAX_VALUE)
out += d;
else
out += 1e3;
}
if (out == 0)
out = Double.MAX_VALUE;
return out;
}
};
Collections.sort(states, new Comparator<State>() {
public int compare(State o1, State o2) {
return -Double.compare(cache.get(o1), cache.get(o2));
}
});
states.stream().forEach(s -> CutHoles.cutHoles(s.con.out, P.CON_TOL / 5));
ObjDump out = new ObjDump();
double height = slice.min[slice.majorAxis];
for (int i = 0; i < states.size(); i++) {
State s = states.get(i);
System.out.println(" >>>> " + cache.get(s));
Slice.extrude(out, s.con.out, height, height + delta);
Slice.capAtHeight(out, s.con.out, false, height);
Slice.capAtHeight(out, s.con.out, true, height + delta);
height += delta * 3;
}
out.dump(outfile);
}
}
use of org.twak.utils.geom.ObjDump in project chordatlas by twak.
the class GMLReader method main1.
public static void main1(String[] args) {
Graph2D g2 = readGMLToGraph(new File("/home/twak/data/langham/langham.gml"));
g2.removeInnerEdges();
Point2d offset = new Point2d();
int count = 0;
for (Point2d p : g2.map.keySet()) for (Line l : g2.get(p)) {
count++;
offset.add(l.start);
System.out.println(l);
}
offset.scale(1. / count);
System.out.println("offset is " + offset);
AffineTransform at = AffineTransform.getScaleInstance(-1, 1);
at.concatenate(AffineTransform.getTranslateInstance(-offset.x, -offset.y));
g2 = g2.apply(at);
UnionWalker uw = new UnionWalker();
for (Point2d a : g2.map.keySet()) {
for (Line l : g2.get(a)) {
uw.addEdge(l.start, l.end);
}
}
LoopL<Point2d> out = uw.findAll();
ObjDump obj = new ObjDump();
for (Loop<Point2d> loop : out) {
List<Point3d> pts = new ArrayList();
for (Point2d pt : loop) pts.add(new Point3d(pt.x, 0, pt.y));
obj.addFace(pts);
}
obj.dump(new File(Tweed.SCRATCH + "langham.obj"));
}
use of org.twak.utils.geom.ObjDump in project chordatlas by twak.
the class TweedFrame method buildUI.
public JComponent buildUI() {
JPanel out = new JPanel(new BorderLayout());
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
// Build the first menu.
JMenu menu = new JMenu("File");
menuBar.add(menu);
JMenuItem save = new JMenuItem("save", KeyEvent.VK_S);
save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
menu.add(save);
save.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (TweedSettings.folder == null) {
new SimpleFileChooser(frame) {
@Override
public void heresTheFile(File f) throws Throwable {
TweedSettings.folder = f;
TweedSettings.save(false);
}
};
} else
TweedSettings.save(false);
}
});
JMenuItem load = new JMenuItem("open...", KeyEvent.VK_O);
load.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
menu.add(load);
load.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SimpleFileChooser(frame, false, "select a tweed.xml", Tweed.DATA == null ? null : new File(Tweed.DATA), TWEED_XML) {
@Override
public void heresTheFile(File f) throws Throwable {
TweedSettings.load(f);
}
};
}
});
JMenuItem recent = new JLazyMenu("open recent") {
@Override
public List<Runnable> getEntries() {
List<Runnable> out = new ArrayList();
for (File r : TweedSettings.recentFiles.f) {
out.add(new Runnable() {
@Override
public void run() {
if (!r.exists())
JOptionPane.showMessageDialog(frame, "Location " + r.getName() + "not found (is it still there?)");
else
TweedSettings.load(r);
}
@Override
public String toString() {
return r.getName();
}
});
}
return out;
}
};
menu.add(recent);
JMenuItem neu = new JMenuItem("new...", KeyEvent.VK_N);
neu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
menu.add(neu);
neu.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SimpleFileChooser(frame, false, "select a file in the root of the workspace") {
@Override
public void heresTheFile(File f) throws Throwable {
TweedSettings.folder = f.getParentFile();
if (new File(TweedSettings.folder, TWEED_XML).exists()) {
JOptionPane.showMessageDialog(frame, TWEED_XML + " already exists at this location, pick another (or delete...)");
return;
}
TweedSettings.load(TweedSettings.folder);
}
};
}
});
// JMenuItem remove = new JMenuItem( "delete layer", KeyEvent.VK_MINUS );
// remove.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_MINUS, ActionEvent.CTRL_MASK ) );
// menu.add( remove );
// remove.addActionListener( new java.awt.event.ActionListener() {
// @Override
// public void actionPerformed( ActionEvent e ) {
// if ( selectedGen != null )
// removeGen( selectedGen );
// };
// } );
JMenuItem resetCam = new JMenuItem("reset view", KeyEvent.VK_R);
resetCam.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.CTRL_MASK));
menu.add(resetCam);
resetCam.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tweed.resetCamera();
}
});
JMenuItem settings = new JMenuItem("settings...", KeyEvent.VK_R);
settings.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, ActionEvent.CTRL_MASK));
menu.add(settings);
settings.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Auto(TweedSettings.settings).frame();
}
});
JMenuItem resetBG = new JMenuItem("reset background", KeyEvent.VK_MINUS);
resetBG.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, ActionEvent.CTRL_MASK));
menu.add(resetBG);
resetBG.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tweed.enqueue(new Runnable() {
@Override
public void run() {
TweedFrame.this.tweed.clearBackground();
}
});
}
});
JMenuItem obj = new JMenuItem("export obj...", KeyEvent.VK_E);
obj.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, ActionEvent.CTRL_MASK));
menu.add(obj);
obj.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ObjDump dump = new ObjDump();
for (Gen g : genList) if (g.visible && g instanceof IDumpObjs)
((IDumpObjs) g).dumpObj(dump);
new SimpleFileChooser(frame, true, "save all as obj", new File(Tweed.SCRATCH, "all.obj"), "obj") {
@Override
public void heresTheFile(File f) throws Throwable {
dump.dump(f);
}
};
}
});
layerList = new JPanel(new ListDownLayout());
JPanel layers = new JPanel();
layers.setLayout(new BorderLayout());
layers.add(new JLabel("layers:"), BorderLayout.NORTH);
JScrollPane listScroll = new JScrollPane(layerList);
listScroll.getVerticalScrollBar().setUnitIncrement(50);
listScroll.setPreferredSize(new Dimension(200, 300));
layers.add(listScroll, BorderLayout.CENTER);
JPanel addRemoveLayer = new JPanel();
{
addRemoveLayer.setLayout(new GridLayout(1, 2));
layers.add(addRemoveLayer, BorderLayout.SOUTH);
JButton addLayer = new JButton("+");
addLayer.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
addLayer(e);
}
});
JButton removeLayer = new JButton("-");
removeLayer.addActionListener(e -> removeGen(selectedGen));
addRemoveLayer.add(addLayer);
addRemoveLayer.add(removeLayer);
}
JPanel options = new JPanel(new BorderLayout());
{
options.add(new JLabel("options:"), BorderLayout.NORTH);
options.add(genUI, BorderLayout.CENTER);
}
JSplitPane pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, layers, options);
out.add(pane, BorderLayout.CENTER);
JPanel toolPanel = new JPanel(new ListRightLayout());
tweed.addUI(toolPanel);
coordLabel = new JLabel("");
coordLabel.setHorizontalAlignment(SwingConstants.CENTER);
worldLabel = new JLabel("");
worldLabel.setHorizontalAlignment(SwingConstants.CENTER);
crsLabel = new JLabel("none");
crsLabel.setHorizontalAlignment(SwingConstants.CENTER);
out.add(toolPanel, BorderLayout.NORTH);
JPanel coords = new JPanel(new ListDownLayout());
coords.add(worldLabel);
coords.add(coordLabel);
coords.add(crsLabel);
out.add(coords, BorderLayout.SOUTH);
out.setPreferredSize(new Dimension(300, frame.getHeight()));
return out;
}
Aggregations