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

Revision 9418, 3.8 KB checked in by mianhayr, 20 months ago (diff)

ihan nätti mutta käyttää vähän RandomGenii?

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)(1 + 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        }
45
46        base.Paint(c);
47    }
48}
49
50class Square : List<Vector>
51{
52    public double n, mag, minmag , maxmag, magc, lim;
53    public Vector pos, off; public bool rev;
54
55    // position, min and max magnitude, d = number of pts/side
56    // sqs are always collections of unit vectors centered around origin, offset from origin is indicated by pos
57    public Square(Vector p, double min, double max, double d, bool r, Vector o)
58    {
59        n = d; mag = minmag = magc = min; maxmag = max; lim = 2/(d+1);
60        pos = p; rev = r; off = o;
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        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    }
66
67    public void Rotate(double d)
68    {
69        if (rev) d = -d;
70        for (int i = 0; i < Count; i++)
71            this[i] = new Vector(this[i].X * Math.Cos(-d) - this[i].Y * Math.Sin(-d),
72                                 this[i].X * Math.Sin(-d) + this[i].Y * Math.Cos(-d));
73    }
74}
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91//List<Vector> crc;
92//double rad = 50, radc = 0.01, pts = 150, minrad = 1, maxrad = 200;
93
94//crc = CreateCircle(rad, pts);
95
96// r = radius, n = number of pts
97//List<Vector> CreateCircle(double r, double n)
98//{
99//    List<Vector> crc = new List<Vector>();
100//    for (int i = 0; i <= n; i++)
101//        crc.Add(new Vector(Math.Sin(i) * r, Math.Cos(i) * r));
102//    return crc;
103//}
104//c.BrushColor = Color.Blue;
105
106////draws and squeezes the circle
107//for (int i = 0; i < crc.Count; i++)
108//{
109//    c.DrawLine(crc[i % crc.Count], crc[(i + 2) % crc.Count]);
110//    crc[i] = new Vector(Math.Sin(i) * rad, Math.Cos(i) * rad);
111//    if (rad < minrad || rad > maxrad) radc = -radc;
112//    rad -= radc;
113//}
114
115//foreach (Square sq in sqs)  //Rotate(crc, true);
Note: See TracBrowser for help on using the repository browser.