两个角度之间的弧度差是多少?

3
我有一个简单的图表,用户可以确定弧度的起始和结束方向。控件使用OnRender的重写方法绘制图表。我正在使用StreamGeometryContext.ArcTo绘制弧线。该方法具有一个IsLargeArc属性,用于确定如何绘制弧线(大于180度(PI)为真,小于180度为假)。我从一个条件中确定这个值,这个条件运行良好:
 //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;
  }

enter image description here

问题出现在起始角度小于结束角度的情况下。例如,从270度到120度。我需要一个条件来满足这种情况下大于180度(PI)的角度。数学不是我的强项。我认为我需要将PI*2加到结束角度,然后以某种方式比较这两个值,但不确定如何实现?

一个完整的圆(即360度)等于2 * pi弧度,正如你所注意到的。 - Pieter Geerkens
问题出现在起始角度小于结束角度的情况下。例如,从270度到120度。我需要一个条件来满足这种情况下180度(π)以上的角度。能否进一步阐述需求?您期望得到什么? - Ian
3个回答

4

你可以在起始角度或结束角度上添加一个完整的圆形,例如:

end(根据方向决定)angle
if (start < end)
    start += 2 * Math.PI; //full circle in radians.

这样做会在终止角度处添加一个完整的圆圈,这不会改变您绘图的位置,并且如果您从起始角度中减去它们(start-end ),将得到有效和正确的角度。
尽管我必须说,我希望有一个 start > end 的条件。
如果 start > end 或反之亦然,则说明它们所指示的方向。

2

您可以使用Math.Abs方法获取差的绝对值。

您的代码可能如下所示:

  if  ((Start < Math.PI && Math.Abs(End - Start) < Math.PI) || 
        (Start > Math.PI && End - Start < 0 ))
    {
        //IsLargeArc = false;
    }
    else
    {
        //IsLargeArc= true;
    }

你所说的“start is < end and the resulting angle - PI”的意思是什么?您是指 Start < End + Math.Abs(End - Start) - Math.PI 吗? - S.Dav
那么在你所描述的情况下,你是想将其处理成LargeArc吗? - S.Dav
然后您就不需要另一个条件了,因为 Math.Abs(End - Start) < Math.PI 已经满足了该条件。 - S.Dav

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);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接