Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
30.04.2019
Размер:
4.34 Кб
Скачать
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "DSeries2.h"

//---------------------------------------------------------------------------
__fastcall TDSeries2::TDSeries2()
{
	MaxData = 0;
	MaxY = 0;
	MarkStart = -1;
	MarkEnd = -1;
	nScale = 1;
        nLimit = 0;
	type = typeContinuous;
}

void TDSeries2::Bind(TPaintBox *target){
	target->OnPaint = this->Paint;
	targets.push_back(target);
}

void TDSeries2::Update(){
	for(vector<TPaintBox *>::iterator i = targets.begin(); i != targets.end(); i++){
		(*i)->Repaint();
	}
}

void __fastcall TDSeries2::Paint(TObject *pSender){
	int nMax = MaxData; // Сколько элементов по ширине
	if(!nMax)
		nMax = data.size();
	if(!nMax)
		return;
        int limit = nLimit?nLimit:nMax*nScale;
	double fMaxY = MaxY; // Максимальный размер по высоте
	if(!fMaxY){
		vector<double>::iterator i = data.begin();
		fMaxY = fabs(*i);
		for(i++; i != data.end(); i++)
			if(fabs(*i) > fMaxY)
				fMaxY = fabs(*i);
	}


	TPaintBox* Target = (TPaintBox*)pSender;
	TCanvas *Canvas = Target->Canvas;
	int Height = Target->Height;
	int Width = Target->Width;

	// Итого: имеем nMax - сколько надо по ширине и fShowY - максимум по высоте
	double fShowY = fMaxY * (Height + 40)/Height;

	Canvas->Brush->Color = clWhite;
	Canvas->Pen->Color = clBlack;
	Canvas->Rectangle(0,0, Width, Height);
	// Рисуем оси

	Canvas->MoveTo(0, Height/2);
	Canvas->LineTo(Width, Height/2);
	Canvas->TextOutA(Width - Canvas->TextExtent("T").cx - 1, Height/2 + 1, "T");
	TSize numSize = Canvas->TextExtent(IntToStr(limit));
	Canvas->TextOutA(Width - numSize.cx - 2, Height/2 - numSize.cy - 1 , IntToStr(limit));

	int nMarks = (((Height / 20) + 1) >> 1) << 1;
	if(nMarks == 0)
		return;
	if(fShowY == 0)
		return;
	vector<AnsiString> marks(nMarks+1);
	vector<int> lengths(nMarks+1);
	int nCharHeight;
	for(int i = 0; i <= nMarks; i++){
		marks[i].sprintf("%.2g", fMaxY - 2.0*fMaxY*i/nMarks);
		SIZE s = Canvas->TextExtent(marks[i]);
		lengths[i] = s.cx;
		nCharHeight = s.cy;
	}
	int nOffset = *max_element(lengths.begin(), lengths.end()) + 3;

	for(int i = 0; i <= nMarks; i++){
		int nY = (0.5 - 0.5 * (fMaxY - 2.0*fMaxY*i/nMarks)/fShowY) * Height;
		Canvas->MoveTo(nOffset - 1, nY);
		Canvas->LineTo(nOffset + 2, nY);
		Canvas->TextOutA(nOffset - lengths[i] - 2, nY - nCharHeight/2, marks[i]);
	}

	Canvas->MoveTo(nOffset, 0);
	Canvas->LineTo(nOffset, Height);
//	Canvas->TextOutA(1, 1, "F");

	// Рисуем Caption
	TSize captionSize = Canvas->TextExtent(caption);
	Canvas->TextOut(Width - captionSize.cx - 2, 1, caption);

	if(!nMax)
		return;

	Canvas->Pen->Color = clBlue;
	Canvas->Brush->Color = clBlue;

	double nStep = (double)(Width - nOffset - 10) / ((double)limit/nScale);

	if(type == typeContinuous){
		Canvas->MoveTo(nOffset, (0.5 - 0.5*data[0] / fShowY) * Height);

		for(int i = 0; i < nMax; i++){
			Canvas->LineTo(nOffset + nStep*i, (0.5 - 0.5*data[i] / fShowY) * Height);
			Canvas->LineTo(nOffset + nStep* (i+1), (0.5 - 0.5*data[i] / fShowY) * Height);
		}
	}
	else{
		for(int i = 0; i < nMax; i++){
			// Рисуем рисочку
			for(int j = 0; j < nScale && i*nScale + j < limit; j++){
				Canvas->Pen->Color = clBlack;
				Canvas->MoveTo(nOffset + nStep*i + j*nStep/nScale, 0.5*Height - 1);
				Canvas->LineTo(nOffset + nStep*i + j*nStep/nScale, 0.5*Height + 2);
			}


			Canvas->Pen->Color = clBlue;
			Canvas->MoveTo(nOffset + nStep*i, 0.5 * Height);
			Canvas->LineTo(nOffset + nStep*i, (0.5 - 0.5*data[i] / fShowY) * Height);

			const int nESize = 2;

			Canvas->Ellipse(nOffset + nStep*i - nESize, (0.5 - 0.5*data[i] / fShowY) * Height - nESize ,
				nOffset + nStep*i + nESize + 1, (0.5 - 0.5*data[i] / fShowY) * Height + nESize + 1);
//			Canvas->LineTo(nOffset + nStep* (i+1), (0.5 - 0.5*data[i] / fShowY) * Height);*/
		}
	}

	if(MarkStart >= 0 && MarkStart < data.size()){
		Canvas->Pen->Color = clRed;
		Canvas->MoveTo(nOffset + nStep*MarkStart, 0);
		Canvas->LineTo(nOffset + nStep*MarkStart, Height);
	}

	if(MarkEnd >= 0 && MarkEnd <= data.size()){
		Canvas->Pen->Color = clRed;
		Canvas->MoveTo(nOffset + nStep*MarkEnd, 0);
		Canvas->LineTo(nOffset + nStep*MarkEnd, Height);
	}
}
Соседние файлы в папке Drawer_1