2014-11-13 6 views
1

Я ищу, чтобы показать скелет по эллипсу, а не по линии. У меня есть две точки с координатами для X и Y. Когда я хочу, чтобы нарисовать эллипс мне нужноDrawEllipse из двух совместных (координаты точки, или скорее X и Y)

public abstract void DrawEllipse(
Brush brush, 
Pen pen, 
Point center, 
double radiusX, 
double radiusY 

)

так что я пытался с этим кодом, но есть какая-то ошибка (не знаю radiusY):

double centerX = (jointPoints[jointType0].X + jointPoints[jointType1].X)/2; 
     double centerY = (jointPoints[jointType0].Y + jointPoints[jointType1].Y)/2; 
     double radiusX =Math.Sqrt((Math.Pow((jointPoints[jointType1].X - jointPoints[jointType0].X), 2)) + (Math.Pow((jointPoints[jointType1].Y - jointPoints[jointType0].Y), 2))); 
     drawingContext.DrawEllipse(null, drawPen, new Point(centerX, centerY), radiusX, radiusX/5); 

Может ли кто-нибудь мне помочь?

enter image description here

private void DrawBone(IReadOnlyDictionary<JointType, Joint> joints, IDictionary<JointType, Point> jointPoints, JointType jointType0, JointType jointType1, DrawingContext drawingContext, Pen drawingPen,List<JointType> badJoint) 
    { 
     Joint joint0 = joints[jointType0]; 
     Joint joint1 = joints[jointType1]; 

     // If we can't find either of these joints, exit 
     if (joint0.TrackingState == TrackingState.NotTracked || 
      joint1.TrackingState == TrackingState.NotTracked) 
     { 
      return; 
     } 



     // We assume all drawn bones are inferred unless BOTH joints are tracked 
     Pen drawPen = this.inferredBonePen; 

     if ((joint0.TrackingState == TrackingState.Tracked) && (joint1.TrackingState == TrackingState.Tracked)) 
     { 
      drawPen = drawingPen; 
     } 
     //If a bone makes parts of an one bad angle respect reference angle 
     if (badJoint.Contains(jointType0) && badJoint.Contains(jointType0)) 
      drawPen = new Pen(Brushes.Red, 6); 
     drawingContext.DrawLine(drawPen, jointPoints[jointType0], jointPoints[jointType1]); 
+0

Какое сообщение об ошибке _exact_ вы получаете? См. Http://stackoverflow.com/help/mcve и http://stackoverflow.com/help/how-to-ask –

+0

У меня нет ошибки, но я не показываю скелет, как хотелось бы. Эллипс не проходит через точки, и я не знаю, как задать радиус Y. Выше я разместил один экран Я думаю, что это сложнее, потому что x и y меняются при перемещении кости – luca

+0

Вы можете сделать виртуальную линию между точками, а затем создать две 90-градусные поворотные меньшие виртуальные линии (например, 15% от общего количества line) в верхней и нижней частях большой виртуальной линии. Теперь просто получите поворот линии (Math.atan2) и нарисуйте повернутый эллипс. http://i.imgur.com/XybEThO.png – WebFreak001

ответ

0

Вы не можете (только) использовать метод DrawEllipse, потому что всегда будет рисовать горизонтальное или вертикальное elipses.

Используйте этот код, чтобы осуществить вращение: https://stackoverflow.com/a/5298921/1974021 и написать метод, который принимает следующие входные параметры:

  1. Focalpoint1
  2. FocalPoint2
  3. Радиус

В эллипс может быть описываемых как фокальными точками, так и (объединенным) радиусом. Если вы используете фокальные точки, эллипсис будет перекрываться в суставах, чтобы создать круговой рисунок в каждом суставе. Это о том, чего вы хотите? (Это еще проще, если вы только хотите, чтобы они касались в суставе)

Хорошо, это на самом деле не фокус, а центр соприкасающегося круга. Попробуйте этот метод:

private static void DrawEllipse(Pen pen, Graphics g, PointF pointA, PointF pointB, float radius) 
{ 
    var center = new PointF((pointA.X + pointB.X)/2, (pointA.Y + pointB.Y)/2); 
    var distance = GetDistance(pointA, pointB); 

    // The axis are calculated so that the center of the osculating circles are conincident with the points and has the given radius. 
    var a = radius + distance/2; // Semi-major axis 
    var b = (float)Math.Sqrt(radius * a); // Semi-minor axis 


    // Angle in degrees 
    float angle = (float)(Math.Atan2(pointA.Y - pointB.Y, pointA.X - pointB.X) * 180/Math.PI); 
    using (Matrix rotate = new Matrix()) 
    { 
     GraphicsContainer container = g.BeginContainer(); 
     rotate.RotateAt(angle, center); 
     g.Transform = rotate; 
     g.DrawEllipse(pen, center.X-a, center.Y-b, 2 * a, 2 * b); 
     g.EndContainer(container); 
    } 
} 

private static float GetDistance(PointF a, PointF b) 
{ 
    var dx = a.X - b.X; 
    var dy = a.Y - b.Y; 
    return (float)Math.Sqrt(dx * dx + dy * dy); 
} 
+0

спасибо, я бы заменил линию скелета эллипсом. я пытался использовать ваш код, но я вызываю его в код выше, и у меня нет ваших параметров – luca