/// <summary> /// Vykreslení limitních čar pro otáčení nohy /// </summary> /// <param name="g">grafika</param> /// <param name="mid">střed otáčení nohy</param> /// <param name="rotation">rotace ve stupnich</param> private void legLimitLinePaint(Graphics g, Point mid, int rotation) { Point startPoint = MathLibrary.getPointOnLine(mid.X, mid.Y, rotation, baseWidth / 12); Point endPoint = MathLibrary.getPointOnLine(mid.X, mid.Y, rotation, baseWidth / 2); Pen pen = new Pen(Color.Black, 2); pen.DashStyle = DashStyle.Dot; g.DrawLine(pen, startPoint, endPoint); }
/// <summary> /// Callback pro změnu stavu páčky gamepadu pro přímý pohyb /// </summary> /// <param name="x">x souřadnice joysticku od -100 do 100</param> /// <param name="y">y souřadnice joysticku od -100 do 100</param> private void joystickDirectMoveChanged(int x, int y) { Point corectedPoint = MathLibrary.convertPointToCircle(x, y, 0, 0, 101); moveRobot(corectedPoint.X, corectedPoint.Y); if (!(joystick is MainWindow)) { controllView.moveDirectMoveJoystick(corectedPoint.X, corectedPoint.Y); } }
/// <summary> /// Vykreslení konce šipky kol znázorňující pohyb /// </summary> /// <param name="g">grafika</param> /// <param name="mid">střed kola</param> /// <param name="rotation">rotace kola ve stupnich</param> /// <param name="circleWidth">průměr kola</param> /// <param name="speed">rychlost pohybu kola</param> private void endOfArrowPaint(Graphics g, Point mid, int rotation, int circleWidth, int speed) { Point endPointArrow = MathLibrary.getPointOnLine(mid.X, mid.Y, rotation, circleWidth * 3 + (speed / 5) + 4 - 20); Point arrowLeftPoint = MathLibrary.getPointOnLine(mid.X, mid.Y, rotation - 15, circleWidth * 2 + (speed / 5) - 20); Point arrowRightPoint = MathLibrary.getPointOnLine(mid.X, mid.Y, rotation + 15, circleWidth * 2 + (speed / 5) - 20); Point[] triangl = new Point[3]; triangl[0] = endPointArrow; triangl[1] = arrowLeftPoint; triangl[2] = arrowRightPoint; g.FillPolygon(Brushes.Orange, triangl); }
private void joystickMouseMoveHandler(MouseEventArgs e, Point location, PictureBox box, Action <int, int> stickObserver) { if (MathLibrary.isPointInCircle(e.X, e.Y, joystickR, joystickR, joystickR)) { location = e.Location; box.Invalidate(); if (enabledStick) { stickObserver((int)Math.Floor((e.X - joystickR) / ((double)joystickR / 100)), (int)Math.Floor((e.Y - joystickR) / ((double)joystickR / 100))); } } else { Cursor.Position = box.PointToScreen(MathLibrary.convertPointToCircle(e.X, e.Y, joystickR, joystickR, joystickR - 2)); } }
private void panelForJoystick_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (MathLibrary.isPointInCircle(e.X, e.Y, joystickR, joystickR, joystickR)) { Cursor.Hide(); if (sender.Equals(panelForDirectMoveJoystick)) { joystickMouseDownHandler(e, stickDirectMoveLocation, panelForDirectMoveJoystick, stickDirectMoveObserver); } else { joystickMouseDownHandler(e, stickMoveLocation, panelForMoveJoystick, stickMoveObserver); } } } }
/// <summary> /// Vykreslení šipky kol znázorňující pohyb /// </summary> /// <param name="g">grafika</param> /// <param name="mid">střed kola</param> /// <param name="rotation">rotace kola ve stupnich</param> /// <param name="circleWidth">průměr kola</param> /// <param name="speed">rychlost pohybu kola</param> /// <param name="front">příznak zda se jedná o šipku pro pohyb dopředu</param> private void arrowPaint(Graphics g, Point mid, int rotation, int circleWidth, int speed, bool front) { Color color = Color.Black; if (speed > 0) { color = Color.Orange; endOfArrowPaint(g, mid, rotation, circleWidth, speed); } else if (front) { color = Color.Red; } Point startPoint = MathLibrary.getPointOnLine(mid.X, mid.Y, rotation, circleWidth - 1); Point endPoint = MathLibrary.getPointOnLine(mid.X, mid.Y, rotation, circleWidth * 3 + (speed / 5) - 20); g.DrawLine(new Pen(color, 4), startPoint, endPoint); }
/// <summary> /// Pohne s robotem v daném rádiusu /// </summary> /// <param name="x">x souřadnice joysticku od -100 do 100</param> /// <param name="y">y souřadnice joysticku od -100 do 100</param> private void moveRobotInRadius(int x, int y) { double radiusCircleDistance = x; if (radiusCircleDistance > 5 || radiusCircleDistance < -5) { radiusCircleDistance = MathLibrary.changeScaleLog(radiusCircleDistance, 0, Math.Sign(radiusCircleDistance) * 100, Math.Sign(radiusCircleDistance) * 2000, Math.Sign(radiusCircleDistance) * 60); } else { radiusCircleDistance = 99999; } double speed = MathLibrary.getPointsDistance(0, 0, x, y); if (y > 0) { speed = -speed; } robot.moveInRadius(radiusCircleDistance, speed); }
/// <summary> /// Vykreslení celého nohy robota /// </summary> /// <param name="e">Paint event</param> /// <param name="Z">zdvih</param> /// <param name="ZK">rotace nohy</param> /// <param name="R">rotace kola</param> /// <param name="P">rychlost kola</param> /// <param name="xC">korelace umístění na x souřadnici (-1,1)</param> /// <param name="yC">korelace umístění na y souřadnici (-1,1)</param> /// <param name="rC">korelace otočení nohy ve stupních</param> private void legPaint(PaintEventArgs e, int Z, int ZK, int R, int P, int xC, int yC, int rC) { var g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias; Pen pen = new Pen(Color.LightSlateGray, 8 + ((-1) * Z / 10)); Point firstPoint = new Point(canvasMid.X + ((baseWidth / 2) * xC), canvasMid.Y + ((baseWidth / 2) * yC)); Point secondPoint = MathLibrary.getPointOnLine(canvasMid.X + ((baseWidth / 2) * xC), canvasMid.Y + ((baseWidth / 2) * yC), ZK + rC, baseWidth); g.DrawLine(pen, firstPoint, secondPoint); bool reverse = false; if (xC * yC > 0) { reverse = true; } wheelPaint(g, secondPoint, ZK + rC - R + 93, P, reverse); legLimitLinePaint(g, firstPoint, rC - 45); legLimitLinePaint(g, firstPoint, rC + 45); wheelLimitLinePaint(g, secondPoint, ZK + rC - 180); wheelLimitLinePaint(g, secondPoint, ZK + rC - xC * yC * 90); }
/// <summary> /// Pohne s robotem směrem a rychlostí podle dané polohy joysticku /// </summary> /// <param name="x">x souřadnice od -100 do 100</param> /// <param name="y">y souřadnice od -100 do 100</param> private void moveRobot(int x, int y) { int angle = (int)MathLibrary.getAngle(0, 0, 100, 0, x, y); robot.move(angle, (int)MathLibrary.getPointsDistance(0, 0, x, y)); }