DrawEllipse из двух суставов (точка, а точнее координаты X и Y)

1

Я ищу, чтобы показать скелет по эллипсу, а не по линии. У меня есть две точки с координатами для 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);

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

Изображение 174551

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
    Какое именно сообщение об ошибке вы получаете? См. Stackoverflow.com/help/mcve и stackoverflow.com/help/how-to-ask
  • 0
    У меня нет ошибки, но я не показываю скелет так, как хотел бы. Эллипс не проходит через точки, и я не знаю, как установить радиус Y. Выше я выкладываю один экран, я думаю, что он более сложный, потому что х и у меняются при перемещении кости
Показать ещё 2 комментария
Теги:
kinect
skeleton-code
ellipse

1 ответ

0

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

Используйте этот код для реализации вращения: qaru.site/questions/1798429/... и напишите метод, который принимает следующие входные параметры:

  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
    спасибо, я бы заменил линию скелета эллипсом. Я пытался использовать ваш код, но я вызываю его в коде выше, и у меня нет ваших параметров

Ещё вопросы

Сообщество Overcoder
Наверх
Меню