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

Revision 9396, 3.9 KB checked in by mianhayr, 20 months ago (diff)

väri skaalaa oikein

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        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, 5));     
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);
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/1.5, sqs[i].n-1));
49                sqs.Add(new Square(sqs[i].pos + new Vector(-100, 0), sqs[i].minmag, sqs[i].maxmag, sqs[i].n));
50                //sqs.Add(new Square(sqs[i].pos + new Vector(200, -100), sqs[i].minmag, sqs[i].maxmag/1.5, sqs[i].n-1));
51                sqs.Remove(sqs[i]);
52            }
53            else if (sqs[i].mag > sqs[i].maxmag)
54                sqs[i].magc = -sqs[i].magc; // reverse squeeze
55
56            Rotate(sqs[i]);
57        }
58
59        base.Paint(c);
60    }
61}
62
63class Square : List<Vector>
64{
65    public double n, mag, minmag , maxmag, magc, lim;
66    public Vector pos;
67
68    // position, min and max magnitude, d = number of pts/side
69    // sqs are always collections of unit vectors centered around 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.