Graphics Programming

Ray Tracer development and some more. By Pawel Bokota.

Posts Tagged ‘c++

L-systems continued

leave a comment »

I have extended my previous L-systems implementation by adding more symbols, which allow me to create 3-D figures. This time I used OpenGL for rendering and QT for the GUI. Below is a screenshot of my program and the 3-D “tree” that it generated. Also below, is my code for the L-system class, the heart of the program. The class is responsible for rewriting strings based on the rules and symbols given.

LSystem::LSystem(string start, Rule rule) : rules(rule)
{
    startAxiom = start;
    lang       = "";
}

void LSystem::run(int iterations)
{
    string curr = startAxiom;

    for (int i = 0; i < iterations; i++)
    {
        for (int j = 0; j < curr.size(); j++)
        {
            string buff = rules.getRule(curr[j]);

            if (!buff.empty())
            {
                curr.replace(j, 1, buff);

                j += buff.size() - 1;
            }
        }
    }

    lang = curr;
}

string LSystem::getGenString()
{
    return lang;
}
Advertisements

Written by Pawel

December 30, 2009 at 4:42 pm

Math routines

leave a comment »

BadScreen

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.

Written by Pawel

August 23, 2009 at 1:38 am

Posted in Ray Tracer

Tagged with , , , , ,