//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Chart.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall TPChart::TPChart(TCanvas *Canvas, int px, int py, int sx, int sy, double rx, double ry) { FCanvas = Canvas; rect.left = px; rect.top = py; rect.width = sx; rect.height = sy; repeatx = 1; repeaty = 1; ratio(rx, ry); } //--------------------------------------------------------------------------- __fastcall TPChart::TPChart(TCanvas *Canvas, int px, int py, int sx, int sy, double rx, double ry, int rpx, int rpy, int kind) { FCanvas = Canvas; rect.left = px; rect.top = py; rect.width = sx; rect.height = sy; switch (kind) { case 0: repeatx = rpx; repeaty = rpy; break; case 1: repeatx = 1; repeaty = rpy; break; case 2: repeatx = rpx; repeaty = 1; break; } ratio(rx, ry); } //--------------------------------------------------------------------------- __fastcall TPChart::~TPChart() { } //--------------------------------------------------------------------------- void __fastcall TPChart::outline(int s) { int x, y, sx, sy, tx[3], ty[3]; tx[0] = ratio.x < 4.0 ? 10 : (ratio.x < 8.0 ? 5 : 1); tx[1] = 5*tx[0]; tx[2] = 2*tx[1]; ty[0] = ratio.y < 4.0 ? 10 : (ratio.y < 8.0 ? 5 : 1); ty[1] = 5*ty[0]; ty[2] = 2*ty[1]; sx = ChartSx + rect.left; FCanvas->Pen->Color = clBlack; FCanvas->Brush->Color = clWhite; FCanvas->Rectangle(sx, rect.top, sx+rect.width*ratio.x, rect.top+rect.height*ratio.y); if (s&8) { for (x = 1; x < rect.width; x++) { FCanvas->MoveTo(sx+x*ratio.x, rect.top+1); FCanvas->LineTo(sx+x*ratio.x, rect.top+rect.height*ratio.y-1); } for (y=1; yMoveTo(sx+1, rect.top+y*ratio.y); FCanvas->LineTo(sx+rect.width*ratio.x-1, rect.top+y*ratio.y); } } else { for (x=1; xMoveTo(sx, rect.top+1); FCanvas->LineTo(sx, rect.top+rect.height*ratio.y-1); } } else if (x%tx[1]==0) { if (s&2) { sy = rect.top+rect.height*ratio.y-1; for (y=rect.top+1; yMoveTo(sx, y); FCanvas->LineTo(sx, y+(sy-y>10 ? 10: sy-y)); } } } else if (x%tx[0]==0) { if (s&1) { for (y=1; yPixels[sx][rect.top+y*ratio.y] = clBlack; } } } } for (y=1; yMoveTo(sx+1, sy); FCanvas->LineTo(sx+rect.width*ratio.x-1, sy); } } else if ((rect.height-y)%ty[1]==0) { if (s&2) { sx = ChartSx+rect.left+rect.width*ratio.x-1; for (x=ChartSx+rect.left+1; xMoveTo(x, sy); FCanvas->LineTo(x+(sx-x>10 ? 10: sx-x), sy); } } } } } sy = rect.top+rect.height*ratio.y+3; for (x=0; x<=rect.width; x++) { sx = ChartSx+rect.left+x*ratio.x; if (x%tx[2]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx, sy+17); if (xTextOut(sx+4, sy+6, AnsiString(x)); } } else if (x%tx[1]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx, sy+11); } else if (x%tx[0]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx, sy+5); } } sx = ChartSx+rect.left-3; for (y=0; y<=rect.height; y++) { sy = rect.top+(rect.height-y)*ratio.y; if (y%ty[2]==0) { FCanvas->MoveTo(sx-17, sy); FCanvas->LineTo(sx, sy); if (yTextOut(sx-29, sy-20, AnsiString(y)); } } else if (y%ty[1]==0) { FCanvas->MoveTo(sx-11, sy); FCanvas->LineTo(sx, sy); } else if (y%ty[0]==0) { FCanvas->MoveTo(sx-5, sy); FCanvas->LineTo(sx, sy); } } } //--------------------------------------------------------------------------- void __fastcall TPChart::outline_repeat(int s) { int x, y, sx, sy, w, h, tx[3], ty[3]; tx[0] = ratio.x < 4.0 ? 10 : (ratio.x < 8.0 ? 5 : 1); tx[1] = 5*tx[0]; tx[2] = 2*tx[1]; ty[0] = ratio.y < 4.0 ? 10 : (ratio.y < 8.0 ? 5 : 1); ty[1] = 5*ty[0]; ty[2] = 2*ty[1]; sx = ChartSx + rect.left; w = rect.width * repeatx; h = rect.height * repeaty; FCanvas->Pen->Color = clBlack; FCanvas->Brush->Color = clWhite; FCanvas->Rectangle(sx, rect.top, sx + w * ratio.x, rect.top + h * ratio.y); for (x=1; x < w; x++) { sx = ChartSx + rect.left + x*ratio.x; if (x % tx[2] == 0) { FCanvas->Pen->Color = clBlack; FCanvas->MoveTo(sx, rect.top + 1); FCanvas->LineTo(sx, rect.top + h*ratio.y-1); } else if (x % tx[1]==0) { FCanvas->Pen->Color = clBlack; sy = rect.top + h * ratio.y-1; for (y = rect.top+1; y < sy; y+=15) { FCanvas->MoveTo(sx, y); FCanvas->LineTo(sx, y+(sy-y>10 ? 10: sy-y)); } } else if (x % rect.width == 0) { FCanvas->Pen->Color = clRed; FCanvas->MoveTo(sx, rect.top + 1); FCanvas->LineTo(sx, rect.top + h*ratio.y-1); } else if (x % tx[0]==0) { for (y = 1; y < h; y++) { if (y % ty[0]==0) FCanvas->Pixels[sx][rect.top+y*ratio.y] = clBlack; } } } for (y = 1; y < h; y++) { sy = rect.top + y * ratio.y; if ((h - y) % ty[2]==0) { FCanvas->Pen->Color = clBlack; sx = ChartSx+rect.left; FCanvas->MoveTo(sx+1, sy); FCanvas->LineTo(sx + w * ratio.x-1, sy); } else if ((h - y) % ty[1]==0) { FCanvas->Pen->Color = clBlack; sx = ChartSx + rect.left + w * ratio.x-1; for (x = ChartSx+rect.left+1; x < sx; x+=15) { FCanvas->MoveTo(x, sy); FCanvas->LineTo(x+(sx-x>10 ? 10: sx-x), sy); } } else if ((h - y) % rect.height == 0) { FCanvas->Pen->Color = clRed; sx = ChartSx+rect.left; FCanvas->MoveTo(sx+1, sy); FCanvas->LineTo(sx + w * ratio.x-1, sy); } } sy = rect.top + h * ratio.y + 3; for (x = 0; x <= w; x++) { sx = ChartSx + rect.left + x*ratio.x; if (x%tx[2]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx, sy+17); if (x < rect.width) { FCanvas->TextOut(sx+4, sy+6, AnsiString(x)); } } else if (x % tx[1]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx, sy+11); } else if (x % tx[0]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx, sy+5); } } sx = ChartSx + rect.left-3; for (y=0; y <= h; y++) { sy = rect.top + (h - y) * ratio.y; if (y % ty[2]==0) { FCanvas->MoveTo(sx-17, sy); FCanvas->LineTo(sx, sy); if (y < h) { FCanvas->TextOut(sx-29, sy-20, AnsiString(y)); } } else if (y % ty[1]==0) { FCanvas->MoveTo(sx-11, sy); FCanvas->LineTo(sx, sy); } else if (y % ty[0]==0) { FCanvas->MoveTo(sx-5, sy); FCanvas->LineTo(sx, sy); } } } //--------------------------------------------------------------------------- void __fastcall TPChart::outline(int s, double dw, double dc) { int x, y, sx, sy, cy, tx[3], ty[3], cnt; double dx, dy; tx[0] = ratio.x<4.0 ? 10 : (ratio.x<8.0 ? 5 : 1); tx[1] = 5*tx[0]; tx[2] = 2*tx[1]; ty[0] = ratio.y<4.0 ? 10 : (ratio.y<8.0 ? 5 : 1); ty[1] = 5*ty[0]; ty[2] = 2*ty[1]; sx = ChartSx+rect.left; cy = ChartSy; FCanvas->Pen->Color = clBlack; FCanvas->Brush->Color = clWhite; FCanvas->Rectangle(sx, cy+rect.top, sx+rect.width*ratio.x, cy+rect.top+rect.height*ratio.y); if (s&8) { for (x=1; xMoveTo(sx+x*ratio.x, cy+rect.top+1); FCanvas->LineTo(sx+x*ratio.x, cy+rect.top+rect.height*ratio.y-1); } for (y=1; yMoveTo(sx+1, cy+rect.top+y*ratio.y); FCanvas->LineTo(sx+rect.width*ratio.x-1, cy+rect.top+y*ratio.y); } } else { for (x=1; xMoveTo(sx, cy+rect.top+1); FCanvas->LineTo(sx, cy+rect.top+rect.height*ratio.y-1); } } else if (x%tx[1]==0) { if (s&2) { sy = cy+rect.top+rect.height*ratio.y-1; for (y=cy+rect.top+1; yMoveTo(sx, y); FCanvas->LineTo(sx, y+(sy-y>10 ? 10: sy-y)); } } } else if (x%tx[0]==0) { if (s&1) { for (y=1; yPixels[sx][ChartSy+rect.top+y*ratio.y] = clBlack; } } } } for (y=1; yMoveTo(sx+1, sy); FCanvas->LineTo(sx+rect.width*ratio.x-1, sy); } } else if ((rect.height-y)%ty[1]==0) { if (s&2) { sx = ChartSx+rect.left+rect.width*ratio.x-1; for (x=ChartSx+rect.left+1; xMoveTo(x, sy); FCanvas->LineTo(x+(sx-x>10 ? 10: sx-x), sy); } } } } } dx = 0.0; cnt = 0; sx = 0; sy = ChartSy-1; while (dxMoveTo(ChartSx+sx, sy-17); FCanvas->LineTo(ChartSx+sx, sy); FCanvas->TextOut(ChartSx+sx+4, sy-20, AnsiString((int)cnt/10)); } else if (cnt%tx[1]==0) { FCanvas->MoveTo(ChartSx+sx, sy-11); FCanvas->LineTo(ChartSx+sx, sy); } else if (cnt%tx[0]==0) { FCanvas->MoveTo(ChartSx+sx, sy-5); FCanvas->LineTo(ChartSx+sx, sy); } dx += dw; sx = dx+0.5; cnt++; } dy = ChartSy+rect.height*ratio.y; cnt = 0; sy = ChartSy+rect.height*ratio.y; sx = ChartSx+rect.width*ratio.x+1; while (dy>=ChartSy) { if (cnt%ty[2]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx+17, sy); if (sy-20>=ChartSy) FCanvas->TextOut(sx+4, sy-20, AnsiString((int)cnt/10)); } else if (cnt%ty[1]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx+11, sy); } else if (cnt%ty[0]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx+5, sy); } dy -= dc; sy = dy+0.5; cnt++; } FCanvas->TextOut(ChartSx+15, ChartSy-21, "Inch"); sy = cy+rect.top+rect.height*ratio.y+3; for (x=0; x<=rect.width; x++) { sx = ChartSx+rect.left+x*ratio.x; if (x%tx[2]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx, sy+17); if (xTextOut(sx+4, sy+6, AnsiString(x)); } else if (x%tx[1]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx, sy+11); } else if (x%tx[0]==0) { FCanvas->MoveTo(sx, sy); FCanvas->LineTo(sx, sy+5); } } sx = ChartSx+rect.left-3; for (y=0; y<=rect.height; y++) { sy = cy+rect.top+(rect.height-y)*ratio.y; if (y%ty[2]==0) { FCanvas->MoveTo(sx-17, sy); FCanvas->LineTo(sx, sy); if (yTextOut(sx-29, sy-20, AnsiString(y)); } else if (y%ty[1]==0) { FCanvas->MoveTo(sx-11, sy); FCanvas->LineTo(sx, sy); } else if (y%ty[0]==0) { FCanvas->MoveTo(sx-5, sy); FCanvas->LineTo(sx, sy); } } } //--------------------------------------------------------------------------- void __fastcall TPChart::point(int x, int y, TColor c) { int sx, sy, tx, ty; sx = ChartSx+rect.left+1+x*ratio.x; sy = rect.top + 1 + ((rect.height * repeaty) - y - 1) * ratio.y; tx = (ratio.x-1)*0.15; ty = (ratio.y-1)*0.15; if (tx && ty) { FCanvas->Pen->Color = c; FCanvas->Brush->Color = c; FCanvas->Rectangle(sx+tx, sy+ty, sx+ratio.x-2-tx, sy+ratio.y-2-ty); } else { if (ratio.x == 2) { FCanvas->Pixels[sx][sy] = clRed; } else { FCanvas->Pen->Color = c; FCanvas->Brush->Color = c; FCanvas->Rectangle(sx, sy, sx+ratio.x-1, sy+ratio.y-1); } } } //---------------------------------------------------------------------------