Galaxy: Load is factory now. master
[GalaxyGenerator.git] / PngRenderer.cs





































Andy Wilkinson




















































































1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Drawing;
using System.Collections.Generic;
 
namespace GalaxyGenerator
{
        public class PngRenderer
        {
                public PngRenderer ()
                {
                }
                
                public void Render(string view, string prefix, Galaxy gal)
                {
                        Dictionary<UInt64, Star> Stars = gal.getStars();
                        int Extents = gal.getExtents();
                        int PNGSize = GlobalParameters.PNGSize;
                        int PNGFrame = GlobalParameters.PNGFrame;
                        double Scale = (double)(PNGSize - PNGFrame * 2) / (double)(Extents * 2);
                        
                        Bitmap newImage = new Bitmap(PNGSize, PNGSize);
                        Graphics gfx = Graphics.FromImage((Image)newImage);
                        
                        gfx.FillRectangle(new SolidBrush(Color.Black), 0, 0, PNGSize, PNGSize);
                        
                        foreach (Star star in Stars.Values)
                        {
                                int p0, p1 = 0;
                                p0 = (int)star.getCoords().getX();
                                switch (view)
                                {
                                case "top":
                                        p1 = (int)star.getCoords().getY();
                                        break;
                                case "side":
                                        p1 = (int)star.getCoords().getZ();
                                        break;
                                case "front":
                                        p0 = (int)star.getCoords().getY();
                                        p1 = (int)star.getCoords().getZ();
                                        break;
                                default:
                                        ThrowException(ERR_INVALID_VIEW);
                                        break;
                                }
                                int pX = (int)(Scale * (double)p0 + (double)PNGSize / 2d);
                                int pY = (int)(Scale * (double)p1 + (double)PNGSize / 2d);
                                if (!(Math.Min(pX, pY) < 0 || Math.Max (pX, pY) >= PNGSize))
                                {
                                        try
                                        {
                                                newImage.SetPixel(pX, pY,star.getColor());
                                        }
                                        catch
                                        {
                                                Console.WriteLine("We found a problem!  Point {0}, {1} scales to {2}, {3}", p0, p1, pX,pY);
                                                Console.WriteLine("PNGSize: {0}; Scale: {1}", PNGSize, Scale);
                                                
                                        }
                                }
                        }
                        
                        string filename = string.Empty;
                        switch(view)
                        {
                        case "top":
                                filename = prefix + "top.png";
                                break;
                        case "side":
                                filename = prefix + "side.png";
                                break;
                        case "front":
                                filename = prefix + "front.png";
                                break;
                        default:
                                ThrowException(ERR_INVALID_VIEW);
                                break;
                        }
                        
                        newImage.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
                }
                
                private int FindExtents(List<int[]> TwoDCoords)
                {
                        int max = 0;
                        TwoDCoords.ForEach(delegate(int[] ThisPair)
                                          {
                                if (max < Math.Max(ThisPair[0], ThisPair[1]))
                                {
                                        max = Math.Max (ThisPair[0], ThisPair[1]);
                                }
                        });
                        
                        return max;
                }
                
                private void ThrowException(int errorcode, string message)
                {
                        Console.WriteLine(message);
                        switch(errorcode)
                        {
                        case ERR_INVALID_VIEW:
                                throw new Exception("Tried to call Render for an unknown view type.  Valid views are 'top' and 'side'.");
                                break;
                        case ERR_OUT_OF_BOUND:
                                throw new Exception();
                                break;
                        default:
                                throw new Exception("PngRenderer has suffered from an unknown error.  Help!");
                        }
                }
                private void ThrowException(int errorcode)
                {
                        ThrowException(errorcode, "");
                }
                
                private const int ERR_INVALID_VIEW = 4;
                private const int ERR_OUT_OF_BOUND = 8;
}
}