【问题标题】:Wpf StreamGeometry unexpected valuesWpf StreamGeometry 意外值
【发布时间】:2018-08-25 01:26:03
【问题描述】:

我画了一些这样的图表:

var geometry = new StreamGeometry();

using (var ctx = geometry.Open())
{
    ctx.BeginFigure(new Point(offset, MyCanvas.Height), false, false);

    for (var i = 0; i < interpolated.Count; i++)
    {
        var x = i * partWidth / interpolated.Count + offset;
        ctx.LineTo(new Point(x, MyCanvas.Height - interpolated[i]), true, false);
    }

    ctx.LineTo(new Point(offset + partWidth, MyCanvas.Height), true, false);
    ctx.LineTo(new Point(offset, MyCanvas.Height), true, false);

    geometry.FillRule = FillRule.EvenOdd;
    geometry.Freeze();

    var path = new Path
                {
                    Stroke = Brushes.Black,
                    StrokeThickness = 1,
                    Data = geometry,
                    Fill = Brushes.Black
                };
    MyCanvas.Children.Add(path);
}

interpolated[] 中我的所有值 = 0..40。

我的画布高度 = 50

这是我得到的:

我不明白,为什么有些点在线下,我画的像:

 var zeroLine = new Line
        {
            X1 = 0,
            X2 = 790,
            Y1 = MyCanvas.Height,
            Y2 = MyCanvas.Height,
            Stroke = Brushes.Coral,
            StrokeThickness = 1
        };
        MyCanvas.Children.Add(zeroLine);

如果 MyCanvas.Height 值大于我的数据值(这是肯定的),那么MyCanvas.Height - interpolated[i] 因为Y 应该总是小于橙色线,对吧?

据我了解,StreamGeometry 通过设计将这些部分绘制在给定点之外?可以预防吗?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    这是由于Path的StrokeLineJoin,默认为Miter

    改为Round

    var path = new Path
    {
        Stroke = Brushes.Black,
        StrokeThickness = 1,
        StrokeLineJoin = PenLineJoin.Round,
        Data = geometry
    };
    

    请注意,您也可以使用折线元素,而不是使用由许多单线组成的几何图形的路径。

    【讨论】:

    • 折线画起来会更快吗?在实际情况下,我需要绘制 14400 段。
    • 可能不会,但更容易创建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多