none
Analogové hodiny RRS feed

Odpovědi

  • Stejný princip :) Celý zdroják :)

     public enum PointSelect
        {
            A,
            B,
            C
        }

        public partial class Form1 : Form
        {
            private Point A = new Point(0, 200);
            private Point B = new Point(200, 0);
            private Point C = new Point(200, 400);
            private Point A1 = new Point(100, 200);
            private Point B1 = new Point(200, 100);
            private Point C1 = new Point(200, 300);
            private Point stredKruhu = new Point(100, 100);
            private int radiusKruhu = 200;
            List<Car> cars = new List<Car>();
            private int numOfCars = 0;
            public Form1()
            {
                InitializeComponent();
                DoubleBuffered = true;
            }

            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                //vykresleni kruhu
                e.Graphics.DrawArc(Pens.Black, stredKruhu.X, stredKruhu.Y, radiusKruhu, radiusKruhu, 0, 360);
                //pripojka A
                e.Graphics.DrawLine(Pens.Black, A, A1);
                //B
                e.Graphics.DrawLine(Pens.Black, B, B1);
                //C
                e.Graphics.DrawLine(Pens.Black, C, C1);
                //odebrání auta
                cars.Remove(cars.FirstOrDefault(x => x.remove));
                //Auta
                foreach (var x in cars)
                {
                    Brush p = new SolidBrush(x.col);
                    e.Graphics.FillRectangle(p, x.pos.X, x.pos.Y, 11, 7);
                    e.Graphics.DrawString($"{x.ID}", new Font("Arial Black", 12), Brushes.Black,new RectangleF(x.pos.X, x.pos.Y, 31, 27) ,new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
                }
            }
          

            
            private void button1_Click_1(object sender, EventArgs e)
            {
                Console.WriteLine(@"Zvoleno " + comboBox1.SelectedItem + @"/ " + comboBox2.SelectedItem);
                List<PointF> path = new List<PointF>();
                //start
                int angle = 0;
                switch (comboBox1.SelectedItem)
                {
                    case PointSelect.A:
                        path.Add(A);
                        path.Add(A1);
                        angle = 270;
                        break;
                    case PointSelect.B:
                        path.Add(B);
                        path.Add(B1);
                        angle = 180;
                        break;
                    case PointSelect.C:
                        path.Add(C);
                        path.Add(C1);
                        break;
                    default:
                        break;
                }
                //destination
                switch (comboBox2.SelectedItem)
                {
                    case PointSelect.A:
                        path.Add(A1);
                        path.Add(A);
                        break;
                    case PointSelect.B:
                        path.Add(B1);
                        path.Add(B);
                        break;
                    case PointSelect.C:
                        path.Add(C1);
                        path.Add(C);
                        break;
                    default:
                        break;
                }
                cars.Add(new Car(path, Color.Blue, 5, angle,numOfCars));
                numOfCars++;
            }

            private void timer1_Tick_1(object sender, EventArgs e)
            {
                Invalidate();
            }

            private void Form1_Load_1(object sender, EventArgs e)
            {
                comboBox1.DataSource = Enum.GetValues(typeof(PointSelect));
                comboBox2.DataSource = Enum.GetValues(typeof(PointSelect));
                timer1.Interval = 20;
                timer1.Start();
            }
        }

        public class Car
        {
            public PointF startPoint;
            public PointF stopPoint;
            public List<PointF> path = new List<PointF>();
            public PointF pos;
            public double speed;
            public Color col;
            public bool mode = false;
            private bool pohybujemeSe = true;
            public bool remove = false;
            private int index = 0;
            private Thread th;
            int angleCircle = 0;
            public int ID = 0;
            public Car(List<PointF> pth, Color c, double spd, int angle,int numOfcars)
            {
                path = pth;
                startPoint = pth[index];
                pos = startPoint;
                stopPoint = pth[index + 1];
                col = c;
                speed = spd;
                angleCircle = angle;
                th = new Thread(Move);
                th.Start();
                ID = numOfcars;
            }

            public void Move()
            {
                while (remove == false)
                {
                    Thread.Sleep(20);
                    if (mode == false)
                    {
                        //porovnani bodu
                        if (Math.Sqrt(Math.Pow(pos.X - stopPoint.X, 2) + Math.Pow(pos.Y - stopPoint.Y, 2)) < speed)
                        {
                            //dojeli jsme
                            pohybujemeSe = false;
                            pos = stopPoint;
                            mode = true;
                            index++;
                            startPoint = stopPoint;
                            if (index + 1 >= path.Count)
                            {
                                remove = true;
                            }
                            else
                            {
                                stopPoint = path[index + 1];
                            }
                        }
                        if (pohybujemeSe == true)
                        {
                            //pohyb po lajně
                            var angle = Math.Atan2(stopPoint.Y - startPoint.Y, stopPoint.X - startPoint.X); //radius
                            pos.X += (float) (Math.Cos(angle) * speed);
                            pos.Y += (float) (Math.Sin(angle) * speed);
                        }
                    }
                    else
                    {
                        if (Math.Sqrt(Math.Pow(pos.X - stopPoint.X, 2) + Math.Pow(pos.Y - stopPoint.Y, 2)) < speed)
                        {
                            //dojeli jsme
                            pohybujemeSe = true;
                            pos = stopPoint;
                            mode = false;
                            index++;
                            startPoint = stopPoint;
                            if (index + 1 >= path.Count)
                            {
                                remove = true;
                            }
                            else
                            {
                                stopPoint = path[index + 1];
                            }
                        }
                        //circle move
                        angleCircle -= 1; //změna směru -= --- hodinové ručičky +=
                        double angleRad = angleCircle * Math.PI / 180;
                        var x = 200 + Math.Sin(angleRad) * 100;
                        var y = 200 + Math.Cos(angleRad) * 100;
                        pos.X = (float) x;
                        pos.Y = (float) y;
                    }
                }
            }
        }
    }


    • Označen jako odpověď Josef Zbořil úterý 8. května 2018 16:28
    úterý 8. května 2018 16:23

Všechny reakce

  • Zdravím, budeš muset si najít vzorečky pro sin a cos.
    úterý 8. května 2018 16:19
  • Stejný princip :) Celý zdroják :)

     public enum PointSelect
        {
            A,
            B,
            C
        }

        public partial class Form1 : Form
        {
            private Point A = new Point(0, 200);
            private Point B = new Point(200, 0);
            private Point C = new Point(200, 400);
            private Point A1 = new Point(100, 200);
            private Point B1 = new Point(200, 100);
            private Point C1 = new Point(200, 300);
            private Point stredKruhu = new Point(100, 100);
            private int radiusKruhu = 200;
            List<Car> cars = new List<Car>();
            private int numOfCars = 0;
            public Form1()
            {
                InitializeComponent();
                DoubleBuffered = true;
            }

            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                //vykresleni kruhu
                e.Graphics.DrawArc(Pens.Black, stredKruhu.X, stredKruhu.Y, radiusKruhu, radiusKruhu, 0, 360);
                //pripojka A
                e.Graphics.DrawLine(Pens.Black, A, A1);
                //B
                e.Graphics.DrawLine(Pens.Black, B, B1);
                //C
                e.Graphics.DrawLine(Pens.Black, C, C1);
                //odebrání auta
                cars.Remove(cars.FirstOrDefault(x => x.remove));
                //Auta
                foreach (var x in cars)
                {
                    Brush p = new SolidBrush(x.col);
                    e.Graphics.FillRectangle(p, x.pos.X, x.pos.Y, 11, 7);
                    e.Graphics.DrawString($"{x.ID}", new Font("Arial Black", 12), Brushes.Black,new RectangleF(x.pos.X, x.pos.Y, 31, 27) ,new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
                }
            }
          

            
            private void button1_Click_1(object sender, EventArgs e)
            {
                Console.WriteLine(@"Zvoleno " + comboBox1.SelectedItem + @"/ " + comboBox2.SelectedItem);
                List<PointF> path = new List<PointF>();
                //start
                int angle = 0;
                switch (comboBox1.SelectedItem)
                {
                    case PointSelect.A:
                        path.Add(A);
                        path.Add(A1);
                        angle = 270;
                        break;
                    case PointSelect.B:
                        path.Add(B);
                        path.Add(B1);
                        angle = 180;
                        break;
                    case PointSelect.C:
                        path.Add(C);
                        path.Add(C1);
                        break;
                    default:
                        break;
                }
                //destination
                switch (comboBox2.SelectedItem)
                {
                    case PointSelect.A:
                        path.Add(A1);
                        path.Add(A);
                        break;
                    case PointSelect.B:
                        path.Add(B1);
                        path.Add(B);
                        break;
                    case PointSelect.C:
                        path.Add(C1);
                        path.Add(C);
                        break;
                    default:
                        break;
                }
                cars.Add(new Car(path, Color.Blue, 5, angle,numOfCars));
                numOfCars++;
            }

            private void timer1_Tick_1(object sender, EventArgs e)
            {
                Invalidate();
            }

            private void Form1_Load_1(object sender, EventArgs e)
            {
                comboBox1.DataSource = Enum.GetValues(typeof(PointSelect));
                comboBox2.DataSource = Enum.GetValues(typeof(PointSelect));
                timer1.Interval = 20;
                timer1.Start();
            }
        }

        public class Car
        {
            public PointF startPoint;
            public PointF stopPoint;
            public List<PointF> path = new List<PointF>();
            public PointF pos;
            public double speed;
            public Color col;
            public bool mode = false;
            private bool pohybujemeSe = true;
            public bool remove = false;
            private int index = 0;
            private Thread th;
            int angleCircle = 0;
            public int ID = 0;
            public Car(List<PointF> pth, Color c, double spd, int angle,int numOfcars)
            {
                path = pth;
                startPoint = pth[index];
                pos = startPoint;
                stopPoint = pth[index + 1];
                col = c;
                speed = spd;
                angleCircle = angle;
                th = new Thread(Move);
                th.Start();
                ID = numOfcars;
            }

            public void Move()
            {
                while (remove == false)
                {
                    Thread.Sleep(20);
                    if (mode == false)
                    {
                        //porovnani bodu
                        if (Math.Sqrt(Math.Pow(pos.X - stopPoint.X, 2) + Math.Pow(pos.Y - stopPoint.Y, 2)) < speed)
                        {
                            //dojeli jsme
                            pohybujemeSe = false;
                            pos = stopPoint;
                            mode = true;
                            index++;
                            startPoint = stopPoint;
                            if (index + 1 >= path.Count)
                            {
                                remove = true;
                            }
                            else
                            {
                                stopPoint = path[index + 1];
                            }
                        }
                        if (pohybujemeSe == true)
                        {
                            //pohyb po lajně
                            var angle = Math.Atan2(stopPoint.Y - startPoint.Y, stopPoint.X - startPoint.X); //radius
                            pos.X += (float) (Math.Cos(angle) * speed);
                            pos.Y += (float) (Math.Sin(angle) * speed);
                        }
                    }
                    else
                    {
                        if (Math.Sqrt(Math.Pow(pos.X - stopPoint.X, 2) + Math.Pow(pos.Y - stopPoint.Y, 2)) < speed)
                        {
                            //dojeli jsme
                            pohybujemeSe = true;
                            pos = stopPoint;
                            mode = false;
                            index++;
                            startPoint = stopPoint;
                            if (index + 1 >= path.Count)
                            {
                                remove = true;
                            }
                            else
                            {
                                stopPoint = path[index + 1];
                            }
                        }
                        //circle move
                        angleCircle -= 1; //změna směru -= --- hodinové ručičky +=
                        double angleRad = angleCircle * Math.PI / 180;
                        var x = 200 + Math.Sin(angleRad) * 100;
                        var y = 200 + Math.Cos(angleRad) * 100;
                        pos.X = (float) x;
                        pos.Y = (float) y;
                    }
                }
            }
        }
    }


    • Označen jako odpověď Josef Zbořil úterý 8. května 2018 16:28
    úterý 8. května 2018 16:23