Добавил:
nyan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:4 курс - Трояновский / ПИУС / ПЦР / ПЦР-2005 / Drawer_1 / DSeries2
.cpp//---------------------------------------------------------------------------
#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