C# 两个角度的弧度差?

C# 两个角度的弧度差?,c#,wpf,math,trigonometry,C#,Wpf,Math,Trigonometry,我有一个简单的图表,用户可以用弧度确定开始和结束方向。然后,控件使用覆盖OnRender绘制图表。我正在用StreamGeometryContext.ArcTo绘制圆弧。此方法具有一个IsLargeArc属性,用于确定如何绘制圆弧(对于>180度(PI)为true,对于

我有一个简单的图表,用户可以用弧度确定开始和结束方向。然后,控件使用覆盖
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;
  }
//规则的方向(弧度)不超过180度,IsLargeArc=False,否则为true
if(Startthen End angle?)
{
//IsLargeArc=false;
}
其他的
{
//IsLargeArc=真;
}


当开始<结束时,问题就出现了。e、 g.从270度到120度。在这种情况下,我需要一个条件来满足180度以上的角度。数学不是我的强项。我想我需要在末尾加上π*2,然后以某种方式比较这两个值,但不确定如何实现这一点?

好的,你可以在
结尾添加一个完整的圆(或开始;根据方向)角度,例如:

if (start < end)
    start += 2 * Math.PI; //full circle in radians.
if(开始<结束)
开始+=2*Math.PI//以弧度表示的完整圆。
通过这种方式,您将向结束角度添加一个完整的圆,这不会更改图形的位置,并且如果减去它们(
开始-结束
),将得到一个有效且正确的角度

尽管我必须说,我希望出现
start>end
条件

如果
start>end
或visa反之亦然,则这会告诉您有关方向的信息。

您可以使用该方法获得差值的绝对值

您的代码可能如下所示:

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

如您所述,一个完整的圆(即360度)等于
2*pi
弧度。“问题出现在开始<结束时。例如,从270度到120度。在这种情况下,我需要一个条件来满足180度(pi)以上的角度”-您能详细说明一下吗?期望的是什么?你所说的“开始是<结束和得到的角度-PI…”是指开始<结束+数学.Abs(结束-开始)-数学.PIso在你已经描述过的情况下,你想像处理LargeArc一样处理它吗?那么你不需要另一个条件,因为Math.Abs(结束-开始)<数学.PI满足这个条件
  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);
    }