source: 2015/30/SonjaH/Demo8/Kuvaaja/Kuvaaja/Kuvaaja.cs @ 7085

Revision 7085, 10.8 KB checked in by soonhuot, 4 years ago (diff)

Uusi versio apinapelistä.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6// using Jypeli.Effects;
7using Jypeli.Widgets;
8// using Jypeli.WP7;
9
10namespace Demo7
11{
12    /// @author  Vesa Lappalainen
13    /// @version 14.10.2011
14    /// <summary>
15    /// Piirretään pistejoukon kuvaajaa
16    /// </summary>
17    public class Kuvaaja : PhysicsGame
18    {
19        /// <summary>Koordinaatistoakselit</summary>
20        private Axis akselit;
21
22        /// <summary>Koordinaatit piirretyille pisteille</summary>
23        private List<Vector> pisteet;
24        /// <summary>Merkki paikalle jota viimeksi klikattu</summary>
25        private PhysicsObject klikattuPiste;
26
27        /// <summary>Merkki pisteelle joka on lähinnä klikattua paikkaa</summary>
28        private PhysicsObject merkkipiste;
29
30
31        private const double x1 = -5;
32        private const double x2 = 20;
33        private const double y1 = -5;
34        private const double y2 = 20;
35        private const double pallonKoko = (y2 - y1) / 300;
36
37        /// <summary>
38        /// Alustetaan rajat ja luodaan pisteet ja
39        /// niiden paikat pisteet-taulukkoon.
40        /// </summary>
41        public override void Begin()
42        {
43            SetWindowSize(1000, 700); // muuta tässä arvoja jos ikkuna ei mahdu kokokaan ruutuun
44            Level.Background.Color = Color.White;
45            // IsFullScreen = true;
46            Level.Width = x2 - x1;
47            Level.Height = y2 - y1;
48
49            akselit = new Axis(x1, y1, x2, y2);
50
51            pisteet = ArvoPisteet(2000, x1, y1, x2, y2);
52
53            LuoPisteet(this, pisteet, pallonKoko);
54
55            klikattuPiste = LuoPallo(this, Vector.Zero, 1.5 * pallonKoko, Color.Blue);
56            merkkipiste = LuoPallo(this, Vector.Zero, 1.5 * pallonKoko, Color.Red);
57
58            Camera.ZoomTo(x1, y1, x2, y2);
59            AsetaOhjaimet();
60        }
61
62
63        /// <summary>
64        /// Asetetaan ohjaimet peliä varten. F1 ja ESC.
65        /// Kuunnellaan hiiren paikkaa ja siirretään merkkipisteen sen mukaan mihin klikattu
66        /// Samoin kuunnellaan puhelimelta sormella tökkäisyä.
67        /// </summary>
68        private void AsetaOhjaimet()
69        {
70            Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
71            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
72
73            Mouse.IsCursorVisible = true;
74            Mouse.Listen(MouseButton.Left, ButtonState.Pressed, delegate () { SiirraMerkkipisteet(Mouse.PositionOnWorld); }, "Laita piste");
75            Mouse.Listen(MouseButton.Right, ButtonState.Pressed, KysyKoordinaatti, "Kysy");
76
77            //            TouchPanel.Listen(ButtonState.Pressed, delegate(Touch kosketus) { SiirraMerkkipisteet(kosketus.PositionOnWorld); }, null);
78            //            TouchPanel.ListenGesture(GestureType.VerticalDrag, delegate(Touch touch) { KysyKoordinaatti(); }, "Kysy");
79            PhoneBackButton.Listen(Exit, "Lopeta peli");
80        }
81
82
83        /// <summary>Suojataan ettei kysymys voi olla käynnissä montaa kertaa</summary>
84        private bool kysymassa = false;
85
86        /// <summary>
87        /// Kysytään koordinaatti ja luodaan vihreä  piste tähän paikkaan
88        /// </summary>
89        private void KysyKoordinaatti()
90        {
91            if (kysymassa) return;
92            kysymassa = true;
93            InputWindow kysymysIkkuna = new InputWindow("Anna uuden pisteen koordinaatti");
94            kysymysIkkuna.TextEntered += KoordinaattiAnnettu;
95            kysymysIkkuna.Color = Color.Gray;
96            kysymysIkkuna.InputBox.Text = "5 5";
97            // kysymysIkkuna.ShowWindowOnPhone = true;
98            Add(kysymysIkkuna);
99        }
100
101
102        /// <summary>
103        /// Laitetaan syöttöikkunasta saatuun koordinaattiin uusi vihreä piste
104        /// </summary>
105        /// <param name="ikkuna"></param>
106        private void KoordinaattiAnnettu(InputWindow ikkuna)
107        {
108            string vastaus = ikkuna.InputBox.Text;
109            Vector p = new Vector();
110            double[] d = Taulukot.ErotaLuvut(vastaus + " 0 0");
111            p.X = d[0];
112            p.Y = d[1];
113            LuoPallo(this, p, 1.5 * pallonKoko, Color.Green);
114            kysymassa = false;
115        }
116
117
118        /// <summary>
119        /// Siirretään sininen piste paikan p kohdalle
120        /// ja siirretään punainen piste lähimmän alueen pisteen päälle
121        /// </summary>
122        /// <param name="p">paikka johon sininen piste tulee</param>
123        public void SiirraMerkkipisteet(Vector p)
124        {
125            klikattuPiste.Position = p;
126
127            int i = LahimmanIndeksi(pisteet, p);
128            if (i < 0) return;
129
130            merkkipiste.Position = pisteet[i];
131        }
132
133
134        /// <summary>
135        /// Luodaan peliin taulukossa olevien koordinaattien kohdalle pienet pallot
136        /// </summary>
137        /// <param name="pisteet">piirrettävien pisteiden koordinaatit</param>
138        /// <param name="r">säde kullekin pisteelle</param>
139        /// <param name="game">peli, johon pisteet lisätään</param>
140        public static void LuoPisteet(PhysicsGame game, IEnumerable<Vector> pisteet, double r)
141        {
142            foreach (Vector p in pisteet)
143                LuoPallo(game, p, r, Color.Black);
144        }
145
146
147        /// <summary>
148        /// Lisätään peliin pallo
149        /// </summary>
150        /// <param name="game">peli johon pallo lisätään</param>
151        /// <param name="p">pallon keskipiste</param>
152        /// <param name="r">pallon säde</param>
153        /// <param name="color">pallon väri</param>
154        /// <returns>lisätyn pallon viite</returns>
155        public static PhysicsObject LuoPallo(PhysicsGame game, Vector p, double r, Color color)
156        {
157            PhysicsObject pallo = new PhysicsObject(r * 2, r * 2, Shape.Circle);
158            pallo.Position = p;
159            pallo.Color = color;
160            game.Add(pallo);
161            return pallo;
162        }
163
164
165        /// <summary>
166        /// Arvotaan joukko 2D-pisteitä halutulle alueelle
167        /// </summary>
168        /// <param name="n">montako pistettä arvotaan</param>
169        /// <param name="x1">alueen vasemman alakulman x</param>
170        /// <param name="y1">alueen vasemman alakulman y</param>
171        /// <param name="x2">alueen oikean yläkulman x</param>
172        /// <param name="y2">alueen oikean yläkulman y</param>
173        /// <returns></returns>
174        public static Vector[] ArvoPisteet(int n, double x1, double y1, double x2, double y2)
175        {
176            Vector[] pisteet = new Vector[n];
177            for (int i = 0; i < n; i++)
178            {
179                //double x = RandomGen.NextDouble(x1, x2);
180                //double y = RandomGen.NextDouble(y1, y2);
181                //pisteet[i] = new Vector(x, y);
182                pisteet[i] = RandomGen.NextVector(x1, y1, x2, y2);
183            }
184            return pisteet;
185        }
186
187
188        /// <summary>
189        /// Etsitään pistettä lähimmän taulukon alkion indeksi.
190        /// </summary>
191        /// <param name="pisteet">taulukko jossa pisteet, joista lähintä etsitään</param>
192        /// <param name="piste">piste johon muita verrataan</param>
193        /// <returns>lähimmän pisteen indeksi, -1 jos taulukko tyhjä</returns>
194        /// <example>
195        /// <pre name="test">
196        ///   Vector[] luvut = { new Vector(1,2),new Vector(3,4),new Vector(5,2),new Vector(5,5) };
197        ///   Kuvaaja.LahimmanIndeksi(luvut,new Vector(3,5)) === 1;
198        ///   Kuvaaja.LahimmanIndeksi(luvut,new Vector(0,0)) === 0;
199        ///   Kuvaaja.LahimmanIndeksi(luvut,new Vector(5,3)) === 2;
200        ///   Kuvaaja.LahimmanIndeksi(luvut,new Vector(15,5)) === 3;
201        /// </pre>
202        /// </example>
203        public static int LahimmanIndeksi(Vector[] pisteet, Vector piste)
204        {
205            int paikka = -1;
206            double pieninEtaisyys = double.MaxValue;
207            for (int i = 0; i < pisteet.Length; i++)
208            {
209                Vector p = pisteet[i];
210                double d = Vector.Distance(piste, p);
211                if (d < pieninEtaisyys)
212                {
213                    paikka = i;
214                    pieninEtaisyys = d;
215                }
216            }
217            return paikka;
218        }
219
220
221        /// <summary>
222        /// Tämä tehdään aina kun ruutua pitää päivittää
223        /// </summary>
224        /// <param name="canvas">Piirtoalue, johon voi piirtää</param>
225        protected override void Paint(Canvas canvas)
226        {
227            akselit.Draw(canvas);
228        }
229
230
231        /// <summary>
232        /// Kun Windows Phonessa palataan takaisin, aloitetaan uusi peli
233        /// </summary>
234        //        public override void Continue()
235        //        {
236        //           // Begin();
237        //        }
238
239    }
240
241
242    /// <summary>
243    /// Luokka koordinaatiston piirtämistä varten
244    /// </summary>
245    public class Axis
246    {
247        private double x1, x2, y1, y2;
248        public Color Color { set; get; }
249
250        /// <summary>
251        /// Alustetaan koordinaatisto haluttuihin rajoihin
252        /// </summary>
253        /// <param name="x1">alueen vasemman alakulman x</param>
254        /// <param name="y1">alueen vasemman alakulman y</param>
255        /// <param name="x2">alueen vasemman yläkulman x</param>
256        /// <param name="y2">alueen vasemman yläkulman y</param>
257        public Axis(double x1, double y1, double x2, double y2)
258        {
259            this.x1 = x1;
260            this.x2 = x2;
261            this.y1 = y1;
262            this.y2 = y2;
263            Color = Color.Black;
264        }
265
266
267        /// <summary>
268        /// Piirretään koordinaatisto niin, että tulee x ja y akselit ja niihin
269        /// yhden välein pikkutikkuja.
270        /// </summary>
271        /// <param name="canvas">Canvas-olio, johon piirto tehdään</param>
272        public void Draw(Canvas canvas)
273        {
274            canvas.BrushColor = Color;
275            double t = (y2 - y1) / 200; // tikkujen koko
276
277            // X-akseli
278            canvas.DrawLine(new Vector(x1, 0), new Vector(x2, 0));
279            // Tikut X-akselille 0:sta lähtien kumpaankin suuntaan
280            for (double x = 0; x >= x1; x -= 1.0) canvas.DrawLine(new Vector(x, -t), new Vector(x, t));
281            for (double x = 0; x <= x2; x += 1.0) canvas.DrawLine(new Vector(x, -t), new Vector(x, t));
282
283            // Y-akseli
284            canvas.DrawLine(new Vector(0, y1), new Vector(0, y2));
285            // Tikut Y-akselille 0:sta lähtien kumpaankin suuntaan
286            for (double y = 0; y >= y1; y -= 1.0) canvas.DrawLine(new Vector(-t, y), new Vector(t, y));
287            for (double y = 0; y <= y2; y += 1.0) canvas.DrawLine(new Vector(-t, y), new Vector(t, y));
288        }
289    }
290
291}
Note: See TracBrowser for help on using the repository browser.