73.2 ms

Rhythmic Gymnastics Pavilion

5.1 μs

The project presented in this notebook is an adaptation of the Irina Viner-Usmanova Rhythmic Gymnastics Centre, originally designed by CPU Pride for Moscow, Russia. Its most prominent feature is the wavy roof-structure, inspired by the movement of a rhythmic gymnastic’s strip. The program elaborated here is a personal interpretation of the original design, developed in a 5 day collaborative sprint. This notebook uses the Julia programming language and the Khepri algorithmic design tool to model the building's geometry.

7.4 μs

5.1 μs

SET UP

4.2 μs
1.2 s
12.7 s

Khepri backends size:

2.3 μs
0.0 ns

Khepri render_dir command defines where the render images are saved in your PC. Use render_view to save renders to the chosen file path.

3.2 μs
464 ns

Sinusoidal Curves

2.8 μs
Sinunoisal wave parametersOther sinusoidal curves
5.1 μs

sinusoidal parameters explained:

  • a is the amplitude

  • omega is the frequency

  • fi is the phase

6.5 μs
sinusoidal (generic function with 1 method)
48.7 μs
sin_array_y (generic function with 1 method)
39.0 μs

Expected result:

2.8 μs

damped_sin_wave's parameters explained

  • a is the initial amplitude (the highest peak)

  • b is the decay constant

  • omega is the angular frequency

6.5 μs
damped_sin_wave (generic function with 1 method)
19.0 μs
damped_sin_array_z (generic function with 1 method)
42.2 μs
0.0 ns

Expected result:

2.8 μs
damped_sin_roof_pts (generic function with 1 method)
77.9 μs

d_i is the distance between the pavilion starting point and the beginning of the dumped sine curve.

3.2 μs
2.4 s
Khepri.SurfaceGrid(...)
3.7 s

Expected result:

2.8 μs

Pavilion Dimensions

2.3 μs
Roof dimentions explainedd_i explained
4.2 μs

Double sinuoid parameters:

  • amp_x = amplitude of the sinusoid along the x axis

  • ampymin_top = minimum amplitude of the damped sinusoid along the y axis for the top layer of the roof

  • ampymax_top = maximum amplitude of the damped sinusoid along the y axis for the top layer of the roof

  • ampymax_bottom = maximum amplitude of the damped sinusoid along the y axis for the bottom layer of the roof

  • ampymin_bottom = minimum amplitude of the damped sinusoid along the y axis for the bottom layer of the roof

  • fi = sinusoid's phase along the x axis

  • decay = damped sinusoid's decay along the y axis

  • om_x = frequency of the sinusoid in x

  • om_y = frequency of the damped sinusoid in y

General pavilion parameters:

  • pav_width = pavilion's width (along x axis)

  • pav_length = pavilion's lenght (along y axis)

  • pav_height = pavilion's height (z axis)

  • d_width = distance between roof layers in the x axis (top layer is wider)

  • d_length = distance between roof layers in the y axis (top layer is longer)

  • d_height = distance between roof layers in the z axis (height of the roof truss)

  • d_i = distance before the damped sinusoid starts shaping the roof

Construction elements parameters:

  • glasspanelheight = façade glass panel's height (width is defined by the number of points in the damped_sinusoid array)

  • npanelsy = number of row subdivisions for triangular roof panels and glass wall vertical lines in length

  • npanelsx = number of row subdivisions for triangular roof panels and glass wall vertical lines in width

  • nglassverts = number of vertical panels per glass line

  • pinwheelreclevel = number of times the pattern gets recursively subdivided

  • pavslabthickness = floor slab thickness

  • pavstructthickness = inner structural wall's thickness

  • n_floors = number of floors inside the pavilion

  • nwallin_width = number of transverse walls on each floor

  • nwallin_length = number of longitudinal walls on each floor

31.1 μs
6
0.0 ns

BIM families

3.2 μs

BIM families for truss elements:

2.3 μs
34.0 ms
3.5 ms

BIM families for roof panels:

2.8 μs
7.7 ms
4.6 μs

Frame BIM family:

2.8 μs
frame_width
0.1
0.0 ns
26.6 ms

BIM families for walls and slabs:

3.2 μs
15.5 ms
17.8 ms

Ground family:

3.7 μs
5.5 ms

BIM family materials for Unity backend:

7.9 μs
85.5 ms

Roof Truss

2.8 μs

Basic truss elements

3.2 μs

The following functions create truss elements:

  • free_node and fixed_node create truss nodes

  • bar creates truss bars

  • panel creates truss panels

12.5 μs

Truss elements:

4.2 μs
fixed_node (generic function with 1 method)
21.3 μs
free_node (generic function with 1 method)
21.3 μs
bar (generic function with 1 method)
14.4 μs

Spatial truss

7.9 μs

truss_ptss receives two sets of points, the bottom and top points defining the shape of the truss to create. It returns the points defining the truss structure.

8.3 μs
truss_ptss (generic function with 1 method)
55.7 μs

truss receives the type of truss to create, as well as both bottom and top points defining its shape. It creates a 3D spatial truss.

5.6 μs
truss (generic function with 1 method)
52.4 μs
Vierendeel modular block frontVierendeel modular block side
7.4 μs

vierendeel creates a vierendeel truss structure.

3.2 μs
vierendeel (generic function with 2 methods)
55.7 μs
0.0 ns
0.0 ns

Expected result:

2.8 μs
0.0 ns

Expected result:

2.3 μs

Roof Surface

2.8 μs

Auxiliar functions

2.3 μs

transpose_array receives an array of arrays and transposes it.

2.3 μs
transpose_array (generic function with 1 method)
55.7 μs

pts_distances receives an array of points and returns an array with the distances between ordered points.

3.7 μs
pts_distances (generic function with 2 methods)
51.0 μs
shape_grid_polygon_vertices (generic function with 1 method)
31.1 μs

itera_2triangs receives an array of arrays of points. It returns the same points rearranged to create a triangular grid of points.

7.4 μs
itera_2triangs (generic function with 1 method)
49.6 μs

Roof option 1: simple surfaces

5.1 μs
0.0 ns

Expected result:

6.0 μs

Roof option 2: triangular roof panels

20.4 μs

CAD version: using surface_polygon subdivision

18.1 μs
0.0 ns

Expected result:

9.3 μs

BIM version: using panel subdivision

7.0 μs
0.0 ns
463 ns

Expected result:

7.0 μs

Roof lateral edges option 1: simple triangular panels

8.3 μs
0.0 ns

Expected result:

5.1 μs

Roof lateral edges option 2: Pinwheel tiling panels

4.2 μs

pattern creates different patterns on parametric surfaces

3.7 μs
pattern (generic function with 1 method)
77.0 μs

pinwheel_rule defines the basic subdivision rule of the pinwheel tiling.

3.7 μs

Pinwheel rule Tiling

4.2 μs
pinwheel_rule (generic function with 2 methods)
42.7 μs

pinwheel_recursive_rule repeats the basic subdivision rule pinwheel_rule several times (value set by the parameter level).

3.7 μs
pinwheel_recursive_rule (generic function with 3 methods)
40.8 μs

pinwheel_tiling receives a surface (described by its points) and creates the pinwheel tiling on it.

3.2 μs
pinwheel_tiling (generic function with 1 method)
71.9 μs
0.0 ns

Expected result:

7.9 μs
0.0 ns
0.0 ns

Expected result:

12.1 μs

Complete Roof structure

5.1 μs

Abstracting pinwheel_tiling function for the roof sides:

4.6 μs
pinwhell_broad (generic function with 1 method)
26.0 μs

Roof point matrices. t_diff defines the distance between the roof surface and the truss structure within. It's currently set to 20 cm:

4.2 μs
top_roof_ptss (generic function with 1 method)
28.8 μs
bottom_roof_pts (generic function with 1 method)
36.2 μs

Complete roof surface with top, bottom, and side panels:

3.2 μs
roof_surf (generic function with 1 method)
51.5 μs
0.0 ns
0.0 ns

Expected result:

5.1 μs

Truss structure function using the new point matrices for the pavilion:

3.7 μs
roof_truss (generic function with 1 method)
23.2 μs
0.0 ns
0.0 ns

Expected result:

4.2 μs

Glass Façade

2.8 μs

splines4surf maps splines over a matrix of points, to visualise surfaces in the notebook backend faster.

3.7 μs
splines4surf (generic function with 1 method)
22.7 μs

Wall points

3.7 μs

damped_sin_glass_wall creates the pavilion's side glass wall matrices

3.7 μs
damped_sin_glass_wall (generic function with 1 method)
54.3 μs
463 ns

Expected result:

8.3 μs
0.0 ns

Expected result:

6.0 μs

Vertical BIM panels

3.7 μs

Given a list of points (closed polygon vertices), this function creates a polygonal glass panel surrounded by a thin metal framing all around:

3.2 μs
framed_panel (generic function with 1 method)
41.7 μs
0.0 ns
0.0 ns

Expected result:

8.8 μs

Creates a vertical line of framed_panels given a list of points in z. Vector v considers the panel width:

5.1 μs
vertical_panel_line (generic function with 1 method)
51.0 μs
0.0 ns

Expected result:

8.3 μs

Makes a vertical_panel_line for all lines in the matrix:

10.2 μs
vertical_panel_lines (generic function with 1 method)
34.3 μs

Predicate functions: is current z above the limit?

15.3 μs
is_above_z_limit (generic function with 1 method)
14.4 μs

vert_pts creates the orgin points for all vertical panels above p. Stops creating points in z when the set limit is reached:

7.9 μs
vert_pts (generic function with 1 method)
25.0 μs

Different starting point for vertical panels in the odd case:

5.1 μs
vert_pts_odd (generic function with 1 method)
20.9 μs

Interweaving 2 different functions depending on count being even or odd:

3.2 μs
f_weave (generic function with 1 method)
25.0 μs

damped_sin_glass_pts creates a vertical line of panels for all points between p and p+vy(dist_y). The z_limit for all vertical lines of panels is defined by thez value of the damped_sin_wave at any moment in the y progression. Interweaving of functions. Different starting height for the first panel of odd rows.

3.2 μs
damped_sin_glass_pts (generic function with 1 method)
65.4 μs

glass_panel_height defines façade glass panel's height (width is defined by the number of points in the damped_sinusoid array)

3.2 μs
0.0 ns

Expected result:

3.2 μs

vertical_panel_line corrections to match roof wave:

2.8 μs
vertical_panel_line_centred (generic function with 1 method)
59.4 μs
centred_vertical_panel_lines (generic function with 1 method)
35.7 μs
0.0 ns

Expected result:

3.2 μs
0.0 ns
0.0 ns

Expected result:

3.2 μs

Front glass wall

2.8 μs
damped_sin_front_wall (generic function with 1 method)
73.3 μs

This function joins all glass walls in the pavilion (sides and front):

2.8 μs
pav_walls (generic function with 1 method)
43.6 μs
0.0 ns

Expected result:

3.7 μs

Interior Plan

2.8 μs

pav_slabs creates the main slabs

3.2 μs
pav_slabs (generic function with 1 method)
29.7 μs
0.0 ns

Expected result:

5.1 μs

Update pav_slabs to include interior walls:

7.9 μs
pav_slabs_walls (generic function with 1 method)
89.5 μs

floors joins structural walls to the previous function:

9.7 μs
floors (generic function with 1 method)
50.1 μs
0.0 ns

Expected result:

8.8 μs
0.0 ns

Expected result:

5.6 μs

Site

7.0 μs

Ground:

7.0 μs
ground (generic function with 1 method)
26.9 μs

Trees:

7.0 μs
464 ns
0.0 ns

Expected result:

7.4 μs

Cylindrical tree:

6.0 μs
cyl_attractor (generic function with 2 methods)
32.5 μs

Tree parameters:

7.4 μs
0.5
0.0 ns
0.0 ns

Expected result:

6.0 μs

Expected result:

7.4 μs

Complete Building

7.9 μs

The GymPav function gathers all building elements modeled, plus the random tree line in front of the west façade. Given a point p, the function creates the full building structure in accordance with the parameters provided in Pavilion Dimensions.

12.1 μs
GymPav (generic function with 1 method)
40.3 μs
0.0 ns

Saved render views:

5.6 μs
0.0 ns

Unity renders

Pav 1Pav 2
Pav 3Pav 4
Pav 7Pav 6
Pav 5
17.6 μs

The end

9.3 μs