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

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