如何在 C# WPF 中使用 Oxyplot 绘制给定旋转角度的椭圆?

问题描述 投票:0回答:2

OxyPlot是.NET的跨平台绘图库,制作绘图非常方便,

现在这里有一种情况,我必须为 XY 散点图绘制一个 95% 置信度的椭圆。

Oxyplot 提供以下注释:-

此处给出的椭圆注释(OxyPlot.Annotations)仅给出以下属性来添加椭圆-

我们这里没有任何旋转属性或方法,IRender 提供了几种绘制方法来重写,但这些方法都没有双角度旋转参数等。 文档都没有提供任何直接的解决方案:-

那么如何画这个:-

*我在一项作业中遇到了这个问题,并在经过以下论坛讨论以获取有关如何生成此类椭圆的提示后提出了解决方案。

  1. https://github.com/oxyplot/oxyplot/issues/268
  2. https://oxyplot.userecho.com/en/communities/1/topics/598-ellipse-annotation-rotation

如果其他人有,请添加更多解决方案:-

c# wpf annotations oxyplot
2个回答
1
投票

基于共享的链接(在 Quest 中)。这里最好和最简单的解决方案是使用 PolygonAnnotation 绘制椭圆,它采用坐标点列表,

假设您给出四个坐标点 A、B、C、D——多边形注释将根据所取点的类型给出一个封闭的 4 边形~四边形结构。 现在,如果您将点数从 4 增加到 6——它会给您六边形,依此类推。

现在在像素级别,您可以给出无限数量/离散数量的超过 360 度的点。

所以这里我们需要一个 2D 椭圆上点的算法/方程 - 给定以下输入(基于本例):-

  1. 椭圆中心 (h,k)

  2. 椭圆轴旋转角度

  3. 长轴 (a)

  4. 短轴 (b)

  5. 与 x 轴的 theta 角

     private void GeneratePolygonAsEllipse(PolygonAnnotation polygonAnnotation)
    
     {
         double step = 2 * Math.PI / 200;
         var h = xCenter;
         var k = yCenter;
         var rotation = AngleOfRotation;
         var a = MajorAxisLength;
         var b = MinorAxisLength;
    
         for (double theta = 0; theta < 2 * Math.PI; theta += step)
         {
             var x = a * Math.Cos(rotation) * Math.Cos(theta) + b * Math.Sin(rotation) * Math.Sin(theta) + h;
             var y = b * Math.Cos(rotation) * Math.Sin(theta) + a * Math.Sin(rotation) * Math.Cos(theta) + k;
    
             polygonAnnotation.Points.Add(new DataPoint(x, y));
         }
     }
    

我希望上面规定的示例方法方程对像我这样寻找解决方案的其他人有用。我在其他地方找不到直接的解决方案,所以我在这里添加了我的解决方案,可以用作参考。

结果:-

如果任何人都可以提出其他解决方案,例如如何使用 IRender 或其他任何东西,那么很高兴看看它们。


0
投票

有一个小错误,你忘记了 y 变换中的负号。需要是“- a * Math.Sin(旋转)”

var y = b * Math.Cos(旋转) * Math.Sin(theta) - a * Math.Sin(旋转) * Math.Cos(theta) + k;

© www.soinside.com 2019 - 2024. All rights reserved.