Nejčastěji odpovídající uživatel
Analogové hodiny

Dotaz
-
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
Všechny reakce
-
Zdravím, budeš muset si najít vzorečky pro sin a cos.
- Upravený Miroslav Kotlár úterý 8. května 2018 16:31
-
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