不确定我得到了你的要求,但看起来你想创建如下采样点表的连续函数,例如:
const int N=21; // number of samples
const double t0=21.0,t1=1.0; // start,end times
const double val[N]={ 2.1,3,1,6,7,5.5,0,9,5,6,7,3.6,2,5,6,7,8,1,2,3,4 };
double f(double t) // nearest
{
t = (t-t0)/(t1-t0); // time scaled to <0,1>
t*= (N-1); // time scaled to <0,N) .. index in table
int ix=t; // convert to closest index in val[]
if ((ix<0)||(ix>=N)) return 0.0; // handle undefined times
return val[ix]; // return closest point in val[]
}
这将为您提供最近邻样式的函数值。如果您需要更好的东西,请使用线性或三次或更好的插值,例如:
double f(double t) // linear
{
t = (t-t0)/(t1-t0); // time scaled to <0,1>
t*= (N-1); // time scaled to <0,N) .. index in table
int ix=t; // convert to closest index in val[]
if ((ix<0)||(ix>=N)) return 0.0; // handle undefined times
if (ix==N-1) return val[ix]; // return closest point in val[] if on edge
// linear interpolation
t = t-floor(t); // distance of time between ix and ix+1 points scaled to <0,1>
return val[ix]+(val[ix+1]-val[ix])*t; // return linear interpolated value
}
现在解决您的问题:
void mouseHandleCordinate(double mx) // mouse x coordinate in [pixels] I assume
{
double t,x,y,x0,y0
// plot
x=0;
y=f(view_start_time)
for (t=view_start_time;t<=view_end_time;t+=(view_end_time-view_start_time)/view_size_in_pixels,x0=x,x++)
{
y0=y; y=f(t);
// render line x0,y0,x,y
}
// mouse highlight
t = view_start_time+((view_end_time-view_start_time)*mx/view_size_in_pixels);
x = mx;
y = f(t);
// render point x,y ... for example with circle r = 16 pixels
}
在哪里:
view_start_time 是绘图视图中最左侧像素的时间
view_end_time 是绘图视图中最右侧像素的时间
view_size_in_pixels 是绘图视图的 x 分辨率(以 [像素] 为单位)
[备注]
我直接在 SO 编辑器中编码,所以可能有错别字...
希望您在某些 Paint 事件中调用 mouseHandleCordinate,而不是在鼠标移动时调用,这应该只安排重绘顺序...此外,您应该以与我使用的 x 比例类似的方式添加 y 视图比例...
更多信息见: