如何从struct数组转换为Point3D数组?

时间:2009-05-26 07:09:49

标签: types

我想将一个struct数组转换为Point3D数组。 代码段如下:

类Mymesh {     public MeshGeometry3D Mesh3D //属性tanimlaniyor     {         get {return GetMesh3D(); }     }

public struct mystruct
{
    public int m_i;
    public int m_j;
    public int m_k;

    public mystruct(int i, int j, int k)
    {
            m_i = i;
            m_j = j;
            m_i = k;
    }
}

private mystruct[] mypts = 
{
    new mystruct(20 , 7 , 7),   
    .
    .
    new mystruct(23 , 5 , 7)     
};

 public MeshGeometry3D GetMesh3D()
 {
   mesh.Positions.Add(mypts(1);   *// The error is given at just this line.*
   .
   .
   mesh.Positions.Add(mypts(50);
  }
 .
 .

}

此代码产生错误消息“无法从'Mymesh.mystruct'转换为'System.Windows.Media.Media3D.Point3D'。

如何克服此错误?

提前致谢。

Onder YILMAZ

4 个答案:

答案 0 :(得分:1)

为了能够构建一个Point3D,你需要使用它的一个构造函数 从this documentation开始,Point3D似乎有一个构造函数,它采用3个坐标,所以你可以改变它:

mesh.Positions.Add(mypts[1]);

到此:

mesh.Positions.Add(mypts[1].m_i, mypts[1].m_j, mypts[1].m_k);

您可能还需要注意,此代码段中存在大量语法错误。例如,使用[]而非()对数组建立索引,当您打开括号时,应始终关闭它。

答案 1 :(得分:0)

有多种方法可以做到这一点:

  1. 不要使用自定义结构,使用Point3D开头
  2. 为您的结构定义显式或隐式转换,以将其转换/转换为Point3D
  3. 将ToPoint3D方法添加到结构
  4. 只需使用i,j和k结构成员调用.Add方法
  5. 我将在这里展示第三个选项:

    public Point3D ToPoint3D()
    {
        return new Point3D(i, j, k);
    }
    

    然后你只需在添加时调用该方法:

    public MeshGeometry3D GetMesh3D()
    {
        mesh.Positions.Add(mypts[1].ToPoint3D());
    

    另请注意,您应该在此处使用循环:

    foreach (mystruct p in mypts)
        mesh.Positions.Add(p.ToPoint3D());
    

    另请注意以下事项:

    • 您应该尽量避免使用名为i,j和k的结构成员,除非您指定内部循环寄存器。请尝试使用X,Y和Z,因为它们通常被理解为坐标值
    • C#中的数组从索引0开始,而不是1
    • 使用[]索引数组元素,而不是()
    • 您在代码中遗漏了一些结尾括号

    为什么我提到这个?因为对我来说很明显,你发布的代码不是你试图编译或执行的代码。永远不要试图通过重写代码来简化代码。相反,制作一个简短但完整,可编译和可测试的程序,并将代码发布到该程序。让我们担心过载(当然,不要发布1000行,但要将其缩短到10-20行)。

答案 2 :(得分:0)

感谢大家和对不起,因为我的代码片段很少且错误。 原始代码很长。我不能写所有这些。 原始代码没有任何语法错误。

再次感谢。

Oner YILMAZ

答案 3 :(得分:0)

public Point3D MystructToPoint3D(mystruct point)
{
    return new Point3D(point.m_i, point.m_j, point.m_k);
}

如果你想透明地使用你的“mystruct”就好像它是一个Point3D(例如你想修改方法中的坐标),你必须写一个adapter

struct Point3DAdapter : Point3D
{
    internal mystruct _point;

    public Point3DAdapter(ref mystruct point)
    {
        this._point = point;
    }

    public override double X
    {
        get { return _point.m_i; }
        set { _point.m_i = value; }
    }

    // same for Y and Z
}

我不得不说我没有测试这段代码而且我不太确定我是否可以传递一个struct byref或覆盖struct方法.. :)