2024-06-27 22:20:51 -05:00
|
|
|
// Parameters
|
|
|
|
const r = 50 // base radius
|
|
|
|
const h = 10 // layer height
|
|
|
|
const t = 0.005 // taper factor [0-1)
|
|
|
|
// Defines how to modify each layer of the vase.
|
|
|
|
// Each replica is shifted up the Z axis, and has a smoothly-varying radius
|
|
|
|
fn transform = (replicaId) => {
|
|
|
|
let scale = r * abs(1 - (t * replicaId)) * (5 + cos(replicaId / 8))
|
|
|
|
return {
|
|
|
|
translate: [0, 0, replicaId * 10],
|
|
|
|
scale: [scale, scale, 0],
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Each layer is just a pretty thin cylinder with a fillet.
|
|
|
|
fn layer = () => {
|
|
|
|
return startSketchOn("XY") // or some other plane idk
|
2024-09-23 22:42:51 +10:00
|
|
|
|> circle({ center: [0, 0], radius: 1 }, %, $tag1)
|
2024-06-27 22:20:51 -05:00
|
|
|
|> extrude(h, %)
|
|
|
|
// |> fillet({
|
|
|
|
// radius: h / 2.01,
|
2024-07-27 22:56:46 -07:00
|
|
|
// tags: [tag1, getOppositeEdge(tag1)]
|
2024-06-27 22:20:51 -05:00
|
|
|
// }, %)
|
|
|
|
}
|
|
|
|
// The vase is 100 layers tall.
|
|
|
|
// The 100 layers are replica of each other, with a slight transformation applied to each.
|
|
|
|
let vase = layer() |> patternTransform(100, transform, %)
|