c# null for System.drawing.PoinF

本文关键字:drawing PoinF System for null | 更新日期: 2023-09-27 18:16:38

我用c#做图形。现在我想为PointF

返回一个空值
    /// <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]);
    }

这里,如果点在相机的FoV之外,我想为该点返回一个'null'。但实际上PointF不是"空的",所以有一个直接的方法来返回一个"空"点吗?

我不想继承原生的PointF

c# null for System.drawing.PoinF

在某些方面,这取决于您的需求。例如,如果您需要存储大量的点(因此空间是一个因素),您可以使用某种哨兵值—例如:

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

然后检查该运行时,可能使用helper方法:

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

使用系统。可以为空:

public PointF? Project(MCvPoint3D32f p)
{ 
   // other code here
   if (condition)
     return null;
}

直接使用System.drawing.PointF.Empty