如果我知道x& y图表上2个点的值,我知道这2个点之间的位置的Y值,我如何得到Y值对应的X值?
基本上我想在两个原始点之间获得该值首先出现的X位置。
Y轴是双精度数,X轴使用DateTimes。
很可能正好是Y值的数据点可能不是图表上的精确点(它是折线图)但是,我需要找到确切的X值,不是最近的实际点,我害怕。
答案 0 :(得分:0)
对于LineChart
,计算实际上只是插值数学。
但它仍然需要了解Chart
的工作原理。
您有Y值的正常数字,但DateTimes
有X-Values
。
这对数学运算不太好,所以我们期望将日期转换为数字。
但是Chart
在内部使用FromOADate
和ToOADate()
进行调用。
好处是,这意味着您在内部添加为DateTime
值的内容将存储为数字,实际上是double
。
所以你确实可以做数直接。下面是一个代码示例,演示如何在同一行上找到具有给定y值的两个给定点的点。
为了让它看起来不错,我将计算出的点作为新的DataPoint
添加到第二个类型Point
的系列中。
首先,我准备好我的图表:
chart1.ChartAreas.Clear();
chart1.Series.Clear();
ChartArea CA = chart1.ChartAreas.Add("CA");
Series S1 = chart1.Series.Add("S1");
Series S2 = chart1.Series.Add("S2");
S1.ChartType = SeriesChartType.Line;
S2.ChartType = SeriesChartType.Point;
S1.Points.AddXY(new DateTime(2015, 12, 10), 10);
S1.Points.AddXY(new DateTime(2015, 12, 31), 31);
DataPoint dp1 = S1.Points[0];
DataPoint dp2 = S1.Points[1];
现在我设置Y-Value
,我搜索X-Value
:
double y3 = 24; // X-Mas ;-)
现在我计算增量和坡度。当然,这可以一个一个地完成,但为了清楚起见我拼出来了:
double deltaY = dp2.YValues[0] - dp1.YValues[0];
double deltaX = dp2.XValue - dp1.XValue;
double slope = deltaY / deltaX;
最后,我计算你正在寻找的X值:
double x3 = dp1.XValue + (y3 - dp1.YValues[0]) * slope;
现在我可以证明新点确实位于前两点之间的界限上:
S2.Points.AddXY(x3, y3);
S2.Points[0].Color = Color.Red;