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

Revision 9415, 4.3 KB checked in by mianhayr, 2 years ago (diff)

testailtu taas eri muodostelmia
lineaarinen liikutus toimii

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