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

Revision 9374, 3.3 KB checked in by mianhayr, 3 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4
5public class Sq : PhysicsGame
6{
7    //List<Vector> crc;
8    //double rad = 50, radc = 0.01, pts = 150, minrad = 1, maxrad = 200;
9    double glmin = 0.5, glmax = 5;
10
11    List<Square> sqs = new List<Square>();
12
13    public override void Begin()
14    {
15        Level.Width = Level.Height = Window.Width = Window.Height = 800;
16        Mouse.IsCursorVisible = true; Level.Background.Color = Color.Black;
17
18        sqs.Add(new Square(1, 400, 10));
19        //crc = CreateCircle(rad, pts);
20    }   
21
22    // r = radius, n = number of pts
23    //List<Vector> CreateCircle(double r, double n)
24    //{
25    //    List<Vector> crc = new List<Vector>();
26    //    for (int i = 0; i <= n; i++)
27    //        crc.Add(new Vector(Math.Sin(i) * r, Math.Cos(i) * r));
28    //    return crc;
29    //}
30
31    void Rotate(List<Vector> vs, bool reverse = false)
32    {
33        double d = Time.SinceLastUpdate.TotalSeconds;
34        if (reverse) d = -d;
35        for (int i = 0; i < vs.Count; i++)
36            vs[i] = new Vector(vs[i].X * Math.Cos(-d) - vs[i].Y * Math.Sin(-d),
37                               vs[i].X * Math.Sin(-d) + vs[i].Y * Math.Cos(-d));
38    }
39
40    protected override void Paint(Canvas c)
41    {
42        c.BrushColor = Color.Red;
43
44        // loops through all squares to be drawn
45        for (int i = 0; i < sqs.Count; i++)
46        {
47            sqs[i].mag += sqs[i].magc = (glmin+(sqs[i].maxmag-sqs[i].mag) / // scales change to [glmin,glmax]
48                (sqs[i].maxmag)*(glmax-glmin)) * Math.Sign(sqs[i].magc);    // and reduces current magnitude
49
50            for (int j = 0; j < sqs[i].Count; j++)
51                c.DrawLine(sqs[i][j % sqs[i].Count] * sqs[i].mag,
52                           sqs[i][(j + sqs[i].Count / 4) % sqs[i].Count] * sqs[i].mag);
53
54            if (sqs[i].mag < sqs[i].minmag)
55            {
56                if (sqs[i].n == 0) Exit(); // minimum number of pts reached
57                sqs[i].magc = -sqs[i].magc; // reverse squeeze
58                sqs.Add(new Square(sqs[i].minmag, sqs[i].maxmag, sqs[i].n-1));
59                sqs.Remove(sqs[i]);
60            }
61            else if (sqs[i].mag > sqs[i].maxmag)
62                sqs[i].magc = -sqs[i].magc; // reverse squeeze
63
64            Rotate(sqs[i]);
65        }
66
67        //c.BrushColor = Color.Blue;
68
69        ////draws and squeezes the circle
70        //for (int i = 0; i < crc.Count; i++)
71        //{
72        //    c.DrawLine(crc[i % crc.Count], crc[(i + 2) % crc.Count]);
73        //    crc[i] = new Vector(Math.Sin(i) * rad, Math.Cos(i) * rad);
74        //    if (rad < minrad || rad > maxrad) radc = -radc;
75        //    rad -= radc;
76        //}
77
78        //foreach (Square sq in sqs)  //Rotate(crc, true);
79
80        base.Paint(c);
81    }
82}
83
84class Square : List<Vector>
85{
86    public double n, mag, minmag , maxmag, magc, lim;
87
88    // min and max magnitude, d = number of pts/side
89    public Square(double min, double max, double d)
90    {
91        n = d; mag = minmag = magc = min; maxmag = max; lim = 2/(d+1);
92        for (double i = -1; i < 1; i += lim) Add(new Vector(-1, i));
93        for (double i = -1; i < 1; i += lim) Add(new Vector(i, 1));
94        for (double i = 1; i > -1; i -= lim) Add(new Vector(1, i));
95        for (double i = 1; i > -1; i -= lim) Add(new Vector(i, -1));       
96    }
97}
Note: See TracBrowser for help on using the repository browser.