designcoding
Search
About Table of Contents Keywords Support designcoding!

Fourier Series

November 14, 2022 | 6,228 views
Curves | Grasshopper | Rhino Python
fourier | signal

This is my first experiment with the Fourier Series in Grasshopper using Python. This is a technique to decompose functions into their frequency components. Fourier series have a wide range of applications in physics and engineering. What makes it especially fascinating, however, is the visual intuition it offers. It looks like a kind of mathematical “magic” that emerges from the geometry of frequency. I explored several excellent visual explanations online, including those by Coding Train, 3Blue1Brown, and Mathologer, each offering a unique perspective.

fourier series

This Grasshopper definition includes a Python component that animates a set of rotating circles and the resulting wave. It serves as an introduction to more complex explorations. The N input controls the number of circles (harmonics), allowing you to observe how increasing complexity affects the wave. The t input advances the rotation, enabling animation. This is an early-stage experiment. I aimed at understanding the fundamentals of the technique. The more intriguing direction would be to reverse the process: given a waveform, the circle parameters that reconstruct it would be determined. This can be the core purpose of the Discrete Fourier Transform. I studied that topic here.

fourier transform
import rhinoscriptsyntax as rs
import math
a, b, c, wave_pts = [], [], [], []
dt, t = math.pi / 200, -2 * t * math.pi
x, y = P[0], P[1]
for i in range(N):
    n = i * 2 + 1
    r = 4 / (n * math.pi)
    prev = [x, y, 0]
    x += r * math.cos(n * t)
    y += r * math.sin(n * t)
    a += [rs.AddCircle(prev, r), rs.AddCircle([x, y, 0], 0.02)]
    b.append(rs.AddLine([x, y, 0], prev))
tw = 2 * math.pi
while tw > 0:
    wy = P[1] + sum(4 / ((i * 2 + 1) * math.pi) * math.sin((i * 2 + 1) * (t + tw)) for i in range(N))
    wave_pts.append([3.6 + tw / 2, wy, 0])
    tw -= dt
c.append(rs.AddInterpCurve(wave_pts))
b.append(rs.AddLine([x, y, 0], [3.6, y, 0]))

Above is the Fourier Series code I wrote in the Python component. So, it should work in Rhino 6, 7, and 8 without problems. However, you can rebuild the component by copying the code above.

fourier series
Fourier Series Grasshopper definitionDownload
Fourier Series animation with GrasshopperDownload
  • Search

  • Categories

    • Education
      • Basic Design
      • Design Geometry
      • Design Mathematics
      • Digital Fabrication
      • Parametric Modeling
      • Tutorials
    • Philosophy
      • Analytical Tradition
      • Phenomenology
    • Practice
      • 3D Models
      • Projects
      • Publications
      • Workshops
    • Research
      • 3D Printing
      • Building Facade
      • Calculus
      • Climate Analysis
      • Compass Constructions
      • Computational Geometry
      • Curves
      • Decorative Arts
      • Digital Fabrication
      • Evolutionary Solvers
      • Folding Structures
      • Fractals
      • Graph Theory
      • Interlocking Structures
      • Islamic Patterns
      • Linear Algebra
      • Minimal Surfaces
      • Muqarnas
      • Non-Euclidean Geometry
      • Paneling
      • Parametric Curves
      • Parametric Objects
      • Parametric Surfaces
      • Pattern Deformations
      • Patterns
      • Pavilions
      • Polyhedra
      • Rammed Earth Structures
      • Robotic Fabrication
      • Shape Grammars
      • Simulation
      • Space Syntax
      • Surface Constructions
      • Tessellations
      • Tools
      • Vector Fields
      • Virtual Reality
    • Tools and Languages
      • 3DS Max
      • 3DS Max Script
      • Grasshopper
      • Photoshop
      • Physical Prototyping
      • Revit
      • Rhino
      • Rhino Macro
      • Rhino Python
      • Rhino Script
      • Unity
  • Monthly Archive

    • August 2026 (1)
    • October 2025 (1)
    • June 2025 (2)
    • May 2025 (2)
    • April 2025 (5)
    • December 2024 (40)
    • August 2024 (5)
    • July 2024 (6)
    • April 2024 (4)
    • March 2024 (10)
    • February 2024 (10)
    • January 2024 (8)
    • December 2023 (10)
    • August 2023 (3)
    • July 2023 (3)
    • June 2023 (7)
    • May 2023 (8)
    • April 2023 (7)
    • March 2023 (2)
    • February 2023 (2)
    • January 2023 (3)
    • December 2022 (6)
    • November 2022 (7)
    • January 2022 (1)
    • December 2021 (1)
    • October 2021 (3)
    • September 2021 (4)
    • August 2021 (4)
    • May 2019 (2)
    • April 2019 (1)
    • March 2019 (5)
    • January 2019 (2)
    • December 2018 (1)
    • November 2018 (4)
    • October 2018 (9)
    • July 2018 (1)
    • June 2018 (3)
    • May 2018 (1)
    • April 2018 (4)
    • February 2018 (2)
    • January 2018 (7)
    • August 2017 (9)
    • July 2017 (6)
    • October 2016 (1)
    • May 2015 (5)
    • April 2015 (8)
    • March 2015 (12)
    • February 2015 (4)
    • January 2015 (11)
    • November 2014 (1)
    • August 2014 (1)
    • June 2014 (2)
    • May 2014 (12)
    • April 2014 (5)
    • March 2014 (3)
    • February 2014 (6)
    • January 2014 (4)
    • December 2013 (5)
    • November 2013 (11)
    • October 2013 (2)
    • September 2013 (9)
    • August 2013 (4)
    • July 2013 (2)
    • June 2013 (14)
    • May 2013 (4)
    • April 2013 (10)
    • March 2013 (11)
    • February 2013 (11)
    • January 2013 (10)
    • December 2012 (10)
    • November 2012 (6)
    • October 2012 (13)
    • September 2012 (2)
    • August 2012 (5)
    • July 2012 (14)
    • June 2012 (6)
    • May 2012 (17)
    • April 2012 (15)
    • March 2012 (9)
    • February 2012 (16)
    • January 2012 (18)
    • December 2011 (20)
    • November 2011 (2)
  • Support designcoding!

    Enjoying designcoding? Support its future with a small donation on Patreon. Thank you!

    Patreon


    copyright 2026 designcoding.net | about | table of contents | keywords | privacy policy | end user license agreement