Ejemplo n.º 1
0
Plotter::Plotter(
    DataLog* log,
    float left, float right, float bottom, float top,
    float tickx, float ticky,
    Plotter* linked_plotter_x,
    Plotter* linked_plotter_y
)   : default_log(log),
      colour_wheel(0.6f),
      rview_default(left,right,bottom,top), rview(rview_default), target(rview),
      selection(0,0,0,0),
      track(false), track_x("$i"), track_y(""),
      trigger_edge(0), trigger("$0"),
      linked_plotter_x(linked_plotter_x),
      linked_plotter_y(linked_plotter_y)
{
    if(!log) {
        throw std::runtime_error("DataLog not specified");
    }
    // Prevent links to ourselves - this could cause infinite recursion.
    if(linked_plotter_x == this) this->linked_plotter_x = 0;
    if(linked_plotter_y == this) this->linked_plotter_y = 0;

    // Handle our own mouse / keyboard events
    this->handler = this;
    hover[0] = 0;
    hover[1] = 0;

    // Default colour scheme
    colour_bg = Colour(0.0f, 0.0f, 0.0f);
    colour_tk = Colour(0.2f, 0.2f, 0.2f);
    colour_ax = Colour(0.5f, 0.5f, 0.5f);

    SetTicks(tickx, ticky);

    // Create shader for drawing simple primitives
    prog_lines.AddShader( GlSlVertexShader,
                         "attribute vec2 a_position;\n"
                         "uniform vec4 u_color;\n"
                         "uniform vec2 u_scale;\n"
                         "uniform vec2 u_offset;\n"
                         "varying vec4 v_color;\n"
                         "void main() {\n"
                         "    gl_Position = vec4(u_scale * (a_position + u_offset),0,1);\n"
                         "    v_color = u_color;\n"
                         "}\n"
                         );
    prog_lines.AddShader( GlSlFragmentShader,
                      #ifdef HAVE_GLES_2
                          "precision mediump float;\n"
                      #endif // HAVE_GLES_2
                         "varying vec4 v_color;\n"
                         "void main() {\n"
                         "  gl_FragColor = v_color;\n"
                         "}\n"
                         );
    prog_lines.BindPangolinDefaultAttribLocationsAndLink();

    prog_text.AddShader( GlSlVertexShader,
                         "attribute vec2 a_position;\n"
                         "attribute vec2 a_texcoord;\n"
                         "uniform vec4 u_color;\n"
                         "uniform vec2 u_scale;\n"
                         "uniform vec2 u_offset;\n"
                         "varying vec4 v_color;\n"
                         "varying vec2 v_texcoord;\n"
                         "void main() {\n"
                         "    gl_Position = vec4(u_scale * (a_position + u_offset),0,1);\n"
                         "    v_color = u_color;\n"
                         "    v_texcoord = a_texcoord;\n"
                         "}\n"
                         );
    prog_text.AddShader( GlSlFragmentShader,
                     #ifdef HAVE_GLES_2
                         "precision mediump float;\n"
                     #endif // HAVE_GLES_2
                         "varying vec4 v_color;\n"
                         "varying vec2 v_texcoord;\n"
                         "uniform sampler2D u_texture;\n"
                         "void main() {\n"
                         "  gl_FragColor = v_color;\n"
                         "  gl_FragColor.a *= texture2D(u_texture, v_texcoord).a;\n"
                         "}\n"
                         );
    prog_text.BindPangolinDefaultAttribLocationsAndLink();

    const size_t RESERVED_SIZE = 100;

    // Setup default PlotSeries
    plotseries.reserve(RESERVED_SIZE);
    for(unsigned int i=0; i< 10; ++i) {
        std::ostringstream oss;
        oss << "$" << i;
        plotseries.push_back( PlotSeries() );
        plotseries.back().CreatePlot( "$i", oss.str(),
            colour_wheel.GetUniqueColour(),
            i < log->Labels().size() ? log->Labels()[i] : oss.str()
        );
    }

    // Setup test PlotMarkers
    plotmarkers.reserve(RESERVED_SIZE);
//    plotmarkers.push_back( Marker( Marker::Vertical, 10, Marker::GreaterThan, Colour(1,0,0,0.2)) );
//    plotmarkers.push_back( Marker( Marker::Horizontal, 1, Marker::LessThan, Colour(0,1,0,0.2)) );

    // Setup test implicit plots.
    plotimplicits.reserve(RESERVED_SIZE);
//    plotimplicits.push_back( PlotImplicit() );
//    plotimplicits.back().CreateInequality("x+y <= 150.0", colour_wheel.GetUniqueColour().WithAlpha(0.2) );
//    plotimplicits.push_back( PlotImplicit() );
//    plotimplicits.back().CreateInequality("x+2.0*y <= 170.0", colour_wheel.GetUniqueColour().WithAlpha(0.2) );
//    plotimplicits.push_back( PlotImplicit() );
//    plotimplicits.back().CreateInequality("3.0*y <= 180.0", colour_wheel.GetUniqueColour().WithAlpha(0.2) );

    // Setup texture spectogram style plots
    // ...

}
Ejemplo n.º 2
0
int main(int i_iArg_Count,const char * i_lpszArg_Values[])
{
	bool bData_valid;
	char lpszTargetFile[256] = {""};
	char lpszOutput_File_Prefix[256] = {""};
	char lpszOutput_Filename[256];
	char lpszTitle[256];
	unsigned int uiIon;
	bool bData_Valid = false;

	double dNan = nan("");
	char lpszSourceDir[256];

	xParse_Command_Line_String(i_iArg_Count,i_lpszArg_Values,"--sourcedir",lpszSourceDir,256,NULL);

	PARAMETER_SET	cPS_Vel;
	double			dPS_Ref_Velocity = dNan;
	double			dPS_Ref_Time = dNan;
	PARAMETER_SET	cPS_Temp;
	PARAMETER_SET	cPS_Log_Tau;
	PARAMETER_SET	cPS_Ion_Temp;
	PARAMETER_SET	cHVF_Log_Tau;
	PARAMETER_SET	cHVF_Ion_Temp;
	bool			bWith_Shell;
	bool			bNo_Title;
	bool			bUse_Sourcedir_Title;
	bool			bLinear_Scale;
	bool			bUse_Ref_Model_Title_In_Filename;
	char			lpszReference_Model_Title[64] = {0};
	unsigned int 	uiSource_File_ID;
	double			* lpdDays = NULL;
	unsigned int	uiDays_Count = 0;	
	unsigned int uiNum_Reference_Spectra = 0;
    ES::Spectrum  * lpcReference_Spectra = NULL;
	double			*lpdReference_Day = NULL;

	xParse_Command_Line_String(i_iArg_Count,i_lpszArg_Values,"--ref-model-title",lpszReference_Model_Title,64,NULL);
	bUse_Ref_Model_Title_In_Filename = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--use-ref-model-title-in-filename");
	if (xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--days"))
	{
//		printf("Processing days CL\n");
		unsigned int uiDays_Data = -1;
		const char * lpszCursor;
		for (unsigned int uiI = 1; uiI < i_iArg_Count && uiDays_Data == -1; uiI++)
		{
			if (strncmp(i_lpszArg_Values[uiI],"--days=",7) == 0)
				uiDays_Data = uiI;
			else if (strcmp(i_lpszArg_Values[uiI],"--days") == 0 && i_lpszArg_Values[uiI + 1][0] == '=')
				uiDays_Data = uiI + 1;
		}
		lpszCursor = i_lpszArg_Values[uiDays_Data];
		if (strncmp(i_lpszArg_Values[uiDays_Data],"--days",6) == 0)
			lpszCursor += 6;
		if (lpszCursor[0] == 0)
		{
			uiDays_Data++;
			lpszCursor = i_lpszArg_Values[uiDays_Data];
		}
		if (lpszCursor[0] == '=')
			lpszCursor++;
		if (lpszCursor[0] == 0)
		{
			uiDays_Data++;
			lpszCursor = i_lpszArg_Values[uiDays_Data];
		}
		unsigned int uiStart_Ref = uiDays_Data;
		const char * lpszStart_Cursor = lpszCursor;

		// first count how many items are in the list
		while (xIsANumber(lpszCursor) && uiDays_Data < i_iArg_Count)
		{
//			printf("%s\n",lpszCursor);
			if (xIsANumber(lpszCursor))
				uiDays_Count++;
			while (xIsANumber(lpszCursor))
			{
				lpszCursor++;
			}
			if (lpszCursor[0] == 0)
			{
				uiDays_Data++;
				if (uiDays_Data < i_iArg_Count)
				{
					lpszCursor = i_lpszArg_Values[uiDays_Data];
				}
			}
			if (lpszCursor[0] == ',')
				lpszCursor++;
			if (lpszCursor[0] == 0)
			{
				uiDays_Data++;
				if (uiDays_Data < i_iArg_Count)
				{
					lpszCursor = i_lpszArg_Values[uiDays_Data];
				}
			}
		}
		lpdDays = new double[uiDays_Count];
		uiDays_Data =  uiStart_Ref;
		lpszCursor = lpszStart_Cursor;
//		printf("%s\n",lpszStart_Cursor);
		uiDays_Count=0;
			// first count how many items are in the list
		while (lpszCursor[0] != 0 && xIsANumber(lpszCursor) && uiDays_Data < i_iArg_Count)
		{
//			printf("%i: %s\n",uiDays_Count,lpszCursor);
			if (xIsANumber(lpszCursor))
			{
				lpdDays[uiDays_Count] = atof(lpszCursor);
				uiDays_Count++;
			}
			while (xIsANumber(lpszCursor) && lpszCursor[0] != 0)
			{
				lpszCursor++;
			}
			if (lpszCursor[0] == ',')
				lpszCursor++;
		}
//		printf("Days count %i\n",	uiDays_Count);
	}
	else
	{
		uiDays_Count = 11;
		lpdDays = new double[uiDays_Count];
		for (unsigned int uiI = 0; uiI < uiDays_Count; uiI++)
			lpdDays[uiI] = 5.0 + 2.0 * uiI;
	}

	if (xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--PS-vel-ref-value"))
	{
		dPS_Ref_Velocity = xParse_Command_Line_Dbl(i_iArg_Count,i_lpszArg_Values,"--PS-vel-ref-value",dNan);
		dPS_Ref_Time = xParse_Command_Line_Dbl(i_iArg_Count,i_lpszArg_Values,"--PS-vel-ref-time",dNan);
		uiSource_File_ID = xParse_Command_Line_UInt(i_iArg_Count,i_lpszArg_Values,"--PS-vel-ref-file",-1);
	}
	Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--PS-vel",-0.3,cPS_Vel);
	Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--PS-temp",-1.0,cPS_Temp);
	Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--PS-ion-log-tau",-0.1,cPS_Log_Tau);
	Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--PS-ion-temp",-0.1,cPS_Ion_Temp);

	bWith_Shell = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--HVF-ion-log-tau");
	
	if (bWith_Shell)
	{
		Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--HVF-ion-log-tau",-0.1,cHVF_Log_Tau);
		Read_Parameter(i_iArg_Count,i_lpszArg_Values,"--HVF-ion-temp",-0.1,cHVF_Ion_Temp);
	}
	uiIon = xParse_Command_Line_Int(i_iArg_Count,i_lpszArg_Values,"--ion",-1);
	sprintf(lpszOutput_File_Prefix,"%s/series",lpszSourceDir);

	bNo_Title = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--no-plot-title");
	bUse_Sourcedir_Title = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--use-sourcedir-title");
	bLinear_Scale = xParse_Command_Line_Exists(i_iArg_Count,i_lpszArg_Values,"--linear-scale");

	if (xParse_Command_Line_Exists(i_iArg_Count, i_lpszArg_Values, "--serieslist"))
	{
		char lpszSeriesListFilename[128];
		char lpszSeriesListDirectory[128];
		char	lpszTemp[256];
		xParse_Command_Line_String(i_iArg_Count,i_lpszArg_Values,"--serieslist",lpszSeriesListFilename,128,"");
		xParse_Command_Line_String(i_iArg_Count,i_lpszArg_Values,"--serieslist-directory",lpszSeriesListDirectory,128,"");
		FILE * fileIn = fopen(lpszSeriesListFilename,"rt");
		if (fileIn)
		{
			char * lpszBuffer = new char [1024];
			while (fgets(lpszBuffer,sizeof(char) * 1024, fileIn))
			{
				char * lpszCursor = strchr(lpszBuffer,',');
				if (lpszBuffer[0] != 0 && lpszCursor)
				{
					lpszCursor--;
					while (lpszCursor[0] == ' ' || lpszCursor[0] == '\t')
						lpszCursor--;
					lpszCursor++;
					lpszCursor[0] = 0;
					lpszCursor++;
					while (lpszCursor[0] != 0 && !((lpszCursor[0] >= '0' && lpszCursor[0] <= '9') || lpszCursor[0] == '-' || lpszCursor[0] == '+'))
						lpszCursor++;
					SERIESLISTNODE * lpCurr = new SERIESLISTNODE;
					lpCurr->m_dDay = atof(lpszCursor);
					lpszCursor = lpszBuffer;
					while (lpszCursor[0] == ' ' || lpszCursor[0] == '\t')
						lpszCursor++;
					if (lpszSeriesListDirectory[0] != 0)
						sprintf(lpszTemp,"%s/%s",lpszSeriesListDirectory,lpszCursor);
					else
						strcpy(lpszTemp,lpszCursor);
					lpCurr->m_lpszFilename = new char[strlen(lpszTemp) + 1];
					strcpy(lpCurr->m_lpszFilename,lpszTemp);


					uiNum_Reference_Spectra++;
					if (!lpcSeriesListTail)
					{
						lpcSeriesListTail = lpcSeriesListHead = lpCurr;
					}
					else
					{
						lpcSeriesListTail->m_lpcNext = lpCurr;
						lpCurr->m_lpcPrev = lpcSeriesListTail;
						lpcSeriesListTail = lpCurr;
					}
				}
			}
		}
	}
//	printf("Series list processed\n");
	if (uiNum_Reference_Spectra > 0)
	{
		lpcReference_Spectra = new ES::Spectrum[uiNum_Reference_Spectra];
		lpdReference_Day = new double[uiNum_Reference_Spectra];
		unsigned int uiCurr_Idx = 0;
		SERIESLISTNODE * lpCurr = lpcSeriesListHead;
		while (lpCurr)
		{
		    lpcReference_Spectra[uiCurr_Idx] = ES::Spectrum::create_from_ascii_file( lpCurr->m_lpszFilename );
		
			lpdReference_Day[uiCurr_Idx] = lpCurr->m_dDay + 20.0;
			if (lpcReference_Spectra[uiCurr_Idx].size() == 0)
				printf("File %s seems to be empty!\n",lpCurr->m_lpszFilename);
			uiCurr_Idx++;
			lpCurr = lpCurr->m_lpcNext;
		}
	}
//	printf("Series list loaded\n");

	// make sure all necessary data is available to generate the spectrum
	bData_Valid = !isnan(cPS_Vel.dRef25) || (!isnan(dPS_Ref_Velocity) && !isnan(dPS_Ref_Time) && uiSource_File_ID != -1);
	bData_Valid &= !isnan(cPS_Temp.dRef25) && !isnan(cPS_Log_Tau.dRef25) && !isnan(cPS_Ion_Temp.dRef25);
	if (bWith_Shell)
		bData_valid &= !isnan(cHVF_Log_Tau.dRef25) && !isnan(cHVF_Ion_Temp.dRef25);
	bData_Valid &= (uiIon != -1);
	const char * lpszElement_ID;
	switch (uiIon / 100)
	{
	case 6:
		lpszElement_ID = "C";
		break;
	case 8:
		lpszElement_ID = "O";
		break;
	case 10:
	case 12:
		lpszElement_ID = "Mg";
		break;
	case 14: // Si
	case 16: // S
	case 18: // Ar
	case 20: // Ca
	case 22: // Ti 
	case 23: // V
	case 24: // Cr
	case 25: // Mn
		lpszElement_ID = "Si";
		break;
	case 26:
	case 27:
	case 28:
		lpszElement_ID = "Fe";
		break;
	}


	if (bData_Valid)
	{
        ES::Spectrum cTarget;
		cTarget = ES::Spectrum::create_from_range_and_step(2500.0, 10000.0, 5.0);

		char lpszOpacity_File_Ejecta[64], lpszOpacity_File_Shell[64], lpszParameters_File[64];
		XDATASET cOpacity_Map_Shell;
		XDATASET cOpacity_Map_Ejecta;
		sprintf(lpszOpacity_File_Ejecta,"%s/opacity_map_ejecta.%s.xdataset",lpszSourceDir,lpszElement_ID);
		sprintf(lpszOpacity_File_Shell,"%s/opacity_map_shell.xdataset",lpszSourceDir,lpszElement_ID);
		sprintf(lpszParameters_File,"%s.%s.user.parameters.csv",lpszOutput_File_Prefix,lpszSourceDir);

		if (bWith_Shell)
			cOpacity_Map_Ejecta.ReadDataFileBin(lpszOpacity_File_Ejecta);
		cOpacity_Map_Shell.ReadDataFileBin(lpszOpacity_File_Shell);
        ES::Spectrum * cSpectra = new ES::Spectrum[uiDays_Count];
		FILE * fileOutParameters = fopen(lpszParameters_File,"wt");
		fprintf(fileOutParameters,"Day, Ion, PS Velocity, PS Temp, PS LGR Scale, PS LGR Temp, HVF LGR Scale, HVF LGR Temp\n");

		for (unsigned int uiI = 0; uiI < uiDays_Count; uiI++)
		{
			cSpectra[uiI] = cTarget;
			double	dPS_Vel;
//			printf("%i %f\n",uiI,dDay[uiI]);
			if (!isnan(dPS_Ref_Velocity) && !isnan(dPS_Ref_Time))
				dPS_Vel = Determine_Photosphere(lpszSourceDir, uiSource_File_ID, dPS_Ref_Velocity,dPS_Ref_Time, lpdDays[uiI]);
			else			
				dPS_Vel = cPS_Vel.Get_Value(lpdDays[uiI]);
			printf("Day %.2f PS = %.2f\n",lpdDays[uiI],dPS_Vel);
			double	dPS_Temp = cPS_Temp.Get_Value(lpdDays[uiI]);
			double	dPS_Ion_Scale = cPS_Log_Tau.Get_Value(lpdDays[uiI]);
			double	dPS_Ion_Temp = cPS_Ion_Temp.Get_Value(lpdDays[uiI]);
			double	dHVF_Ion_Scale = cHVF_Log_Tau.Get_Value(lpdDays[uiI]);
			double	dHVF_Ion_Temp = cHVF_Ion_Temp.Get_Value(lpdDays[uiI]);

			CompareFits(cTarget, cOpacity_Map_Ejecta,cOpacity_Map_Shell, uiIon, lpdDays[uiI], dPS_Vel, dPS_Temp, dPS_Ion_Temp, dPS_Ion_Scale, dHVF_Ion_Temp, dHVF_Ion_Scale, cSpectra[uiI]);
			fprintf(fileOutParameters,"%.0f,%i,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\n",lpdDays[uiI], uiIon, dPS_Vel, dPS_Temp, dPS_Ion_Scale, dPS_Ion_Temp, dHVF_Ion_Scale, dHVF_Ion_Temp);
		}
		fclose(fileOutParameters);

		if (bNo_Title)
			lpszTitle[0] = 0;
		else if (bUse_Sourcedir_Title && bUse_Ref_Model_Title_In_Filename)
			sprintf(lpszTitle,"%s : %s", lpszSourceDir, lpszReference_Model_Title);
		else if (bUse_Sourcedir_Title)
			strcpy(lpszTitle,lpszSourceDir);
		else if (bWith_Shell)
			sprintf(lpszTitle,"%s: Vps %.1f Tps %.2f tps %.2f Tpsi %.2f thv %.2f Thv %.2f",lpszSourceDir,cPS_Vel.dRef25,cPS_Temp.dRef25,cPS_Log_Tau.dRef25,cPS_Ion_Temp.dRef25,cHVF_Log_Tau.dRef25,cHVF_Ion_Temp.dRef25);
		else
			sprintf(lpszTitle,"%s: Vps %.1f Tps %.2f tps %.2f Tpsi %.2f",lpszSourceDir,cPS_Vel.dRef25,cPS_Temp.dRef25,cPS_Log_Tau.dRef25,cPS_Ion_Temp.dRef25);
//		printf("Plotting\n");
		if (bUse_Ref_Model_Title_In_Filename)
			sprintf(lpszOutput_Filename,"%s.%s.user.%i.%s.full.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon,lpszReference_Model_Title);
		else
			sprintf(lpszOutput_Filename,"%s.%s.user.%i.full.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon);

		PlotSeries(cSpectra, lpdDays, NULL, uiDays_Count, lpszOutput_Filename, cTarget.wl(0), cTarget.wl(cTarget.size() - 1), bLinear_Scale, lpszTitle, -1.0, false, false, -1.0,lpcReference_Spectra,lpdReference_Day, uiNum_Reference_Spectra);
		if (bUse_Ref_Model_Title_In_Filename)
			sprintf(lpszOutput_Filename,"%s.%s.user.%i.%s.CaNIR.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon,lpszReference_Model_Title);
		else
			sprintf(lpszOutput_Filename,"%s.%s.user.%i.CaNIR.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon);
		PlotSeries(cSpectra, lpdDays, NULL, uiDays_Count, lpszOutput_Filename, 7000.0, 9000.0, bLinear_Scale, lpszTitle, -1.0, true, true, 8579.0,lpcReference_Spectra,lpdReference_Day, uiNum_Reference_Spectra, 7400.0, 8300.0);
		if (bUse_Ref_Model_Title_In_Filename)
			sprintf(lpszOutput_Filename,"%s.%s.user.%i.%s.CaHK.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon,lpszReference_Model_Title);
		else
			sprintf(lpszOutput_Filename,"%s.%s.user.%i.CaHK.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon);
		PlotSeries(cSpectra, lpdDays, NULL, uiDays_Count, lpszOutput_Filename, 3000.0, 5000.0, bLinear_Scale, lpszTitle, -1.0, true, true, 3945.0,lpcReference_Spectra,lpdReference_Day, uiNum_Reference_Spectra, 3500.0, 4300.0);
		if (bUse_Ref_Model_Title_In_Filename)
			sprintf(lpszOutput_Filename,"%s.%s.user.%i.%s.Si6355.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon,lpszReference_Model_Title);
		else
			sprintf(lpszOutput_Filename,"%s.%s.user.%i.Si6355.eps",lpszOutput_File_Prefix,lpszSourceDir, uiIon);
		PlotSeries(cSpectra, lpdDays, NULL, uiDays_Count, lpszOutput_Filename, 5000.0, 7000.0, bLinear_Scale, lpszTitle, -1.0, true, true, 6355.0,lpcReference_Spectra,lpdReference_Day, uiNum_Reference_Spectra, 5500.0, 6500.0);
		for (unsigned int uiI = 0; uiI < uiDays_Count; uiI++)
		{
			sprintf(lpszOutput_Filename,"%s.%s.user.%i.day%.2f.csv",lpszOutput_File_Prefix,lpszSourceDir,uiIon,lpdDays[uiI]);
			FILE * fileOut = fopen(lpszOutput_Filename,"wt");
			for (unsigned int uiJ = 0; uiJ < cSpectra[uiI].size(); uiJ++)
				fprintf(fileOut, "%f %f %f\n",cSpectra[uiI].wl(uiJ), cSpectra[uiI].flux(uiJ), cSpectra[uiI].flux_error(uiJ));
			fclose(fileOut);
		}
		printf("Done\n");
	}		

	return 0;
}
Ejemplo n.º 3
0
void Plotter::Special(View&, InputSpecial inType, float x, float y, float p1, float p2, float /*p3*/, float /*p4*/, int button_state)
{
    if(inType == InputSpecialScroll) {
        const float d[2] = {p1,-p2};
        const float is[2] = {rview.x.Size(),rview.y.Size() };
        const float df[2] = {is[0]*d[0]/(float)v.w, is[1]*d[1]/(float)v.h};

        ScrollView(-df[0], -df[1]);
    } else if(inType == InputSpecialZoom) {
        float scalex = 1.0;
        float scaley = 1.0;

#ifdef _OSX_
        if (button_state & KeyModifierCmd) {
#else
        if (button_state & KeyModifierCtrl) {
#endif
            scalex = 1-p1;
        }else{
            scaley = 1-p1;
        }

        const float c[2] = {
            track || trigger_edge ? last_track_val[0] : hover[0],
            hover[1]
        };

        ScaleView(scalex, scaley, c[0], c[1]);
    }

    // Update hover status (after potential resizing)
    ScreenToPlot( (int)x, (int)y, hover[0], hover[1]);
}

void Plotter::AddSeries(const std::string& x_expr, const std::string& y_expr,
    DrawingMode drawing_mode, Colour colour,
    const std::string& title, DataLog *log)
{
    if( !std::isfinite(colour.r) ) {
        colour = colour_wheel.GetUniqueColour();
    }
    plotseries.push_back( PlotSeries() );
    plotseries.back().CreatePlot(x_expr, y_expr, colour, (title == "$y") ? y_expr : title);
    plotseries.back().log = log;
    plotseries.back().drawing_mode = (GLenum)drawing_mode;
}

void Plotter::ClearSeries()
{
    plotseries.clear();
}

Marker& Plotter::AddMarker(Marker::Direction d, float value, Marker::Equality leg, Colour c )
{
    return AddMarker(Marker(d,value,leg,c));
}

Marker& Plotter::AddMarker( const Marker& marker )
{
    plotmarkers.push_back( marker );
    return plotmarkers.back();
}