UWP Win2D:如何检查路径是否与矩形相交

时间:2019-05-23 23:47:43

标签: c# uwp geometry win2d

我需要一种超快速的方法来检查给定的Path是否与给定的Rectangle相交。

出于这个目的,我想到了这种方法,该方法“裁剪”给定矩形上的Path,并检查在该区域中是否绘制了任何东西。

    public static readonly CanvasDevice CanvasDev = CanvasDevice.GetSharedDevice();
    private static readonly CanvasRenderTarget s_offScreen = new CanvasRenderTarget(CanvasDev, 10, 10, 96);
    public static bool IsPathDrawnInsideRect(this CanvasGeometry geom, Vector2 offset, byte alphaThreshold)
    {
        if (geom == null)
            return false;

        using (CanvasDrawingSession ds = s_offScreen.CreateDrawingSession())
        {
            // do not forget clear buffer
            ds.Clear(Colors.Transparent);

            ds.DrawGeometry(geom, offset, Colors.Black);
        }

        byte[] bytes = s_offScreen.GetPixelBytes();
        return bytes.Any(c => c > alphaThreshold);
    }

该方法有效,并且非常准确(至少对我而言足够准确),但是不幸的是,语句s_offScreen.GetPixelBytes();有时最多需要10毫秒才能执行,因此我需要完整的方法来保持1毫秒。

有没有一种更快的方法来检查给定的CanvasRenderTarget是否包含ALPHA通道高于指定阈值的任何像素?

或者,如何配置CanvasRenderTarget(以DirectXPixelFormatCanvasAlphaMode而言)以在这种情况下获得最高性能?

谢谢!

1 个答案:

答案 0 :(得分:0)

在UWP中,有a method that checks if two geometries intersect

if (CanvasGeometry.CreateRectangle(CanvasDevice.GetSharedDevice(), rectangle).CompareWith(your_geometry) == CanvasGeometryRelation.Overlap)
{
    //geometries intersect
}

请注意,该方法返回四个值之一。除了重叠,它们可以是不相交的,但是您的几何也可以包含在矩形中,或者矩形可以包含您的几何。