1 | using System; |
---|
2 | using System.Collections.Generic; |
---|
3 | using Jypeli; |
---|
4 | |
---|
5 | public 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 | |
---|
48 | class 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); |
---|