Day 17
(3.5)

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)