2011-08-12 4 views
2

Je devrais dessiner un cercle à l'intérieur d'une carte polaire avec du texte dessus.Convertir des coordonnées de graphiques en pixels

J'ai commencé à jouer avec PostPaint, j'ai obtenu des graphismes de graphiques, donc je suis capable de dessiner et d'écrire des choses personnalisées dessus.

Mon problème principal est le placement.

E.g. Je voudrais dessiner sg où mes axes x et y se croisent, mais je n'ai pas trouvé de moyen efficace pour convertir les coordonnées du graphe (dans mon exemple 0,0) en coordonnées de pixels.

Comment est-ce que je peux faire ceci? Comment puis-je convertir des coordonnées graphiques en pixels?

.net4/WinForms/VS2010/C#

Répondre

4

Donc, je l'ai résolu.

Je poignée l'événement postpaint de MSChart:

private void chartMain_PostPaint(object sender, ChartPaintEventArgs e) 
    { 
     try 
     { 
      if (chartMain.ChartAreas.FirstOrDefault(a=>a.Name == "Default") == null) 
       return; 

      Graphics graph = e.ChartGraphics.Graphics; 

      var day = Date.GetBoundaries(daySelectorMain.DateTimePickerDay.Value); 
      var toDate = day.Item2; //it is maxdate value (max value of x axis) 

      var centerY = (float)chartMain.ChartAreas["Default"].AxisY.ValueToPixelPosition(-80); //-80 is the min value of y (y axis) 
      var centerX = (float)chartMain.ChartAreas["Default"].AxisX.ValueToPixelPosition(toDate.ToOADate()); 

      var origoY = (float)chartMain.ChartAreas["Default"].AxisY.ValueToPixelPosition(0); 
      var origoX = (float)chartMain.ChartAreas["Default"].AxisX.ValueToPixelPosition(toDate.ToOADate()); 

      var radius = (float)(centerY - origoY) - 1; 

      graph.DrawLine(System.Drawing.Pens.Blue, 
          new PointF(origoX, origoY), 
          new PointF(centerX, centerY)); 

      graph.FillEllipse(new SolidBrush(Color.White), centerX - radius, centerY - radius, radius * 2, radius * 2); 
     } 
     catch (System.Exception exc) 
     { 
      Debug.Assert(false, exc.Message); 
     } 
    } 
0

Trouver le rapport? si le cordon est 100x100 où les unités sont pseudo, puis lors de la transformation à 200x200 pixels, il suffit d'utiliser le ratio 2.0 si coord est 200x100 et physiquement 100x100 X a un rapport de 2,0 et Y a un ratio de 1,0 Quand je fais SVG je dois compenser 0 , 0 (coin supérieur gauche) aux coordonnées cartésiennes (0,0 au centre) en décalant tout par +1000 http://en.wikipedia.org/wiki/Cartesian_coordinate_system

+0

Thx. Vraiment il n'y a pas de fonction ChartCoordsToPixels dans MSChart? – Tom

1

La solution auto-réponse ne fonctionne dans un cas plus général ni ne transforme réellement DataPointvaleurs à pixel coordonnées.

Voici une solution pour dessiner le cercle qui fonctionnera toujours:

private void chart1_PostPaint(object sender, ChartPaintEventArgs e) 
{ 
    RectangleF ipp = InnerPlotPositionClientRectangle(chart1, chart1.ChartAreas[0]); 
    using (Graphics g = chart1.CreateGraphics()) 
     g.DrawEllipse(Pens.Red, new RectangleF(ipp.Location, ipp.Size)); 
} 

Il utilise deux fonctions d'aide:

RectangleF ChartAreaClientRectangle(Chart chart, ChartArea CA) 
{ 
    RectangleF CAR = CA.Position.ToRectangleF(); 
    float pw = chart.ClientSize.Width/100f; 
    float ph = chart.ClientSize.Height/100f; 
    return new RectangleF(pw * CAR.X, ph * CAR.Y, pw * CAR.Width, ph * CAR.Height); 
} 

RectangleF InnerPlotPositionClientRectangle(Chart chart, ChartArea CA) 
{ 
    RectangleF IPP = CA.InnerPlotPosition.ToRectangleF(); 
    RectangleF CArp = ChartAreaClientRectangle(chart, CA); 

    float pw = CArp.Width/100f; 
    float ph = CArp.Height/100f; 

    return new RectangleF(CArp.X + pw * IPP.X, CArp.Y + ph * IPP.Y, 
          pw * IPP.Width, ph * IPP.Height); 
} 

And here is a link to a general coordinate transformation function for polar charts.

Questions connexes