将任意三angular形打包成一个有限的盒子?

作为3D优化的一部分,我需要将三angular形合理地包装到一个盒子中(我正在将不同材质的片段填充到一个单独的纹理中,用于深度分类,所以纹理不会切换与每一个新的三)

有没有一个algorithm来做到这一点? 三angular形本身可以制作成可以(可变形为正确的angular度,有效地使这个盒子填充algorithm,而不是),但我想避免这一点,如果可能的话,因为它会扭曲底层的纹理艺术。

“合理合理” – >工作总比没有好。

这些代码片段提供了一个简单的解决scheme,以形状(也三angular形)一条带一个东西填充到一个矩形。

 public abstract class Shape { protected Point offset = new Point(); public abstract int getHeight(); public abstract int getWidth(); } public class Triangle extends Shape { // all points are relative to offset (from Shape) Point top = new Point(); // top.y is always 0, left.y >= 0 right.y >= 0 Point left = new Point(); // left.x < right.x Point right = new Point(); public int getHeight() { return left.y >= right.y ? left.y : right.y; } public int getWidth() { int xmin = left.x <= top.x ? left.x : top.x; int xmax = right.x >= top.x ? right.x : top.x; return xmax - xmin; } } public class StuffRectangle extends Shape { private Point ww = new Point(); private ArrayList<Shape> maintained = new ArrayList<Shape>(); private int insx; private int insy; private int maxy; public int getHeight() { return ww.y; } public int getWidth() { return ww.x; } public void clear() { insx = 0; insy = 0; maxy = 0; maintained.clear(); } /** * Fill the rectangle band by band. * * The inserted shapes are removed from the provided shape collection. * * @param shapes * the shapes to insert * @return the count of inserted shapes. */ public int stuff(Collection<Shape> shapes) { int inserted = 0; for (;;) { int insertedInPass = 0; for (Iterator<Shape> i = shapes.iterator(); i.hasNext();) { Shape shape = i.next(); // does the shape fit into current band? int sx = shape.getWidth(); if (insx + sx > getWidth()) continue; int sy = shape.getHeight(); if (insy + sy > getHeight()) continue; // does fit ++insertedInPass; // remove from shapes i.remove(); // add to maintained and adjust offset maintained.add(shape); shape.offset.x = insx; shape.offset.y = insy; insx += sx; if (sy > maxy) maxy = sy; } inserted += insertedInPass; if (shapes.isEmpty()) break; // nothing fits current band - try a new band if (insertedInPass == 0) { // already a new band - does not fit at all if (insx == 0) break; // start new band insx = 0; insy += maxy; maxy = 0; continue; } } return inserted; } }