source: 2014/30/MikkoI/frakt/frakt/frakt/Game1.cs @ 5650

Revision 5650, 10.3 KB checked in by mijoilmo, 6 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Threading;
5using Microsoft.Xna.Framework;
6using Microsoft.Xna.Framework.Audio;
7using Microsoft.Xna.Framework.Content;
8using Microsoft.Xna.Framework.GamerServices;
9using Microsoft.Xna.Framework.Graphics;
10using Microsoft.Xna.Framework.Input;
11using Microsoft.Xna.Framework.Media;
12
13namespace frakt
14{
15    /// <summary>
16    /// This is the main type for your game
17    /// </summary>
18    public class WooooFract : Microsoft.Xna.Framework.Game
19    {
20        GraphicsDeviceManager graphics;
21        SpriteBatch spriteBatch;
22        Vector2 viewportSize;
23        KeyboardState keyboardState;
24        KeyboardState oldKeyboardState;
25        MouseState mouseState;
26        MouseState oldMouseState;
27
28        SpriteFont command;
29
30        Texture2D pixel;
31        Texture2D image;
32
33        string commandStr = "";
34
35        decimal[,][] pointData;
36
37        decimal[] gridOffset = new decimal[2] { 0, 0 };
38        decimal[] gridScale = new decimal[2] { 4, 4 };
39        int[] calcResolution = new int[2] { 10, 10 };
40        int calcIterations = 1;
41
42        int incr = 2;
43
44        Color[] data;
45
46        public WooooFract()
47        {
48            graphics = new GraphicsDeviceManager(this);
49            graphics.PreferredBackBufferWidth = 1920;
50            graphics.PreferredBackBufferHeight = 1080;
51            Content.RootDirectory = "Content";
52        }
53
54        /// <summary>
55        /// Allows the game to perform any initialization it needs to before starting to run.
56        /// This is where it can query for any required services and load any non-graphic
57        /// related content.  Calling base.Initialize will enumerate through any components
58        /// and initialize them as well.
59        /// </summary>
60        protected override void Initialize()
61        {
62            // TODO: Add your initialization logic here
63            pixel = new Texture2D(GraphicsDevice, 1, 1);
64            pixel.SetData(new UInt32[] { UInt32.MaxValue });
65
66            image = new Texture2D(GraphicsDevice, 1, 1);
67
68            base.Initialize();
69
70            piirraKuva();
71        }
72
73        void piirraKuva()
74        {
75            GraphicsDevice.Textures[0] = null;
76
77            image = new Texture2D(GraphicsDevice, (int)calcResolution[0], (int)calcResolution[1]);
78
79            //alusta fraktaalin numeerinen data
80            this.pointData = new decimal[image.Width, image.Height][];
81
82            int threads = 4;
83            Thread[] apurit = new Thread[threads];
84
85            this.data = new Color[image.Width * image.Height];
86            image.GetData(data);
87
88            for (int y = 0; y < threads; y++)
89            {
90                int yy = y;
91                apurit[y] = new Thread(delegate(object o)
92                {
93                    int alku = (image.Height / threads) * yy;
94                    int loppu = (image.Height / threads) * (yy + 1);
95                    if (yy == threads - 1) { loppu = image.Height; }
96                    Test(alku, loppu);
97                });
98
99                apurit[y].Start(null);
100            }
101
102            for (int y = 0; y < threads; y++)
103            {
104                apurit[y].Join();
105            }
106
107            image.SetData(data);
108        }
109
110        void Test(int alku, int loppu)
111        {
112            Random random = new Random();
113            for (int y = alku; y < loppu; y++)
114            {
115                for (int x = 0; x < image.Width; x++)
116                {
117                    decimal VectorX = (gridScale[0] / image.Width) * x - (gridScale[0] / 2M) + gridOffset[0];
118                    decimal VectorY = (gridScale[1] / image.Height) * y - (gridScale[1] / 2M) + gridOffset[1];
119                    pointData[x, y] = new decimal[4] { VectorX, VectorY, VectorX, VectorY };
120                    for (int iterations = 0; iterations < calcIterations; iterations++)
121                    {
122                        if (doesPointEscape(this.pointData[x, y]))
123                        {
124                            this.data[x + y * image.Width] = getColor(iterations, calcIterations+1);
125                            break;
126                        }
127                        else
128                        {
129                            pointData[x, y] = iteration2d(pointData[x, y]);
130                        }
131                    }
132                }
133            }
134        }
135
136        bool doesPointEscape(decimal[] vec)
137        {
138            if (vec[0] * vec[0] + vec[1] * vec[1] > 4) return true;
139            return false;
140        }
141
142        decimal[] iteration2d(decimal[] vec)
143        {
144            decimal[] nvec = new decimal[4];
145            nvec[0] = vec[0] * vec[0] - vec[1] * vec[1] + vec[2];
146            nvec[1] = 2M * vec[0] * vec[1] + vec[3];
147            nvec[2] = vec[2];
148            nvec[3] = vec[3];
149            return nvec;
150        }
151
152        /// <summary>
153        /// LoadContent will be called once per game and is the place to load
154        /// all of your content.
155        /// </summary>
156        protected override void LoadContent()
157        {
158            // Create a new SpriteBatch, which can be used to draw textures.
159            spriteBatch = new SpriteBatch(GraphicsDevice);
160            command = Content.Load<SpriteFont>("fonts/c");
161
162            // TODO: use this.Content to load your game content here
163        }
164
165        /// <summary>
166        /// UnloadContent will be called once per game and is the place to unload
167        /// all content.
168        /// </summary>
169        protected override void UnloadContent()
170        {
171
172        }
173
174        /// <summary>
175        /// Allows the game to run logic such as updating the world,
176        /// checking for collisions, gathering input, and playing audio.
177        /// </summary>
178        /// <param name="gameTime">Provides a snapshot of timing values.</param>
179
180        bool isKeyPressed(Keys key)
181        {
182            return keyboardState.IsKeyDown(key) && oldKeyboardState.IsKeyUp(key);
183        }
184
185        void commandTypeCheck(){
186           
187        }
188
189        protected override void Update(GameTime gameTime)
190        {
191            // Allows the game to exit
192
193            this.keyboardState = Keyboard.GetState();
194
195            if (isKeyPressed(Keys.Enter))
196            {
197                incr++;
198                piirraKuva();
199            }
200
201            if (isKeyPressed(Keys.Left))
202            {
203                gridOffset[0] -= gridScale[0] / 10M;//kymmenes imagen koosta
204                piirraKuva();
205            }
206            else if (isKeyPressed(Keys.Right))
207            {
208                gridOffset[0] += gridScale[0] / 10M;
209                piirraKuva();
210            }
211            if (isKeyPressed(Keys.Up))
212            {
213                gridOffset[1] -= gridScale[1] / 10M;
214                piirraKuva();
215            }
216            else if (isKeyPressed(Keys.Down))
217            {
218                gridOffset[1] += gridScale[1] / 10M;
219                piirraKuva();
220            }
221
222            if (isKeyPressed(Keys.Add))
223            {
224                calcResolution[0] *= 2;
225                calcResolution[1] *= 2;
226                piirraKuva();
227            }
228            else if (isKeyPressed(Keys.Subtract))
229            {
230                calcResolution[0] /= 2;
231                calcResolution[1] /= 2;
232                if (calcResolution[0] < 1 || calcResolution[1] < 1) { calcResolution = new int[2] { 1, 1 }; };
233                piirraKuva();
234            }
235
236            if (isKeyPressed(Keys.OemPlus))
237            {
238                calcIterations *= 2;
239                piirraKuva();
240            }
241            else if (isKeyPressed(Keys.OemMinus))
242            {
243                calcIterations /= 2;
244                if (calcIterations < 1) { calcIterations = 1; };
245                piirraKuva();
246            }
247
248            if (keyboardState.IsKeyDown(Keys.Escape))
249                this.Exit();
250
251            commandTypeCheck();
252
253            this.mouseState = Mouse.GetState();
254
255            if (this.mouseState.ScrollWheelValue != this.oldMouseState.ScrollWheelValue)
256            {
257                if (this.mouseState.ScrollWheelValue > this.oldMouseState.ScrollWheelValue)
258                {
259                    gridScale[0] /= 1.1M;
260                    gridScale[1] /= 1.1M;
261                }
262                else if (this.mouseState.ScrollWheelValue < this.oldMouseState.ScrollWheelValue)
263                {
264                    gridScale[0] *= 1.1M;
265                    gridScale[1] *= 1.1M;
266                }
267                piirraKuva();
268            }
269
270            // TODO: Add your update logic here
271
272            this.oldMouseState = mouseState;
273            this.oldKeyboardState = keyboardState;
274
275            base.Update(gameTime);
276        }
277
278        void startRender()
279        {
280            viewportSize.X = Window.ClientBounds.Width;
281            viewportSize.Y = Window.ClientBounds.Height;
282        }
283
284        /// <summary>
285        /// This is called when the game should draw itself.
286        /// </summary>
287        /// <param name="gameTime">Provides a snapshot of timing values.</param>
288        Color getColor(float index, float size)
289        {
290            Color[] palette = { new Color(0, 0, 0), new Color(255, 0, 0), new Color(255, 255, 0), new Color(0, 255, 0), new Color(0, 255, 255), new Color(0, 0, 255), new Color(0, 0, 0) };
291            index = Math.Abs(index);
292            index = index % size;
293            size--;
294            float realIndex = ((float)Math.Floor(index) / size) * (palette.Length - 1);
295            Color col1 = palette[(int)Math.Floor(realIndex)];
296            Color col2 = palette[(int)Math.Ceiling(realIndex)];
297            float rel = realIndex - (float)Math.Floor(realIndex);
298            return Color.Lerp(col1, col2, rel);
299        }
300        protected override void Draw(GameTime gameTime)
301        {
302            GraphicsDevice.Clear(Color.White);
303            // TODO: Add your drawing code here
304
305            spriteBatch.Begin();
306            spriteBatch.Draw(image, new Rectangle(0, 0, Window.ClientBounds.Width, Window.ClientBounds.Height), Color.White);
307            spriteBatch.DrawString(command,commandStr,new Vector2(0,0),Color.White);
308            spriteBatch.End();
309
310            base.Draw(gameTime);
311        }
312    }
313}
Note: See TracBrowser for help on using the repository browser.