贝塞尔曲线与指定椭圆相交时如何检测?

麦克风

我有一个自定义控件,该控件呈现从左上角到右下角的贝塞尔曲线。我想修改命中测试行为,以便将控件悬停在贝塞尔曲线之上或附近,而只是“命中”,而FillContainsWithDetail不会返回预期的结果。

我想念什么?

这是派生的示例类:

public class BezierControl : FrameworkElement
{
    protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
    {
        if (_geometry == null) return null;
        
        var p = hitTestParameters.HitPoint;

        EllipseGeometry expandedHitTestArea = new EllipseGeometry(p, 10.0, 10.0);
        
        var intersection = expandedHitTestArea.FillContainsWithDetail(_geometry);
        if (intersection > IntersectionDetail.Empty)
        {
            return new PointHitTestResult(this, hitTestParameters.HitPoint);
        }

        return null;
    }

    private StreamGeometry _geometry;

    private StreamGeometry getGeometry()
    {
        var result = new StreamGeometry();

         
            using (var context = result.Open())
            {
                var start = new Point(0, 0);
                var startCp = new Point(10, 0);
                var end = new Point(this.ActualWidth, this.ActualHeight);
                var endCp = new Point(this.ActualWidth - 10, this.ActualHeight);

                context.BeginFigure(start, false, false);
                context.BezierTo(startCp, endCp, end, true, false);
            }
     

        result.Freeze();

        return result;
    }
    
    
    protected override void OnRender(DrawingContext dc)
    {
        base.OnRender(dc);

        if (_geometry == null) _geometry = getGeometry();

        dc.DrawGeometry(null, _pen, _geometry);
    }

    private Pen _pen = new Pen(Brushes.Red, 1.0);

}

编辑:下面批准的答案很好,但这也使我想到了另一种选择-或向我展示了为什么我的解决方案失败了:我正在创建像这样的几何体:

context.BeginFigure(bezier.Start, false, false);

第一个bool参数称为isFilled将此设置为true可以使_geometry之间相交expandedHitTestArea

在注意到这一点之前,我在下面实现了可接受的答案,并widenedGeometry出于性能原因决定懒惰地创建它现在哪个让我感到困惑:从性能的角度来看,哪种方法更好?还是在这种情况下可以忽略不计,因为几何无论如何都是便宜的?

克莱门斯

您不需要那个EllipseGeometry。只需检查命中点是否在原始几何图形加宽路径几何图形内(当然,创建时也可以创建一次_geometry):

protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
    if (_geometry != null)
    {
        var widenedGeometry = _geometry.GetWidenedPathGeometry(new Pen(null, 20));

        if (widenedGeometry.FillContains(hitTestParameters.HitPoint))
        {
            return new PointHitTestResult(this, hitTestParameters.HitPoint);
        }
    }

    return null;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何生成“厚”贝塞尔曲线?

来自分类Dev

如何使精灵遵循贝塞尔曲线

来自分类Dev

如何从图像模拟贝塞尔曲线?

来自分类Dev

检测贝塞尔曲线路径内的敲击

来自分类Dev

用于点检测的宽贝塞尔曲线路径

来自分类Dev

贝塞尔曲线数学

来自分类Dev

曲线(贝塞尔曲线)渐变

来自分类Dev

如何编码n阶贝塞尔曲线

来自分类Dev

如何平滑三次贝塞尔曲线过渡

来自分类Dev

如何在Android中绘制贝塞尔曲线

来自分类Dev

如何找到贝塞尔曲线的控制点

来自分类Dev

如何在贝塞尔曲线中添加渐变?

来自分类Dev

如何设置贝塞尔曲线的控制点以折线?

来自分类Dev

如何启发式制作平行贝塞尔曲线

来自分类Dev

如何使用AS3设置贝塞尔曲线的动画?

来自分类Dev

如何找到贝塞尔曲线的控制点

来自分类Dev

如何使贝塞尔曲线中的线接点平滑?

来自分类Dev

如何在UIView中绘制贝塞尔曲线

来自分类Dev

如何绘制贝塞尔曲线 C#

来自分类Dev

通过示例了解如何绘制 SVG 贝塞尔曲线

来自分类Dev

如何将二次贝塞尔曲线代码转换为三次贝塞尔曲线?

来自分类Dev

检查闭合的三次方贝塞尔曲线路径是否在椭圆内部

来自分类Dev

相交线与二次贝塞尔曲线三角形

来自分类Dev

绘制SVG贝塞尔曲线

来自分类Dev

贝塞尔曲线的均匀离散

来自分类Dev

绘制贝塞尔曲线的半圆弧

来自分类Dev

在Android的贝塞尔曲线外换行

来自分类Dev

使用Firemonkey绘制贝塞尔曲线

来自分类Dev

用Java绘制贝塞尔曲线