## Archive for **August 2009**

## Exploring L-systems

Some time ago I came across an interesting idea about using a variant of a formal grammar, an L-system, to draw fractals and plants. For those familiar with formal grammars an L-system grammar is defined as such:

where

is a set of variables

is a set of constants

is the start axiom

is a set of production rules

How does an L-system grammar differ from a formal grammar you ask? The difference lies in the way the production rules are applied. A formal grammar generates a language by applying its production rules one at a time. Whereas an L-system grammar generates an L-system by applying as many rules as it can per iteration. Wikipedia has much more on L-systems and formal grammars if you are interested.

What’s amazing about L-systems is that they’re simple concepts but they’re used to model complex natural phenomena such as the growth of plants. We can visually see what L-systems are capable of if we combine them with computer graphics. To accomplish this we give certain symbols of an L-system extra meaning. For example, if an L-System grammar contains a variable and constants , we can say that the also means to draw forward, and the also mean to draw left and right by some angle.

The screenshots below are my implementation of L-systems (developed with Java using Swing for GUI).

This one is called a dragon curve

An older screenshot of my program generating a plant:

## Math routines

The above is an early screenshot when I had buffer overflow bug in my code.

In my last post I mentioned my top priority was to finish a 4×4 Matrix class to use for my ray tracer. Unfortunately, I have not finished it. However, I did start writing many other classes, such as Point and Transform. I also wrote transform functions for translations, Object-To-World and Camera-To-World. Of course I can’t show these things with a screenshot, so instead I included below the source code interface for my matrix class.

struct Matrix { public: double d[4][4]; Matrix(); Matrix(double initd[4][4]); Matrix(double d11, double d12, double d13, double d14, double d21, double d22, double d23, double d24, double d31, double d32, double d33, double d34, double d41, double d42, double d43, double d44); Matrix inverse() const; Matrix operator+(const Matrix& m1) const; Matrix& operator+=(const Matrix& m1); Matrix operator-(const Matrix& m1) const; Matrix& operator-=(const Matrix& m1); Matrix operator*(const Matrix& m1) const; Matrix& operator*=(const Matrix& m1); bool operator==(const Matrix& m1) const; bool operator!=(const Matrix& m1) const; };

I’m using doubles because there is some numerical instability in my ray tracer that I don’t feel like fixing just right now.

## My Ray Tracer

The above screenshot is that of my ray tracer. Currently it has only barebone features but I hope to get more stuff in as soon as possible. I’ll use this blog mostly to record my ray tracer development, but If I have time I’ll try and post about other things I find interesting.

**Features:**

Sphere and Infinite Plane Primitives

Point Light

Perspective projection

Orthographic projection

Reflections

Shadows

Supersampling (grid algorithm)

**To Do List (in descending priority):**

Complete 4x4Matrix class

Add more transformation – rotation, lookAt, scaling, etc.

Add object space, camera space, world space, screen space