Kada kupola izgubi ravnotežu: Istraživanje asimetrične zome forme

Zome kupola sa pomerenim centrom je geometrijska struktura zasnovana na pravilnim spiralnim linijama (zome linijama), pri čemu osnova kupole ostaje fiksirana u centru koordinatnog sistema — tačno u tački (0, 0) u ravni osnove. Za razliku od standardne zome kupole, kod koje se svi spiralni elementi konvergiraju ka centralnoj tački koja se nalazi tačno iznad osnove (simetrična vertikala), u ovoj varijanti vrh kupole se pomera horizontalno za zadatu vrednost center_offset.

Ovaj pomak vrha znači da se geometrijski centar kupole ne nalazi više direktno iznad baze, već se struktura „naginje“ ka zadatom pravcu. Spirale i strukturalni elementi koji čine mrežu kupole sada opisuju zakrivljene linije koje se prilagođavaju novom vrhu, što stvara dinamičniji i vizuelno izražajniji oblik.

Ovakva kupola više nije radijalno simetrična oko svoje vertikalne ose, već ima blago deformisan oblik u pravcu pomeranja centra, što može imati funkcionalne ili estetske prednosti — na primer u arhitektonskim rešenjima koja zahtevaju usmeravanje svetla, otvaranje pogleda ili specifičan nagib prema određenoj tački u prostoru.


Ova zome kupola ima bazu fiksiranu u koordinatnom početku (0,0), dok se vrh kupole pomera horizontalno za vektor $$\vec{c} = (c_x, c_y)$$. Zbog tog pomeranja, osna simetrija se narušava, a dužine rebara i njihovi pravci se računaju u odnosu na novu poziciju vrha.

Standardna dužina rebra u savršeno simetričnoj kupoli, kada se koristi helikoidalna konstrukcija sa n spirala i ukupnom visinom h, računa se kao:

$$ \ell_{\text{rib}} = \sqrt{ \left( \frac{d \pi}{4} \right)^2 + h^2 } $$

Kada se uvede pomeranje centra vrha kupole za vektor:

$$ \vec{c} = (c_x, c_y) $$

ono utiče na horizontalni položaj svake tačke spirale u visinskoj ravni z tako da nova pozicija postaje:

$$ \vec{r}_{\text{spiral}}(z) = \vec{r}_0(z) + \left( \frac{z}{h} \right) \vec{c} $$

Objašnjenje formula:

  • $$ \ell_{\text{rib}} = \text{dužina rebra između dva segmenta spirale} $$
  • $$ d = \text{prečnik kupole u osnovi} $$
  • $$ h = \text{visina kupole} $$
  • $$ \vec{c} = (c_x, c_y) = \text{horizontalni pomak vrha kupole u odnosu na bazu} $$
  • $$ \vec{r}_0(z) = \text{pozicija tačke spirale bez deformacije u visini } z $$
  • $$ \vec{r}_{\text{spiral}}(z) = \text{pozicija tačke spirale sa deformacijom} $$

Ovaj model omogućava zome kupole sa nagnutim vrhom, što daje izraženiji vizuelni efekat i funkcionalnu asimetriju u konstrukciji.


Program

Opis ponašanja programa, korak po korak:

1. Parametri konstrukcije kupole

  • n: broj spirala (npr. 24)
  • segs: broj segmenata u svakoj spirali (npr. 24)
  • d: prečnik osnove kupole
  • h: visina vrha kupole
  • thickness: debljina „žica“ (cilindara)
  • center_offset: vektor pomeraja vrha kupole (npr. [1.0, 0.0] znači pomeraj 1 jedinicu udesno)

2. Funkcija generate_spiral(...)

  • Generiše tačke spirale koje se dižu od osnove do vrha kupole.
  • Svaka tačka se računa u odnosu na pomereni centar kupole: pythonCopyEditx = sin(...) * d/4 + sin(beta)*d/4 + center_offset[0] * (j / segs) y = cos(...) * d/4 + cos(beta)*d/4 + center_offset[1] * (j / segs) ➤ Vidiš da center_offset deluje postepeno duž visine kupole:
    • Na dnu je 0,
    • Na vrhu ima pun efekat (j/segs = 1),
    • Čime se model pomera u „kosinu“.

3. Funkcija cylinder_between_points(p1, p2, ...)

  • Između svaka dva uzastopna vrha spirale generiše se cilindar koji vizuelno čini deo žičane konstrukcije.

4. Glavna funkcija generate_mesh(...)

  • Poziva spiralne generatore (desne i leve spirale),
  • Kombinuje ih u jedan 3D mesh,
  • Spaja sve cilindre u jednu mrežu sa tačkama (verts) i trouglastim površinama (faces).

5. Izvoz rezultata

  • Na kraju, rezultat se izvozi u .ply i .stl format: pythonCopyEditmesh.export("helix_zome_ogledalo.ply") mesh.export("helix_zome_ogledalo.stl")

Efekat pomerenog centra (center_offset):

  • Ako je center_offset = [0, 0]savršena zome kupola.
  • Ako je center_offset = [1, 0] ⇒ vrh kupole je pomeren udesno, spirale više nisu simetrične.
  • Možeš koristiti i [-1, 0], [0, 1], [0.5, 0.5] itd. za drugačije deformacije.

Vizuelizacija

  • Dobijeni .stl i .ply fajlovi mogu se otvoriti u programima kao što su:
    • MeshLab
    • Blender
    • FreeCAD
    • Fusion 360
    • ili web pregledači za 3D modele

Programski kod

Naziv fajla: asimetricna_zome_kupola.py

import numpy as np
import trimesh
from math import sin, cos, pi

def rotation_matrix(v1, v2):
    a = v1 / np.linalg.norm(v1)
    b = v2 / np.linalg.norm(v2)
    v = np.cross(a, b)
    dot = np.dot(a, b)
    if np.allclose(dot, 1):
        return np.eye(3)
    if np.allclose(dot, -1):
        return -np.eye(3)
    s = np.linalg.norm(v)
    km = np.array([[   0, -v[2],  v[1]],
                   [ v[2],    0, -v[0]],
                   [-v[1],  v[0],    0]])
    return np.eye(3) + km + (km @ km) * ((1 - dot) / (s*s))

def cylinder_between_points(p1, p2, radius=0.01, sections=12):
    vec = p2 - p1
    length = np.linalg.norm(vec)
    if length < 1e-6:
        return np.array([]), np.array([])
    dir = vec / length
    angles = np.linspace(0, 2*pi, sections, endpoint=False)
    circle = np.stack([np.cos(angles)*radius, np.sin(angles)*radius, np.zeros_like(angles)], axis=1)
    base = circle
    top = circle + np.array([0, 0, length])
    verts = np.vstack([base, top])
    R = rotation_matrix(np.array([0,0,1]), dir)
    verts = verts @ R.T + p1
    faces = []
    n = sections
    for i in range(n):
        j = (i+1) % n
        faces += [[i, j, j+n], [i, j+n, i+n]]
    return verts, np.array(faces)

def generate_spiral(n, segs, d, h, direction, center_offset=np.array([0.0, 0.0])):
    spirals = []
    for i in range(n):
        beta = 2 * pi * i / n
        spiral = []
        for j in range(segs + 1):
            alpha = pi * j / segs
            theta = alpha if direction == 1 else -alpha

            # Linearni pomak centra zavisno od visine alpha (od 0 na dnu do 1 na vrhu)
            offset_x = center_offset[0] * (alpha / pi)
            offset_y = center_offset[1] * (alpha / pi)

            x = sin(theta + beta) * d/4 + sin(beta)*d/4 + offset_x
            y = cos(theta + beta) * d/4 + cos(beta)*d/4 + offset_y
            z = (alpha/pi) * h
            spiral.append([x, y, z])
        spirals.append(np.array(spiral))
    return spirals

def generate_mesh(n, segs, d, h, thickness, center_offset):
    verts_list, faces_list = [], []
    offset = 0

    spirals_right = generate_spiral(n, segs, d, h, direction=1, center_offset=center_offset)
    for spiral in spirals_right:
        for j in range(segs):
            p1, p2 = spiral[j], spiral[j+1]
            v, f = cylinder_between_points(p1, p2, thickness)
            if len(v):
                verts_list.append(v)
                faces_list.append(f + offset)
                offset += len(v)

    spirals_left = generate_spiral(n, segs, d, h, direction=-1, center_offset=center_offset)
    for spiral in spirals_left:
        for j in range(segs):
            p1, p2 = spiral[j], spiral[j+1]
            v, f = cylinder_between_points(p1, p2, thickness)
            if len(v):
                verts_list.append(v)
                faces_list.append(f + offset)
                offset += len(v)

    return np.vstack(verts_list), np.vstack(faces_list)

if __name__ == "__main__":
    n = 24         # broj spirala po smeru
    segs = 24      # broj segmenata po spirali
    d = 8.0        # prečnik kupole
    h = 3       # visina kupole
    thickness = 0.01

    # Pomak centra kupole u X i Y na vrhu kupole; osnova je na (0,0)
    center_offset = np.array([3, 0.0])  # pomeraj desno za 0.5 jedinica

    verts, faces = generate_mesh(n, segs, d, h, thickness, center_offset)
    mesh = trimesh.Trimesh(vertices=verts, faces=faces, process=False)
    mesh.export("helix_zome_offset_center.ply")
    mesh.export("helix_zome_offset_center.stl")
    print("✅ Izvezeni: helix_zome_offset_center.ply, helix_zome_offset_center.stl")

Reference

Naučni radovi & članci

  1. „Analysis on asymmetric aberration of special domes“
  2. MDPI: „In‑Depth Verification of a Numerical Model for an Axisymmetric RC Dome“ (2021)
  3. „The Influence of Dome Geometry on the Results of Modal and Buckling Analysis“ (2023, Appl. Sci.)
    • Detaljno proučava kako razne geometrije kupole (uključujući asimetrične) utiču na modalne analize i propuste u konstrukciji – stoga predstavlja dobar tehnički temelj https://www.mdpi.com/2076-3417/13/4/2729
  4. „Analysis of Lightweight Structure Mesh Topology of Geodesic Domes“ (2024, Appl. Sci.)

📚 Knjige i reference o zome kupolama

By Abel

Leave a Reply

Your email address will not be published. Required fields are marked *