STUDIO TAMA

Rhinoceros & Grasshopper Utilities

© 2025 STUDIO TAMA

Day 17

Sin波に沿ってレンガを配置し積み上げる

#pattern#wave#alignment#orientation
Sin波に沿ってレンガを配置し積み上げる

✅ Inputs

- brick_w: float – レンガの幅(X 方向)
- brick_h: float – レンガの高さ(Z 方向)
- brick_d: float – レンガの奥行き(Y 方向)
- gap_x: float – レンガ間の X 方向隙間(横の目地)
- gap_z: float – レンガ間の Z 方向隙間(縦の目地)
- num_z: int – Z 方向の段数
- amplitude: float – Sin 波の振幅(Y 方向の高さ)
- frequency: float – Sin 波の周波数(1/波長)
- length: float – Sin 波の X 方向長さ
- resolution: int – Sin 波を構成する点の数(滑らかさ)

✅ Outputs

- results: list of Box – 曲線方向に整列し、積み上げられたレンガの集合体

✅ Code

import Rhino.Geometry as rg
import math

# === 🔧 パラメータ例 ===
# brick_w = 200.0
# brick_h = 60.0
# brick_d = 100.0

# gap_x = 40.0     # 横方向の目地
# gap_z = 2.0     # 段ごとの縦目地
# num_z = 40        # 段数

# amplitude = 400.0
# frequency = 0.01
# length = 3000.0
# resolution = 3

# === 🌊 Sin波カーブを生成 ===
points = []
for i in range(resolution + 1):
    t = float(i) / resolution
    x = t * length
    y = math.sin(x * frequency) * amplitude
    pt = rg.Point3d(x, y, 0)
    points.append(pt)

curve = rg.Curve.CreateInterpolatedCurve(points, 3)

# === 🧱 曲線に沿って段ごとにレンガを配置 ===
spacing = brick_w + gap_x
params = curve.DivideByLength(spacing, True)

results = []

for z in range(num_z):
    z_shift = z * (brick_h + gap_z)
    is_odd = z % 2 == 1

    for p in params:
        pt = curve.PointAt(p)
        tangent = curve.TangentAt(p)
        tangent.Unitize()

        # 基本軸定義
        xaxis = tangent
        zaxis = rg.Vector3d(0, 0, 1)
        yaxis = rg.Vector3d.CrossProduct(zaxis, xaxis)
        yaxis.Unitize()

        plane = rg.Plane(pt, xaxis, yaxis)

        # 奇数段だけ X軸方向にオフセット(半レンガ分)
        if is_odd:
            shift_vec = rg.Vector3d(xaxis)
            shift_vec *= (brick_w + gap_x) / 2
            plane.Origin += shift_vec

        # Z方向に持ち上げる
        plane.Origin += rg.Vector3d(0, 0, z_shift)

        # レンガ生成
        box = rg.Box(
            plane,
            rg.Interval(-brick_w/2, brick_w/2),
            rg.Interval(-brick_d/2, brick_d/2),
            rg.Interval(0, brick_h)
        )

        results.append(box)

ライセンス・利用規約

項目可否説明
自身のプロジェクトへの組み込み個人・商用問わず、スクリプトや作品の一部として自由に使えます。
コードの改変・学習利用自身の学習や、目的に合わせたカスタマイズは大歓迎です。
SNSへのシェア・紹介作品の画像やURLのシェアは許可不要です。ぜひご紹介ください!
再配布・転載×コードやファイルを丸ごと自身のサイト等でコンテンツとして公開しないでください。
素材・プログラムとしての転売×本サイトの内容をそのまま、あるいは微調整のみで有料販売しないでください。
著作権表示・リンク任意必須ではありませんが、引用元としてリンクを貼っていただけると励みになります。