mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-10 00:36:40 +02:00
add random_town_square
This commit is contained in:
195
examples/tiles/random_town_square.scad
Normal file
195
examples/tiles/random_town_square.scad
Normal file
@@ -0,0 +1,195 @@
|
||||
use <pie.scad>;
|
||||
use <util/parse_number.scad>;
|
||||
use <util/has.scad>;
|
||||
use <util/rand.scad>;
|
||||
use <util/choose.scad>;
|
||||
use <experimental/tiles_wfc.scad>;
|
||||
use <rounded_square.scad>;
|
||||
use <box_extrude.scad>;
|
||||
|
||||
rows = 6;
|
||||
columns = 6;
|
||||
tileW = 10;
|
||||
layerH = 1;
|
||||
|
||||
random_town_square(rows, columns, tileW, layerH);
|
||||
|
||||
module random_town_square(rows, columns, tileW, layerH) {
|
||||
sample = [
|
||||
["F4", "CCRS1", "SS22", "CCRS0", "SS32", "F2", "SS14", "FW3", "SS04", "SS04"],
|
||||
["F4", "SS32", "F2", "SS12", "SS32", "F2", "SS14", "FW3", "SS24", "SS24"],
|
||||
["F4", "CCRS2", "SS02", "CCRS3", "SS32", "F2", "VCRS14", "VCRS04", "SS04", "SS04"],
|
||||
["F4", "F4", "CCRS1", "CCRS0", "CCRS2", "VCRS02", "VCRS24", "VCRS34", "FW2", "FW2"],
|
||||
["F4", "F4", "CCRS2", "CCRS3", "F4", "SS32", "FW1", "SS34", "FW0", "FW0"],
|
||||
["SS22", "SS22", "SS22", "SS22", "SS22", "VCRS32", "FW1", "SS34", "SS24", "SS24"],
|
||||
["SS14", "SS34", "VCRS14", "SS04", "SS04", "VCRS04", "VCRS12", "VCRS02", "F2", "F2"],
|
||||
["SS14", "SS34", "VCRS24", "SS24", "SS24", "VCRS34", "VCRS22", "VCRS32", "F2", "F2"],
|
||||
["SS14", "SS34", "VCRS14", "SS04", "SS04", "VCRS04", "VCRS12", "VCRS02", "F2", "F2"],
|
||||
["SS14", "SS34", "SS14", "F6", "F6", "SS34", "SS12", "SS32", "VCRS14", "VCRS04"],
|
||||
["F2", "F2", "VCRS24", "SS24", "SS24", "VCRS34", "VCRS22", "VCRS32", "VCRS24", "VCRS34"]
|
||||
];
|
||||
|
||||
|
||||
generated = tiles_wfc(rows, columns, sample);
|
||||
|
||||
color("Gainsboro")
|
||||
draw_tiles(generated);
|
||||
|
||||
/*
|
||||
tiles = [
|
||||
["F2", "F4"],
|
||||
["CCRS0", "CCRS1", "CCRS2", "CCRS3"],
|
||||
["VCRS02", "VCRS12", "VCRS22", "VCRS32", "VCRS04", "VCRS14", "VCRS24", "VCRS34"],
|
||||
["SS02", "SS12", "SS22", "SS32", "SS04", "SS14", "SS24", "SS34"],
|
||||
["FW0", "FW1", "FW2", "FW3"]
|
||||
];*/
|
||||
|
||||
module draw_tiles(tiles) {
|
||||
rows = len(tiles);
|
||||
columns = len(tiles[0]);
|
||||
for(y = [0:rows - 1]) {
|
||||
for(x = [0:len(tiles[y]) - 1]) {
|
||||
translate([x, rows - y - 1] * tileW) {
|
||||
draw_tile(tiles[y][x], tileW, layerH);
|
||||
*color("white")
|
||||
linear_extrude(3)
|
||||
text(tiles[y][x], size = 1.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module draw_tile(tile, tileW, layerH) {
|
||||
if(has(["F2", "F4", "F6"], tile)) {
|
||||
layers = parse_number(tile[len(tile) - 1]);
|
||||
floor(tileW, layers * layerH);
|
||||
}
|
||||
else if(has(["CCRS0", "CCRS1", "CCRS2", "CCRS3"], tile)) {
|
||||
type = parse_number(tile[len(tile) - 1]);
|
||||
ccr_stairs(tileW, layerH, type);
|
||||
}
|
||||
else if(has(["VCRS02", "VCRS12", "VCRS22", "VCRS32", "VCRS04", "VCRS14", "VCRS24", "VCRS34"], tile)) {
|
||||
type = parse_number(tile[len(tile) - 2]);
|
||||
stairs = parse_number(tile[len(tile) - 1]);
|
||||
vcr_stairs(tileW, layerH, type, stairs);
|
||||
}
|
||||
else if(has(["SS02", "SS12", "SS22", "SS32", "SS04", "SS14", "SS24", "SS34"], tile)) {
|
||||
type = parse_number(tile[len(tile) - 2]);
|
||||
stairs = parse_number(tile[len(tile) - 1]);
|
||||
side_stairs(tileW, layerH, type, stairs);
|
||||
}
|
||||
else if(has(["FW0", "FW1", "FW2", "FW3"], tile)) {
|
||||
type = parse_number(tile[len(tile) - 1]);
|
||||
floor_wall(tileW, layerH, type);
|
||||
}
|
||||
}
|
||||
|
||||
module base(tileW, height) {
|
||||
linear_extrude(height)
|
||||
square(tileW);
|
||||
}
|
||||
|
||||
// F
|
||||
module floor(tileW, height) {
|
||||
base(tileW, height);
|
||||
|
||||
halfW = tileW / 2;
|
||||
h = height * 2 + height * rand() * 10;
|
||||
|
||||
if(choose([true, false, false])) {
|
||||
translate([halfW, halfW, 0])
|
||||
rotate(choose([0, 90]))
|
||||
difference() {
|
||||
translate([0, 0, h])
|
||||
mirror([0, 0, 1])
|
||||
if(choose([true, false])) {
|
||||
box_extrude(h, shell_thickness = tileW / 10)
|
||||
rounded_square(tileW * 0.8, 1, center = true);
|
||||
}
|
||||
else {
|
||||
linear_extrude(h)
|
||||
circle(tileW * 0.5, $fn = choose([4, 8, 12, 48]));
|
||||
}
|
||||
|
||||
linear_extrude(h * 0.8)
|
||||
square([tileW * 0.2 + rand() * 0.2, tileW], center = true);
|
||||
|
||||
rotate(90)
|
||||
linear_extrude(h * 0.8)
|
||||
square([tileW * 0.2 + rand() * 0.2, tileW], center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// CCRS
|
||||
module ccr_stairs(tileW, layerH, type) {
|
||||
$fn = choose([4, 8, 12, 48]);
|
||||
base(tileW, layerH * 2);
|
||||
|
||||
halfW = tileW / 2;
|
||||
|
||||
tx = [[0, 0], [tileW, 0], [tileW, tileW], [0, tileW]];
|
||||
translate(tx[type])
|
||||
rotate(type * 90)
|
||||
for(i = [1:2]) {
|
||||
linear_extrude(layerH * (2 + i))
|
||||
difference() {
|
||||
square(tileW);
|
||||
pie(radius = halfW + layerH * (i - 1), angle = [0, 90]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// VCRS
|
||||
module vcr_stairs(tileW, layerH, type, stairs) {
|
||||
$fn = choose([4, 8, 12, 48]);
|
||||
base(tileW, layerH * 2);
|
||||
|
||||
halfW = tileW / 2;
|
||||
|
||||
tx = [[0, 0], [tileW, 0], [tileW, tileW], [0, tileW]];
|
||||
translate(tx[type])
|
||||
rotate(type * 90)
|
||||
for(i = [1:stairs]) {
|
||||
linear_extrude(layerH * (2 + i))
|
||||
pie(radius = halfW - layerH * (i - 1), angle = [0, 90]);
|
||||
}
|
||||
}
|
||||
|
||||
// SS
|
||||
module side_stairs(tileW, layerH, type, stairs) {
|
||||
base(tileW, layerH * 2);
|
||||
halfW = tileW / 2;
|
||||
|
||||
tx = [[0, 0], [tileW, 0], [tileW, tileW], [0, tileW]];
|
||||
translate(tx[type])
|
||||
rotate(type * 90)
|
||||
for(i = [1:stairs]) {
|
||||
linear_extrude(layerH * (2 + i))
|
||||
square([tileW, halfW - (i - 1) * layerH]);
|
||||
}
|
||||
}
|
||||
|
||||
// FW
|
||||
module floor_wall(tileW, layerH, type) {
|
||||
base(tileW, layerH * 2);
|
||||
|
||||
halfW = tileW / 2;
|
||||
|
||||
tx = [[0, 0], [tileW, 0], [tileW, tileW], [0, tileW]];
|
||||
translate(tx[type])
|
||||
rotate(type * 90) {
|
||||
linear_extrude(layerH * 6)
|
||||
square([tileW, halfW]);
|
||||
|
||||
for(i = [0:9]) {
|
||||
translate([0, tileW * 0.45])
|
||||
linear_extrude(layerH * 9)
|
||||
square([tileW, layerH]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user