2017-05-31 4 views
-2

Die Y-Achse wird automatisch skaliert, abhängig von den Werten, die kommende Funktion kommen.Erstellen Sie ein Diagramm mit C++ Visual Studio

void mouseHandleCordinate(double val){ 
    // include graph function. 
} 

Also ich möchte das Diagramm gegen die Zeit erstellen. Die X-Achse repräsentiert die Zeit und Y repräsentiert den Wert, der über die Funktion kommt. Wie ich obige Grafikfunktion erstelle.

Übergeben Sie immer die Daten in void mouseHandleCordinate(double val) Funktion. Als Beispiel:

val >>> 2.1,3,1,6,7,5.5,0,9,5,6,7,3.6,2,5,6,7,8,1,2,3,4 >> represent double val 
Time>>> 21,20,19,18,17,......., 4,3,2,1 second 

Antwort

0

nicht sicher, ob ich bekam, was Sie fragen, aber sieht aus wie Sie kontinuierliche Funktion folgende Tabelle von Abtastpunkten wie erstellen möchten:

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[] 
} 

Dies gibt Ihnen die nächsten Nachbarn Style-Funktion Wert. Wenn Sie brauchen, um etwas besser zu nutzen lineare oder kubische oder besser Interpolation zum Beispiel:

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 
} 

jetzt zum Problem:

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 
} 

wo:
view_start_time Zeit des am weitesten links stehenden Pixel in Ihrem Grundstück Ansicht ist,
view_end_time ist die Zeit des rechtesten Pixels in Ihrer Diagrammansicht
view_size_in_pixels ist die x-Auflösung in [Pixel] Ihrer Diagrammansicht

[Notizen]

ich das Zeug direkt in SO-Editor Code, so kann es sein, Tippfehler ... der Hoffnung, Sie die mouseHandleCordinate in einigen Paint-Ereignis aufrufen, anstatt auf Mausbewegungen, die nur um Zeitplan neu streichen sollte ... auch sollten Sie y Ansicht Skala in ähnlicher Weise wie in x Tonleiter habe ich ...

Für weitere Informationen siehe:

Verwandte Themen