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

Revision 9322, 4.0 KB checked in by tajosepp, 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
10    List<Square> sqs = new List<Square>();
11
12    public override void Begin()
13    {
14        Level.Width = Level.Height = Window.Width = Window.Height = 800;
15        Mouse.IsCursorVisible = true;
16        Level.Background.Color = Color.Black;
17
18        sqs.Add(new Square(100, 5));
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        // draws and squeezes the square
45        foreach (Square sq in sqs)
46        {
47            sq.mag -= sq.magc; // reduce current magnitude
48            for (int i = 0; i < sq.Count; i++)
49            {
50                c.DrawLine(sq[i % sq.Count], sq[(i + sq.Count / 4) % sq.Count]);
51                sq[i] = Vector.FromLengthAndAngle(sq[i].Magnitude + sq[i].Magnitude / sq.mag * sq.magc, sq[i].Angle);
52                //sq[i] += new Vector(1, 1);
53            }
54        }
55
56
57        // checks if squeeze direction should be reversed
58        // merging this into the above loop will fuck everything up
59        // also tries to create new squares
60        for (int i = 0; i < sqs.Count; i++)
61            if (sqs[i].mag < sqs[i].minmag)
62            {
63                //sqs[i].magc = -sqs[i].magc;
64                Square newsq = new Square(sqs[i].mag*4, sqs[i].dist);
65                //newsq.mag = newsq.minmag+10;
66                sqs.Add(newsq);
67                //sqs[i].magc = -sqs[i].magc; // reverse squeeze
68                sqs.Remove(sqs[i]);
69            }
70            else if (sqs[i].mag > sqs[i].maxmag)
71                sqs[i].magc = -sqs[i].magc; // reverse squeeze
72        //for (int j = 0; j < sqs[i].Count; j++)
73        //    if (sqs[i][j].Magnitude < sqs[i].minmag)
74        //    {
75        //        //Square newsq = new Square(sqs[i].mag-1, sqs[i].dist+1);
76        //        //newsq.mag = 10;
77        //        //sqs.Add(newsq);
78        //        sqs[i].magc = -sqs[i].magc; // reverse squeeze
79        //        //sqs.Remove(sqs[i]);
80
81        //        break;
82        //    }
83        //    else if (sqs[i][j].Magnitude > sqs[i].maxmag)
84        //    {
85        //        sqs[i].magc = -sqs[i].magc; // reverse squeeze
86        //        break;
87        //    }
88
89        c.BrushColor = Color.Blue;
90
91        //draws and squeezes the circle
92        for (int i = 0; i < crc.Count; i++)
93        {
94            c.DrawLine(crc[i % crc.Count], crc[(i + 2) % crc.Count]);
95            crc[i] = new Vector(Math.Sin(i) * rad, Math.Cos(i) * rad);
96            if (rad < minrad || rad > maxrad) radc = -radc;
97            rad -= radc;
98        }
99
100        foreach (Square sq in sqs) Rotate(sq); Rotate(crc, true);
101
102        base.Paint(c);
103    }
104}
105
106class Square : List<Vector>
107{
108    public double dist = 5, mag = 0, minmag = 20, maxmag = 300, magc = 2;
109
110    public Square(double s, double d)
111    {
112        for (double i = -s; i <= s; i += d) Add(new Vector(-s, i));
113        for (double i = -s; i <= s; i += d) Add(new Vector(i, s));
114        for (double i = s; i >= -s; i -= d) Add(new Vector(s, i));
115        for (double i = s; i >= -s; i -= d) Add(new Vector(i, -s));
116        dist = d; mag = s; maxmag = mag * 4;
117
118    }
119}
Note: See TracBrowser for help on using the repository browser.