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

Revision 9414, 4.2 KB checked in by mianhayr, 2 years ago (diff)

testailtu uusia muodostelmia

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