Skip to content

Instantly share code, notes, and snippets.

@peterwake
Last active April 16, 2020 17:06
Show Gist options
  • Save peterwake/3c336d829d91ecd3e6dd51fafaa0aee5 to your computer and use it in GitHub Desktop.
Save peterwake/3c336d829d91ecd3e6dd51fafaa0aee5 to your computer and use it in GitHub Desktop.
// openjscad.org
// Tower Bridge
let fancy_bricks = true;
function random_colour() {
// based on 'BurlyWood';
return [
(222 + Math.random() * 10) / 255,
(184 + Math.random() * 10) / 255,
(135 + Math.random() * 10) / 255
];
}
function styled_cube(orientation) {
let hash = {};
if (orientation === 0) {
hash.size = [30, 6, 2];
hash.center = [15, 3, 1];
} else {
hash.size = [30, 2, 6];
hash.center = [15, 1, 3];
}
if (fancy_bricks) {
hash.radius = 0.25;
hash.roundradius = 0.2
}
return cube(hash);
}
function plank(x, y, z, r) {
return color(random_colour(), styled_cube(0)
.rotateZ(r)
.translate([x, y, 1 + z * 2])
);
}
function plank2(x, y, z, r) {
return color(random_colour(), styled_cube(1)
.rotateZ(r)
.translate([x, y, 1 + z * 2])
);
}
function plank3(x, y, z, r) {
return color(random_colour(), styled_cube(0)
.rotateY(r)
.translate([x, y, 1 + z * 2])
);
}
function main() {
var x, y, z;
/* Base */
var baseArr = [];
for (z = 0; z < 12; z += 2) {
baseArr.push(plank(-12, 0, z, 90));
baseArr.push(plank(12, 0, z, 90));
baseArr.push(plank(0, -12, z + 1, 0));
baseArr.push(plank(0, 12, z + 1, 0));
}
let base = union(baseArr);
/* Bridge */
let bridgeArr = [];
let bArr = [
[-1, 1],
[0, 2],
[-1, 1, 3],
[0, 2],
[-1, 1, 3]
];
bArr.forEach(function(arr, h) {
arr.forEach(function(x1, _ix) {
bridgeArr.push(plank(15 * x1, -12, h + 12, 0));
bridgeArr.push(plank(15 * x1, 12, h + 12, 0));
});
});
let bridge = union(bridgeArr);
/* Footway */
let footwayArr = [];
for (x = -28; x < 60; x += 7) {
footwayArr.push(plank(x, 0, 17, 90));
}
let footway = union(footwayArr);
/* Tower */
let towerArr = [];
towerArr.push(plank2(0, 14, 19, 0));
towerArr.push(plank2(0, -14, 19, 0));
towerArr.push(plank2(0, -14, 22, 0));
towerArr.push(plank2(0, 14, 22, 0));
for (z = 25; z < 48; z += 6) {
towerArr.push(plank2(-14, 0, z, 90));
towerArr.push(plank2(14, 0, z, 90));
towerArr.push(plank2(0, 14, z + 3, 0));
towerArr.push(plank2(0, -14, z + 3, 0))
}
let tower = union(towerArr);
/* Top Bridge */
let topBridgeArr = [];
let bArr2 = [
[1],
[2],
[1, 3],
[2],
[1, 3]
];
bArr2.forEach(function(arr, h) {
arr.forEach(function(x1, _ix) {
topBridgeArr.push(plank2(15 * x1, -12, h * 3 + 34, 0));
topBridgeArr.push(plank2(15 * x1, 12, h * 3 + 34, 0));
});
});
let topBridge = union(topBridgeArr);
/* Footway 2 */
let footway2Arr = [];
for (x = -12; x < 65; x += 7) {
footway2Arr.push(plank(x, 0, 48, 90));
}
let footway2 = union(footway2Arr);
/* Tower 2 */
let tower2Arr = [];
for (z = 50; z < 58; z += 6) {
tower2Arr.push(plank2(0, 14, z, 0));
tower2Arr.push(plank2(0, -14, z, 0));
tower2Arr.push(plank2(-14, 0, z + 3, 90));
tower2Arr.push(plank2(14, 0, z + 3, 90));
}
let tower2 = union(tower2Arr);
/* Roof */
let roofArr = [];
roofArr.push(plank2(-1, 0, 59, 90));
roofArr.push(plank2(1, 0, 59, 90));
for (x = -15; x <= 15; x += 30) {
for (y = -12; y <= 12; y += 6) {
roofArr.push(plank(x, y, 61, 0));
}
}
for (z = 62; z < 72; z++) {
roofArr.push(plank(0, 0, z, 90));
}
roofArr.push(plank(-29, 0, 62, 90));
roofArr.push(plank(29, 0, 62, 90));
roofArr.push(plank2(-25, 0, 63, 90));
roofArr.push(plank2(25, 0, 63, 90));
for (y = -12; y <= 12; y += 6) {
roofArr.push(plank3(12.5, y, 67.3, 46.5));
roofArr.push(plank3(-12.5, y, 67.3, -46.5));
}
roofArr.push(plank2(0, 0, 73, 90));
let roof = union(roofArr);
/* Make two structures, rotate one of them, slide them to the right place */
let side1 = union([base, bridge, footway, tower, topBridge, footway2, tower2, roof]);
let side2 = side1.rotateZ(180);
side1 = side1.translate([-60, 0, 0]);
side2 = side2.translate([60, 0, 0]);
/* Connectors */
let connectorArr = [];
connectorArr.push(plank2(0, -12, 43, 0));
connectorArr.push(plank2(0, 12, 43, 0));
connectorArr.push(plank(0, -12, 15, 0));
connectorArr.push(plank(0, 12, 15, 0));
let connectors = union(connectorArr);
return [side1, side2, connectors];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment