using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; namespace SalsaModel { public partial class View2D : UserControl { public View2D() { InitializeComponent(); } public List Models = new List(); protected override void OnClientSizeChanged(EventArgs e) { this.Invalidate(); } protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; Pen p = new Pen(Color.Blue); foreach (PositionModel model in Models) { DrawModel(g, p, model); } } private void DrawModel(Graphics g, Pen p, PositionModel model) { JoinPoints(g, p, model.RLeg.Foot, model.RLeg.Knee); JoinPoints(g, p, model.RLeg.Knee, model.RLeg.Hip); JoinPoints(g, p, model.RLeg.Hip, model.LLeg.Hip); JoinPoints(g, p, model.RArm.Shoulder, model.LArm.Shoulder); JoinPoints(g, p, model.LLeg.Foot, model.LLeg.Knee); JoinPoints(g, p, model.LLeg.Knee, model.LLeg.Hip); if (model.IsGirl) { JoinPoints(g, p, model.RLeg.Hip, model.LArm.Shoulder); JoinPoints(g, p, model.LLeg.Hip, model.RArm.Shoulder); } else { JoinPoints(g, p, model.RLeg.Hip, model.RArm.Shoulder); JoinPoints(g, p, model.LLeg.Hip, model.LArm.Shoulder); } DrawBall(g, p, model.RLeg.Foot); DrawBall(g, p, model.RLeg.Knee); DrawBall(g, p, model.RLeg.Hip); DrawBall(g, p, model.RArm.Shoulder); DrawBall(g, p, model.LLeg.Foot); DrawBall(g, p, model.LLeg.Knee); DrawBall(g, p, model.LLeg.Hip); DrawBall(g, p, model.LArm.Shoulder); JoinPoints(g, p, model.Neck, model.Head); { Point center = Map(model.Neck.HalfWayTo(model.Head)); int bigsize = (int)(Map(model.Neck).Y - Map(model.Head).Y); int size = (int)(bigsize * 0.8); center.Offset(-size / 2, -bigsize / 2); g.DrawEllipse(p, new Rectangle(center, new Size(size, size))); } } private void JoinPoints(Graphics g, Pen p, Location a, Location b) { g.DrawLine(p, Map(a), Map(b)); } private void DrawBall(Graphics g, Pen p, Location a) { int radius = 4; Point center = Map(a); center.Offset(-radius, -radius); g.DrawEllipse(p, new Rectangle(center, new Size(radius * 2, radius * 2))); } public enum ProjectionType { Front, Side } public ProjectionType Projection = ProjectionType.Front; private Point Map(Location loc) { double scale = 1; int height = ClientRectangle.Height; int border = 10; switch (Projection) { case ProjectionType.Front: return new Point((int)(loc.X * scale) + border, height - (int)(loc.Z * scale) - border); case ProjectionType.Side: return new Point((int)(loc.Y * scale) + border, height - (int)(loc.Z * scale) - border); default: throw new Exception("Bad setting"); } } } }