2

我正在将 Python 脚本转换为 C#,我需要一些帮助。我真的没有任何Python经验。这些类型的数组对我来说是全新的。

我在倒数第二行var posVec = dSorted[0][1];以及最后一行遇到问题:return posVec;.

的实际变量类型是var posVec什么?

我也在尝试返回posVec,它应该是 Vector3d 但我收到了这个错误:

无法将类型“double”隐式转换为“Rhino.Geometry.Vector3d”

我究竟做错了什么?谢谢!

Python:

posVec = dSorted[0][1]
return posVec

完整的 Python 方法:

def getDirection(self):
    #find a new vector that is at a 90 degree angle

    #define dictionary
    d = {}
    #create an list of possible 90 degree vectors
    arrPts = [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0)]
    vec = self.vec
    vec = rs.VectorUnitize(vec)

    #find the distance between the self vec
    #position and one of the 4 90 degree vectors
    #create a dictionary that matches the distance with the 90 degree vector
    for i in range(4):
        dist = rs.Distance(vec, arrPts[i])
        d[dist] = arrPts[i]
    #sort the dictionary.  This function converts it to an array
    #sort by the distances, "value"/item 0
    dSorted = sorted(d.items(), key=lambda value: value[0])

    #select the second item in the array which is one of the 90 degree vectors
    posVec = dSorted[0][1]
    return posVec

到目前为止,我已经重写了完整的 C# 方法:

    // find a new vector that is at a 90 degree angle
    public Vector3d GetDirection()
    {
        // define dictionary
        Dictionary<double, Vector3d> d = new Dictionary<double, Vector3d>();

        Vector3d[] arrPts = new Vector3d[] {
            new Vector3d(1, 0, 0),
            new Vector3d(-1, 0, 0),
            new Vector3d(0, 1, 0),
            new Vector3d(0, -1, 0),
            new Vector3d(0, 0, 1),
            new Vector3d(0, 0, -1) };

        _vec = Vec;
        _vec.Unitize();

        // find the distance between the self vec position and one of the 6 90 degree vectors
        // create a dictionary that matches the distance with the 90 degree vector

        for (int i = 0; i < arrPts.Length; i++)
        {
            double dist = Math.Sqrt(
                ((_vec.X - arrPts[i].X) * (_vec.X - arrPts[i].X)) +
                ((_vec.Y - arrPts[i].Y) * (_vec.Y - arrPts[i].Y)) +
                ((_vec.Z - arrPts[i].Z) * (_vec.Z - arrPts[i].Z)));

            d.Add(dist, arrPts[i]);
        }

        Vector3d[] dSorted = d.Values.ToArray();
        var posVec = dSorted[0][1];
        return posVec;
    }
4

1 回答 1

0

我参加聚会迟到了,但无论如何,如果它将来为某人服务......

Vector3d(dSorted)您正在根据您的值创建一个数组dictionary(d),但您尝试将其转换var posVec为应该是Vector3dusing的数组dSorted[0][1]。这是锯齿状数组的表示法,但您声明dSortedVector3d.

因此,要访问其中一项,只需使用dSorted[0].

于 2019-03-15T15:48:12.137 回答