12
votes

Affichage des coordonnées d'axe de la souris sur le contrôle du graphique

Y a-t-il un moyen simple de récupérer les coordonnées X / Y de tout point de la zone de graphique (par rapport à cet axe de cet axe de graphique)?

Dès présent, je viens de réaliser de récupérer des coordonnées lorsque la souris est sur une série (non extérieure) xxx


0 commentaires

6 Réponses :


10
votes

Quoi qu'il en soit, comme toujours avec les contrôles de graphique MS, il n'y a pas de moyen facile de faire des choses, mais une solution de contournement funky pour faire avancer les choses. Je m'y habitue malheureusement ... xxx


1 commentaires

Je viens d'essayer ceci: px fonctionne bien, mais la py reste constante (= 1) (tandis que E.x et E. changements). En outre, il ajoute un crosshair de graphique complète qui peut être indésirable dans certains cas particuliers.



6
votes

J'ai essayé votre réponse, mais cela n'a pas fonctionné pour moi. Cela a fini par mettre le curseur à un endroit et ne jamais bouger. Je crois que c'est parce que j'utilise des valeurs décimales / doubles sur les deux axes, et le curseur est arrondi sur l'entier le plus proche.

Après plusieurs tentatives, j'ai pu élaborer une méthode permettant de déterminer où le curseur est à l'intérieur du graphique . La partie difficile visait à déterminer que toutes les "positions" des éléments de graphique sont en réalité des valeurs de pourcentage (de 0 à 100). P>

selon http://msdn.microsoft.com /en-us/library/system.windows.forms.dataVisualization.Charting.ElementPosition.aspx :
"définit la position de l'élément de graphique dans les coordonnées relatives, qui vont de (0,0) à (100 100)." em>


J'espère que cela ne vous dérange pas, je pose cette réponse ici juste pour la postérité, au cas où quelqu'un d'autre apparaît sur ce problème, et votre méthode ne fonctionne pas non plus pour eux. Ce n'est pas joli ou élégant en aucune façon, mais jusqu'à présent, cela fonctionne pour moi.

p>

private struct PointD
{
  public double X;
  public double Y;
  public PointD(double X, double Y)
  {
    this.X = X;
    this.Y = Y;
  }
}

private void chart1_MouseMove(object sender, MouseEventArgs e)
{
  var pos = LocationInChart(e.X, e.Y);
  lblCoords.Text = string.Format("({0}, {1}) ... ({2}, {3})", e.X, e.Y, pos.X, pos.Y);
}

private PointD LocationInChart(double xMouse, double yMouse)
{
  var ca = chart1.ChartAreas[0];

  //Position inside the control, from 0 to 100
  var relPosInControl = new PointD
  (
    ((double)xMouse / (double)execDetailsChart.Width) * 100,
    ((double)yMouse / (double)execDetailsChart.Height) * 100
  );

  //Verify we are inside the Chart Area
  if (relPosInControl.X < ca.Position.X || relPosInControl.X > ca.Position.Right
  || relPosInControl.Y < ca.Position.Y || relPosInControl.Y > ca.Position.Bottom) return new PointD(double.NaN, double.NaN);

  //Position inside the Chart Area, from 0 to 100
  var relPosInChartArea = new PointD
  (
    ((relPosInControl.X - ca.Position.X) / ca.Position.Width) * 100,
    ((relPosInControl.Y - ca.Position.Y) / ca.Position.Height) * 100
  );

  //Verify we are inside the Plot Area
  if (relPosInChartArea.X < ca.InnerPlotPosition.X || relPosInChartArea.X > ca.InnerPlotPosition.Right
  || relPosInChartArea.Y < ca.InnerPlotPosition.Y || relPosInChartArea.Y > ca.InnerPlotPosition.Bottom) return new PointD(double.NaN, double.NaN);

  //Position inside the Plot Area, 0 to 1
  var relPosInPlotArea = new PointD
  (
    ((relPosInChartArea.X - ca.InnerPlotPosition.X) / ca.InnerPlotPosition.Width),
    ((relPosInChartArea.Y - ca.InnerPlotPosition.Y) / ca.InnerPlotPosition.Height)
  );

  var X = relPosInPlotArea.X * (ca.AxisX.Maximum - ca.AxisX.Minimum) + ca.AxisX.Minimum;
  var Y = (1 - relPosInPlotArea.Y) * (ca.AxisY.Maximum - ca.AxisY.Minimum) + ca.AxisY.Minimum;

  return new PointD(X, Y);
}


0 commentaires

10
votes

Cela fonctionne à mes fins et n'augmente pas le curseur.

private Tuple<double,double> GetAxisValuesFromMouse(int x, int y)
{
    var chartArea = _chart.ChartAreas[0];
    var xValue = chartArea.AxisX.PixelPositionToValue(x);
    var yValue = chartArea.AxisY.PixelPositionToValue(y);
    return new Tuple<double, double>(xValue, yValue);
}


0 commentaires

1
votes

Ceci fonctionne xxx

et cette fonctionne xxx


2 commentaires

Un peu plus d'explication est toujours bon pour rendre votre réponse plus précieuse;)


Le premier ne fonctionne pas pour moi. La valeur E.x était nulle et le graphisation était de 28 ans, donnant ainsi un nombre négatif pour X (qui a provoqué une exception) lorsque j'ai essayé de localiser une annotation là-bas.



2
votes
private void OnChartMouseMove(object sender, MouseEventArgs e)
{
    var sourceChart = sender as Chart;
    HitTestResult result = sourceChart.HitTest(e.X, e.Y);
    ChartArea chartAreas = sourceChart.ChartAreas[0];

    if (result.ChartElementType == ChartElementType.DataPoint)  
    {
        chartAreas.CursorX.Position = chartAreas.AxisX.PixelPositionToValue(e.X);
        chartAreas.CursorY.Position = chartAreas.AxisY.PixelPositionToValue(e.Y);
    }
}

1 commentaires

Fonctionne, même axisie! Merci



0
votes

C'est ce que j'ai eu, je pense que beaucoup d'entre nous sont le long des mêmes lignes, mais avec différentes interprétations de ce que vous recherchez.

Cela vous donnera les coordonnées à n'importe quel endroit de la zone de tracé. J'ai trouvé le Hittest donne une solution propre et simple, mais il y a quelques chèques à faire, que le curseur soit sur un point de données, une grille ou dans la zone de traçage (qui semblent présenter la priorité. dans cet ordre). Je suppose que vous serez intéressé par la coordonnée indépendamment de laquelle de ces objets la souris est terminée. xxx


0 commentaires