正确使用此[JointType jointType]

时间:2014-04-07 22:09:37

标签: c# this

我已经在这些课上工作了一段时间了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Kinect;
using System.Threading.Tasks;
using System.Windows.Media.Media3D;

namespace KinectFysioterapi
{
    public class BoneVector
    {
        public Vector3D vector;
        private double x;
        private double y;
        private double z;

        #region Constructor
        public BoneVector(Joint startJoint, Joint endJoint)
        {
            if (!(startJoint.Equals(endJoint)))
            {
                x = endJoint.Position.X - startJoint.Position.X;
                y = endJoint.Position.Y - startJoint.Position.Y;
                z = endJoint.Position.Z - startJoint.Position.Z;
                vector = new Vector3D(x, y, z);
            }
        }
        #endregion

    }
    public class SkeletonVectorCollection : Skeleton
    {
        public SkeletonVectorCollection(Skeleton input)
        {

            foreach (BoneOrientation orientation in input.BoneOrientations)
            {
                this[orientation.EndJoint] = new BoneVector(input.Joints[orientation.StartJoint], input.Joints[orientation.EndJoint]);   
            }
        }


        //Not sure how to do this correctly
        public BoneVector this[JointType jointType] 
        {
            get
            {
                return this[jointType];
            }
            protected set
            {
                this[jointType] = value;
            }
        }
    }
}

我遇到了很大的问题,让最后一部分没有问题。

我正在寻找的是输入一个kinect骨架并获得一个新的骨架,其中包含关节之间某些已定义向量的附加信息。

我的目标是能够做到以下几点:

SkeletonVectorCollection collection = new SkeletonVectorCollection(skeleton);
skeleton[Jointtype.Head].vector.x.ToString();

我非常不确定如何正确使用此[JointType jointType]。

1 个答案:

答案 0 :(得分:0)

根据定义,SkeletonVectorCollection是递归的,因为this[JointType]实现没有支持属性并且正在尝试存储到自身。如果您不需要/想要继承Skeleton,则可以切换到Dictionary并免费获得实施。

public class SkeletonVectorCollection : Dictionary<JointType, BoneVector>
{
    public SkeletonVectorCollection(Skeleton input)
    {
        foreach (BoneOrientation orientation in input.BoneOrientations)
        {
            this[orientation.EndJoint] = new BoneVector(input.Joints[orientation.StartJoint], input.Joints[orientation.EndJoint]);   
        }
    }
}

如果你必须从Skeleton继承,那么你需要提供一个带有某种存储的实现,这里是一个在内部使用字典的版本。

public class SkeletonVectorCollection : Skeleton
{
    private Dictionary<JointType, BoneVector> _boneVectors = new Dictionary<JointType, BoneVector>();

    public SkeletonVectorCollection(Skeleton input)
    {
        foreach (BoneOrientation orientation in input.BoneOrientations)
        {
            this[orientation.EndJoint] = new BoneVector(input.Joints[orientation.StartJoint], input.Joints[orientation.EndJoint]);   
        }
    }

    public BoneVector this[JointType jointType] 
    {
        get
        {
            return _boneVectors[jointType];
        }
        protected set
        {
            _boneVectors[jointType] = value;
        }
    }
}