2015-12-16 18 views
0

嘗試在C#中使用GeometryContext繪製極座標類型圖表。我輸入的方向爲xRange(開始&停止),以度爲單位。我將它轉換爲Radians。都好。 yRange被切入&切出的風速目前爲m/s雙倍。我試圖acheive下面的圖像的簡化版本,沒有軸標籤等帶有StreamGeometryContext的繪圖點幾何圖形

enter image description here

對於要繪製的每個對象我返回一個XY範圍:

public IEnumerable<Styled2DRange> Query() 
    { 
     SolidColorBrush brush = new SolidColorBrush(Colors.Maroon); 
     brush.Freeze(); 
     Pen linePen = new Pen(brush, 3); 
     linePen.Freeze(); 
     SolidColorBrush fillBrush = new SolidColorBrush(Colors.Maroon); 
     fillBrush.Freeze(); 

     foreach (var range in this.Charts) 
     { 
      Range xRange = new Range(ConvertToRadians(range.StartDirection), ConvertToRadians(range.EndDirection)); 
      Range yRange = new Range(range.CutInWindSpeed, range.CutOutWindSpeed); 

      yield return new 2DRange() 
      { 
       Range = new XYRange() 
       { 
        XRange = xRange, 
        YRange = yRange 
       }, 

       Line = linePen, 
       Fill = fillBrush 
      }; 
     } 

     yield break; 
    } 

此方法從我的重寫Onrender中調用。顯然,我的點由StreamGeometryContext可以得出沒有意義的Range.Y值只是風速米/秒:

protected override void OnRender(DrawingContext dc) 
    {    
     Point origin = new Point(0, 0); 
     double maxR = 0; 

     SweepDirection outerSweep = SweepDirection.Clockwise; 
     SweepDirection innerSweep = SweepDirection.Counterclockwise; 

     outerSweep = SweepDirection.Counterclockwise; 
     innerSweep = SweepDirection.Clockwise; 

     foreach (Styled2DRange range in Query()) 
     { 
      maxR = Math.Max(maxR, range.Range.YRange.End); 

       Point outerScreenPointBefore = new Point(range.Range.XRange.Start, range.Range.YRange.End); 
       Point outerScreenPointAfter = new Point(range.Range.XRange.End, range.Range.YRange.End); 

       Point innerScreenPointBefore = new Point(range.Range.XRange.Start, range.Range.YRange.Start); 
       Point innerScreenPointAfter = new Point(range.Range.XRange.End, range.Range.YRange.Start); 

       StreamGeometry sectorGeometry = new StreamGeometry(); 
       sectorGeometry.FillRule = FillRule.Nonzero; 

       using (StreamGeometryContext geometryContext = sectorGeometry.Open()) 
       { 

        geometryContext.BeginFigure(innerScreenPointBefore, true, true); 
        geometryContext.LineTo(outerScreenPointBefore, true, false); 

        double outerCircleRadius = Math.Sqrt(Math.Pow(outerScreenPointBefore.X - origin.X, 2) + Math.Pow(outerScreenPointBefore.Y - origin.Y, 2)); 
        geometryContext.ArcTo(outerScreenPointAfter, new Size(outerCircleRadius, outerCircleRadius), 0, false, outerSweep, true, false); 

        geometryContext.LineTo(innerScreenPointAfter, true, false); 

        double innerCircleRadius = Math.Sqrt(Math.Pow(innerScreenPointBefore.X - origin.X, 2) + Math.Pow(innerScreenPointBefore.Y - origin.Y, 2)); 
        geometryContext.ArcTo(innerScreenPointBefore, new Size(innerCircleRadius, innerCircleRadius), 0, false, innerSweep, true, false); 
       } 

       sectorGeometry.Freeze(); 
       dc.DrawGeometry(range.Fill, range.Line, sectorGeometry); 
      } 
     } 

那麼,如何引用風速創建內的實際點繪圖的邊界?

回答

1

圖表扇區的四個點位於兩個同心圓上,其中內圓的半徑由起始風速給出,而外圓的半徑由末端風速給出。每個圓上的點的位置由弧度的風向直接給出。

前提是你有變量startDirectionendDirection的風向和startSpeedendSpeed的風速,一個部門將被修建這樣的:

var pStart = new Point(Math.Sin(startDirection), -Math.Cos(startDirection)); 
var pEnd = new Point(Math.Sin(endDirection), -Math.Cos(endDirection)); 
var isLargeArc = Math.Abs(endDirection - startDirection) > Math.PI; 
var geometry = new StreamGeometry(); 

using (var sgc = geometry.Open()) 
{ 
    sgc.BeginFigure(// start point on inner circle 
     new Point(startSpeed * pStart.X, startSpeed * pStart.Y), 
     true, true); 

    sgc.ArcTo(// end point on inner circle 
     new Point(startSpeed * pEnd.X, startSpeed * pEnd.Y), 
     new Size(startSpeed, startSpeed), // radius of inner circle 
     0d, isLargeArc, SweepDirection.Clockwise, true, true); 

    sgc.LineTo(// end point on outer circle 
     new Point(endSpeed * pEnd.X, endSpeed * pEnd.Y), 
     true, true); 

    sgc.ArcTo(// start point on outer circle 
     new Point(endSpeed * pStart.X, endSpeed * pStart.Y), 
     new Size(endSpeed, endSpeed), // radius of outer circle 
     0d, isLargeArc, SweepDirection.Counterclockwise, true, true); 
}