source: OGRE/trunk/ogrenew/Samples/VolumeTex/include/Julia.h @ 692

Revision 692, 2.5 KB checked in by mattausch, 19 years ago (diff)

adding ogre 1.2 and dependencies

Line 
1/*
2-----------------------------------------------------------------------------
3This source file is part of OGRE
4    (Object-oriented Graphics Rendering Engine)
5For the latest info, see http://www.ogre3d.org/
6
7Copyright (c) 2000-2005 The OGRE Team
8Also see acknowledgements in Readme.html
9
10You may use this sample code for anything you like, it is not covered by the
11LGPL like the rest of the engine.
12-----------------------------------------------------------------------------
13*/
14/* Original author: John C. Hare
15 * Date: June 26, 1996 (although I've had these around for at least 6 years)
16 * Adapted to C++ by W.J. van der Laan 2004
17 */
18#ifndef H_Q_Julia
19#define H_Q_Julia
20#include <cmath>
21
22/**
23 * Simple, fast, inline quaternion math functions
24 */
25struct Quat {
26        float r,i,j,k;
27};
28
29inline void qadd(Quat &a, const Quat &b)
30{
31        a.r += b.r;
32        a.i += b.i;
33        a.j += b.j;
34        a.k += b.k;
35}
36
37inline void qmult(Quat &c, const Quat &a, const Quat &b)
38{
39        c.r = a.r*b.r - a.i*b.i - a.j*b.j - a.k*b.k;
40        c.i = a.r*b.i + a.i*b.r + a.j*b.k - a.k*b.j;
41        c.j = a.r*b.j + a.j*b.r + a.k*b.i - a.i*b.k;
42        c.k = a.r*b.k + a.k*b.r + a.i*b.j - a.j*b.i;
43}
44
45inline void qsqr(Quat &b, const Quat &a)
46{
47        b.r = a.r*a.r - a.i*a.i - a.j*a.j - a.k*a.k;
48        b.i = 2.0f*a.r*a.i;
49        b.j = 2.0f*a.r*a.j;
50        b.k = 2.0f*a.r*a.k;
51}
52
53/**
54 * Implicit function that evaluates the Julia set.
55 */
56class Julia {
57private:
58        float global_real, global_imag, global_theta;
59        Quat oc,c,eio,emio;
60public:
61        Julia(float global_real, float global_imag, float global_theta);
62        inline float eval(float x, float y, float z) {
63                Quat q, temp;
64                int i;
65       
66                q.r = x;
67                q.i = y;
68                q.j = z;
69                q.k = 0.0;
70       
71                for (i = 30; i > 0; i--) {
72                        qsqr(temp, q);
73                        qmult(q, emio, temp);
74                        qadd(q, c);
75       
76                        if (q.r*q.r + q.i*q.i + q.j*q.j + q.k*q.k > 8.0)
77                                break;
78                }
79       
80                return((float)i);
81        }
82};
83
84
85Julia::Julia(float global_real, float global_imag, float global_theta):
86                global_real(global_real), global_imag(global_imag), global_theta(global_theta)  {
87
88        oc.r = global_real;
89        oc.i = global_imag;
90        oc.j = oc.k = 0.0;
91
92        eio.r = cos(global_theta);
93        eio.i = sin(global_theta);
94        eio.j = 0.0;
95        eio.k = 0.0;
96
97        emio.r = cos(-global_theta);
98        emio.i = sin(-global_theta);
99        emio.j = 0.0;
100        emio.k = 0.0;
101
102        /***
103         *** multiply eio*c only once at the beginning of iteration
104         *** (since q |-> sqrt(eio*(q-eio*c)))
105         *** q -> e-io*q^2 - eio*c
106         ***/
107
108        qmult(c, eio,oc);
109
110}
111
112
113#endif
Note: See TracBrowser for help on using the repository browser.