source: 2017/30/MikkoH/Sq/Sq/Sq/Sq.cs @ 10334

Revision 9441, 3.8 KB checked in by mianhayr, 2 years ago (diff)

demottavissa

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4
5public class Sq : Game
6{   
7    double glmin = 0.5, glmax = 3; bool glrev;
8    List<Square> sqs = new List<Square>();
9
10    public override void Begin()
11    {
12        Window.Height = 800; Window.Width = 1200;
13        Mouse.IsCursorVisible = true; Level.Background.Color = Color.Black;
14
15        sqs.Add(new Square(new Vector(0,0), 1, 400, 10, glrev, new Vector(-30, 30)));
16    }     
17
18    protected override void Paint(Canvas c)
19    {
20        if (sqs.Count == 0) Exit();
21        for (int i = 0; i < sqs.Count; i++)
22        {
23            sqs[i].mag += sqs[i].magc = (glmin+(sqs[i].maxmag-sqs[i].mag) / // scales change to [glmin,glmax]
24                (sqs[i].maxmag)*(glmax-glmin)) * Math.Sign(sqs[i].magc);    // and reduces current magnitude
25
26            int d = (int)(sqs[i].mag / (sqs[i].maxmag+glmax - sqs[i].minmag) * 254);
27            c.BrushColor = new Color(d, 100, 0); // scales color change from magnitude change, TODO: something interesting
28
29            for (int j = 0; j < sqs[i].Count; j++)
30                c.DrawLine(sqs[i][j % sqs[i].Count] * sqs[i].mag + sqs[i].pos,
31                           sqs[i][(j + sqs[i].Count / 4) % sqs[i].Count] * sqs[i].mag + sqs[i].pos);
32
33            if (sqs[i].mag < sqs[i].minmag)
34            {
35                if (sqs[i].n == 0) { sqs.Remove(sqs[i]); continue; } // number of pts reached
36                sqs[i].magc = -sqs[i].magc; // reverse squeeze
37                for (int k = 0; k < 2; k++)
38                    sqs.Add(new Square(RandomGen.NextVector(Level.Left, Level.Bottom, Level.Right, Level.Top),
39                                       sqs[i].minmag, sqs[i].maxmag/1.5, sqs[i].n - 1, glrev = !glrev, sqs[i].off));
40                sqs.Remove(sqs[i]);
41            } else if (sqs[i].mag > sqs[i].maxmag) sqs[i].magc = -sqs[i].magc; // reverse squeeze
42
43            sqs[i].Rotate(Time.SinceLastUpdate.TotalSeconds);
44        } base.Paint(c);
45    }
46}
47
48class Square : List<Vector>
49{
50    public double n, mag, minmag , maxmag, magc, lim;
51    public Vector pos, off; public bool rev;
52
53    // position, min and max magnitude, d = number of pts/side
54    // sqs are always collections of unit vectors centered around origin, offset from origin is indicated by pos
55    public Square(Vector p, double min, double max, double d, bool r, Vector o)
56    {
57        n = d; mag = minmag = magc = min; maxmag = max; lim = 2/(d+1);
58        pos = p; rev = r; off = o;
59        for (double i = -1; i < 1; i += lim) Add(new Vector(-1, i));
60        for (double i = -1; i < 1; i += lim) Add(new Vector(i, 1));
61        for (double i = 1; i > -1; i -= lim) Add(new Vector(1, i));
62        for (double i = 1; i > -1; i -= lim) Add(new Vector(i, -1));       
63    }
64
65    public void Rotate(double d)
66    {
67        if (rev) d = -d;
68        for (int i = 0; i < Count; i++)
69            this[i] = new Vector(this[i].X * Math.Cos(-d) - this[i].Y * Math.Sin(-d),
70                                 this[i].X * Math.Sin(-d) + this[i].Y * Math.Cos(-d));
71    }
72}
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89//List<Vector> crc;
90//double rad = 50, radc = 0.01, pts = 150, minrad = 1, maxrad = 200;
91
92//crc = CreateCircle(rad, pts);
93
94// r = radius, n = number of pts
95//List<Vector> CreateCircle(double r, double n)
96//{
97//    List<Vector> crc = new List<Vector>();
98//    for (int i = 0; i <= n; i++)
99//        crc.Add(new Vector(Math.Sin(i) * r, Math.Cos(i) * r));
100//    return crc;
101//}
102//c.BrushColor = Color.Blue;
103
104////draws and squeezes the circle
105//for (int i = 0; i < crc.Count; i++)
106//{
107//    c.DrawLine(crc[i % crc.Count], crc[(i + 2) % crc.Count]);
108//    crc[i] = new Vector(Math.Sin(i) * rad, Math.Cos(i) * rad);
109//    if (rad < minrad || rad > maxrad) radc = -radc;
110//    rad -= radc;
111//}
112
113//foreach (Square sq in sqs)  //Rotate(crc, true);
Note: See TracBrowser for help on using the repository browser.