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

Revision 9365, 3.3 KB checked in by mianhayr, 4 years ago (diff)

refaktoroitu

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(0, 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        // draws and squeezes the square
45        foreach (Square sq in sqs)
46        {
47            sq.mag += /*(sq.maxmag - sq.mag) / 10;*/sq.magc; // reduce current magnitude
48            for (int i = 0; i < sq.Count; i++)
49                c.DrawLine(sq[i % sq.Count]*sq.mag, sq[(i + sq.Count / 4) % sq.Count] * sq.mag);
50                //sq[i] = /*sq[i] * sq.mag;*/Vector.FromLengthAndAngle(sq[i].Magnitude * sq.mag, sq[i].Angle);
51                //sq[i] += new Vector(1, 1);
52        }
53
54
55        // checks if squeeze direction should be reversed
56        // merging this into the above loop will fuck everything up
57        // also tries to create new squares
58        for (int i = 0; i < sqs.Count; i++)
59            if (sqs[i].mag < sqs[i].minmag)
60            {
61                sqs[i].magc = -sqs[i].magc; // reverse squeeze
62                Square newsq = new Square(sqs[i].minmag, sqs[i].maxmag, sqs[i].dist/1.5);
63                sqs.Add(newsq); sqs.Remove(sqs[i]);
64            }
65            else if (sqs[i].mag > sqs[i].maxmag)
66                sqs[i].magc = -sqs[i].magc; // reverse squeeze
67
68        c.BrushColor = Color.Blue;
69
70        //draws and squeezes the circle
71        for (int i = 0; i < crc.Count; i++)
72        {
73            c.DrawLine(crc[i % crc.Count], crc[(i + 2) % crc.Count]);
74            crc[i] = new Vector(Math.Sin(i) * rad, Math.Cos(i) * rad);
75            if (rad < minrad || rad > maxrad) radc = -radc;
76            rad -= radc;
77        }
78
79        foreach (Square sq in sqs) Rotate(sq); Rotate(crc, true);
80
81        base.Paint(c);
82    }
83}
84
85class Square : List<Vector>
86{
87    public double dist, mag, minmag , maxmag, magc = 2;
88
89    // s = magnitude, d = number of pts/side
90    public Square(double min, double max, double d)
91    {
92        dist = d; mag = minmag = min+1; maxmag = max;
93        for (double i = -1; i <= 1; i += 1/d) Add(new Vector(-1, i));
94        for (double i = -1; i <= 1; i += 1/d) Add(new Vector(i, 1));
95        for (double i = 1; i >= -1; i -= 1/d) Add(new Vector(1, i));
96        for (double i = 1; i >= -1; i -= 1/d) Add(new Vector(i, -1));       
97    }
98}
Note: See TracBrowser for help on using the repository browser.