@@ -0,0 +1,1267 @@
+package nl.dvberkel.layout;%0A%0Aimport nl.dvberkel.box.BoundingBox;%0Aimport nl.dvberkel.box.Translation;%0A%0Aimport static nl.dvberkel.box.BoundingBox.mergeAll;%0A%0Apublic class ConstantAngleLayouter implements Layouter %7B%0A    private static final Aligner HORIZONTAL_ALIGNER = new HorizontalAligner();%0A    private final double factor;%0A%0A    public ConstantAngleLayouter(double angle) %7B%0A        this.factor = Math.sin(angle);%0A    %7D%0A%0A    @Override%0A    public Translation%5B%5D layout(BoundingBox parent, BoundingBox%5B%5D children) %7B%0A        Translation%5B%5D translations = new Translation%5B%5D %7B new Translation(0, 0), new Translation(0, 0) %7D;%0A        BoundingBox%5B%5D alignedChildren = HORIZONTAL_ALIGNER.align(children);%0A        for (int index = 0; index %3C children.length; index++)%7B%0A            translations%5Bindex%5D = translations%5Bindex%5D.translateBy(children%5Bindex%5D.to(alignedChildren%5Bindex%5D));%0A        %7D%0A%0A        BoundingBox merged = mergeAll(alignedChildren);%0A        int height = (int) (this.factor * merged.width/4);%0A%0A        Translation verticalTranslation = new Translation(0, height);%0A        for (int index = 0; index %3C translations.length; index++)%7B%0A            translations%5Bindex%5D = translations%5Bindex%5D.translateBy(verticalTranslation);%0A        %7D%0A%0A        return translations;%0A    %7D%0A%7D%0A

Create a constant angle layouter