如何使用 Oxyplot 在 C# WPF 中绘制具有给定旋转角度的椭圆?
How to plot an ellipse with given rotation angle in C# WPF using Oxyplot?
OxyPlot 是 .NET 的跨平台绘图库,非常方便绘图,
现在有个情况,我要给XY散点图画一个95%置信度的椭圆。
Oxyplot 提供了以下注释:-
这里给出的Ellipse Annotation(OxyPlot.Annotations)只给出了以下属性来添加ellipse-
我们这里没有任何旋转 属性 或方法,IRender 提供了几个可以重写的绘制方法,但是 none 的方法有双角度旋转参数左右。 documentation 都没有提供任何直接的解决方案:-
那么这个怎么画:-
*我的一项任务遇到了这个问题,在通过以下论坛讨论获得关于如何生成这样一个椭圆的提示后想出了一个解决方案。
- https://github.com/oxyplot/oxyplot/issues/268
- https://oxyplot.userecho.com/en/communities/1/topics/598-ellipse-annotation-rotation
如果其他人有解决方案,请添加更多解决方案:-
基于 link 共享(在 Quest 中。)这里最好和最简单的解决方案是使用 PolygonAnnotation 绘制一个椭圆,它采用坐标点列表,
假设你给了四个坐标点 A、B、C、D--- polygonAnnotation 会根据所取点的种类给我一个封闭的 4 边形~四边形结构。
现在,如果你将点数从 4 增加到 6--- 它将给你六边形,依此类推。
现在在像素级别,您可以给出 infinite-number/discrete-number 超过 360 度的点。
所以这里我们需要 2D 椭圆上的 algorithm/equation 点 - 给出以下输入(基于这种情况):-
椭圆中心 (h,k)
椭圆轴旋转角度
长轴 (a)
短轴 (b)
与 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 或其他任何东西,看看它们会很棒。
OxyPlot 是 .NET 的跨平台绘图库,非常方便绘图,
现在有个情况,我要给XY散点图画一个95%置信度的椭圆。
Oxyplot 提供了以下注释:-
这里给出的Ellipse Annotation(OxyPlot.Annotations)只给出了以下属性来添加ellipse-
我们这里没有任何旋转 属性 或方法,IRender 提供了几个可以重写的绘制方法,但是 none 的方法有双角度旋转参数左右。 documentation 都没有提供任何直接的解决方案:-
那么这个怎么画:-
*我的一项任务遇到了这个问题,在通过以下论坛讨论获得关于如何生成这样一个椭圆的提示后想出了一个解决方案。
- https://github.com/oxyplot/oxyplot/issues/268
- https://oxyplot.userecho.com/en/communities/1/topics/598-ellipse-annotation-rotation
如果其他人有解决方案,请添加更多解决方案:-
基于 link 共享(在 Quest 中。)这里最好和最简单的解决方案是使用 PolygonAnnotation 绘制一个椭圆,它采用坐标点列表,
假设你给了四个坐标点 A、B、C、D--- polygonAnnotation 会根据所取点的种类给我一个封闭的 4 边形~四边形结构。 现在,如果你将点数从 4 增加到 6--- 它将给你六边形,依此类推。
现在在像素级别,您可以给出 infinite-number/discrete-number 超过 360 度的点。
所以这里我们需要 2D 椭圆上的 algorithm/equation 点 - 给出以下输入(基于这种情况):-
椭圆中心 (h,k)
椭圆轴旋转角度
长轴 (a)
短轴 (b)
与 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 或其他任何东西,看看它们会很棒。