private void buildRotaryShape(MeshFactory meshFactory, Circle circle, int numberOfCrossSplits, int pIsection, boolean soft) { int crossCount = numberOfCrossSplits + 1; // create cross section Point2d[] crossSection = new Point2d[crossCount]; for (int i = 0; i < crossCount; i++) { double a = Math.toRadians(90) / (crossCount - 1) * i; crossSection[i] = new Point2d(Math.cos(a) * circle.getRadius(), Math.sin(a) * circle.getRadius()); } buildRotaryShape(meshFactory, circle.getPoint(), pIsection, crossSection, soft); }
protected RoofTypeOutput build(List<Point2d> borderList, Double height, Double angle, RoofMaterials roofTextureData) { MeshFactory meshDome = createRoofMesh(roofTextureData); MeshFactory meshRoof = createRoofMesh(roofTextureData); TextureData roofTexture = roofTextureData.getRoof().getTextureData(); PolygonList2d borderPolygon = new PolygonList2d(borderList); buildFlatRoof(borderPolygon, meshRoof, roofTexture); // build circle Circle circle = CircleInsidePolygon.iterativeNonConvex(borderPolygon, 0.01); circle.setRadius(Math.min(height, circle.getRadius())); int pIcross = 5; int pIsection = 9; buildRotaryShape(meshDome, circle, pIcross, pIsection, true); RoofTypeOutput rto = new RoofTypeOutput(); rto.setHeight(circle.getRadius()); rto.setMesh(Arrays.asList(meshDome, meshRoof)); rto.setRoofHooksSpaces(null); rto.setRectangle(RoofTypeUtil.findRectangle(borderList, 0)); return rto; }
protected Bend[] getBends(Map<MeasurementKey, Measurement> measurements, Circle circle) { int numOfBend = getNumOfBend(measurements); Bend[] bends = new Bend[numOfBend + 1]; double ratius = circle.getRadius(); Double h1 = getHeightDegreesMeters(measurements, MeasurementKey.HEIGHT_1, 0, ratius, 60); Double l1 = getLenghtMetersPersent(measurements, MeasurementKey.LENGTH_1, ratius, ratius); bends[0] = new Bend(0, l1); bends[bends.length - 1] = new Bend(h1, 0); if (numOfBend > 1) { Double h2 = getHeightMeters(measurements, MeasurementKey.HEIGHT_2, h1 * 1 / numOfBend); Double l2 = getLenghtMetersPersent(measurements, MeasurementKey.LENGTH_2, ratius, ratius * (numOfBend - 1) / numOfBend); bends[1] = new Bend(h2, l2); } if (numOfBend > 2) { Double h3 = getHeightMeters(measurements, MeasurementKey.HEIGHT_3, h1 * 2 / numOfBend); Double l3 = getLenghtMetersPersent(measurements, MeasurementKey.LENGTH_3, ratius, ratius * (numOfBend - 2) / numOfBend); bends[2] = new Bend(h3, l3); } if (numOfBend > 3) { Double h4 = getHeightMeters(measurements, MeasurementKey.HEIGHT_4, h1 * 3 / numOfBend); Double l4 = getLenghtMetersPersent(measurements, MeasurementKey.LENGTH_4, ratius, ratius * (numOfBend - 3) / numOfBend); bends[3] = new Bend(h4, l4); } return bends; }
@Override protected Bend[] getBends(Map<MeasurementKey, Measurement> measurements, Circle circle) { double ratius = circle.getRadius(); Double h1 = getHeightMeters(measurements, MeasurementKey.HEIGHT_1, ratius * 2.25); Double l1 = getLenghtMetersPersent(measurements, MeasurementKey.LENGTH_1, ratius, ratius); return scaleBends(this.bendsShape, h1, l1); }