我有一个简单的图表,用户可以确定一个开始&弧度的终点方向。然后,控件使用覆盖OnRender
绘制图表。我用StreamGeometryContext.ArcTo
绘制弧线。此方法具有IsLargeArc
属性,用于确定绘制弧的方式(对于> 180度(PI)为true,对于<180度为false)。我从一个正常的条件确定这个值:
//Rule does not exceed 180 degrees in direction (radian), IsLargeArc= False else true
if (Start < Math.PI && (End - Start) < Math.PI || //currently unknow condition in here to deal with < PI when start angle is > then end angle?)
{
//IsLargeArc = false;
}
else
{
//IsLargeArc= true;
}
问题来自于开始&lt;结束。例如从270度到120度。在这种情况下,我需要满足180度(PI)角度的条件。数学不是我的强项。我想我需要将PI * 2添加到最后,然后以某种方式比较这两个值,但不确定如何实现这一点?
答案 0 :(得分:4)
好吧,你可以在end
,(或开始;根据方向)角度添加一个完整的圆圈,例如:
if (start < end)
start += 2 * Math.PI; //full circle in radians.
这样您就可以在结束角度上添加一个完整的圆圈,这样就不会改变绘图的位置,如果减去它们会产生有效且正确的角度(start - end
)
虽然我必须说,我希望start > end
条件。
如果start > end
或反之亦然,则告诉您有关方向的信息。
答案 1 :(得分:2)
您可以使用Math.Abs方法获取差异的绝对值。
您的代码可能如下所示:
if ((Start < Math.PI && Math.Abs(End - Start) < Math.PI) ||
(Start > Math.PI && End - Start < 0 ))
{
//IsLargeArc = false;
}
else
{
//IsLargeArc= true;
}
答案 2 :(得分:1)
private bool IsLargeArc(Styled2DRange range)
{
double angleDiff = GetPositiveAngleDifference(End - Start);
if (angleDiff > Math.PI)
{
return true;
}
return false;
}
private double GetPositiveAngleDifference(double angleDiff)
{
return (angleDiff + (2*Math.PI))%(2*Math.PI);
}