1

グラフィックには C# を使用しています。そして今、私は PointF の null を返したい

    /// <summary>
    /// Project the point according to camera position.
    /// </summary>
    /// <param name="p">Point position, in WC</param>
    /// <returns>pixel position</returns>
    public PointF Project(MCvPoint3D32f p)
    {
        //return new PointF(p.x, p.y);
        // Extend p
        Matrix<double> p_ex = new Matrix<double>(3, 1);
        p_ex[0, 0] = p.x;
        p_ex[1, 0] = p.y;
        p_ex[2, 0] = p.z;

        var rst = HomographMatrix * p_ex;
        rst[0, 0] = rst[0,0] / rst[2, 0] * focalLength * scale;
        rst[1, 0] = rst[1, 0] / rst[2, 0] * focalLength * scale;

        return new PointF((float)rst[0, 0], (float)rst[1, 0]);
    }

ここで、ポイントがカメラの視野外にある場合、そのポイントに「null」を返したいと考えています。しかし、実際には PointF は「nullable」ではないため、ポイントの「null」を返す簡単な方法はありますか?

ネイティブの PointF を継承したくありません。

4

3 に答える 3

5

いくつかの点で、これは要件によって異なります。たとえば、多くのポイントを格納する必要がある場合 (スペースが重要な要素です)、ある種のセンチネル値を使用できます。おそらく次のようになります。

static readonly PointF NilPoint = new PointF(float.NaN, float.NaN);

次に、おそらくヘルパー メソッドを使用して、そのランタイムを確認します。

public static bool IsNil(this PointF value)
{
    return float.IsNaN(value.X) || float.IsNaN(value.Y);
}

だからあなたはただチェックすることができます:

if(!point.IsNil()) {
    // etc   
}

ただし、より簡単なオプション (わずかなスペースのオーバーヘッドを伴う) は、単に使用することNullable<T>です。つまり、

PointF? pt1 = null; // fine
PointF? pt2 = new PointF(123,456); // also fine
于 2013-06-03T07:13:36.530 に答える
2

System.Nullableを使用します。

public PointF? Project(MCvPoint3D32f p)
{ 
   // other code here

   if (condition)
     return null;
}
于 2013-06-03T06:52:18.807 に答える
-2

System.drawing.PointF.Empty を使用するだけです

于 2013-06-03T06:53:01.467 に答える