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

Revision 9376, 3.9 KB checked in by mianhayr, 22 months ago (diff)

monta neliöö

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