2016-01-27 49 views
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到最後,然後以某種方式比較這兩個值,但不知道如何實現這一目標?

+0

一整圈(即360度),等於'2 * pi'弧度,爲你注意。 –

+0

「問題出現在開始<結束時,例如從270度到120度,在這種情況下,我需要一個滿足180度角(PI)的條件」 - 您能詳細說明嗎?預計什麼? – Ian

回答

4

好了,你可以添加一個完整的圓的end,(或啓動;按方向)的角度例如:

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; 
    } 
+0

你是什麼意思'開始是<結束和由此產生的角度 - PI ...' 你的意思是開始<結束+ Math.Abs​​(結束 - 開始) - Math.PI –

+0

所以在那種情況下,你有描述,你想要像一個LargeArc處理它嗎? –

+0

那麼你不需要另一個條件,因爲Math.Abs​​(End - Start)

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