Пример программы «Олимпийские кольца»
Текст программы:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Canvas->Pen->Width=1;
Canvas->Pen->Color=clBlack;
Canvas->Brush->Color =clCream;
Canvas->Rectangle(30,30,700,500);
Canvas->Pen->Width=5;
Canvas->Brush-> Style=bsClear;
Canvas->Pen->Color=clBlue;
Canvas->Ellipse(150,140,310,300);
Canvas->Pen->Color=clBlack;
Canvas->Ellipse(270,140,430,300);
Canvas->Pen->Color=clRed;
Canvas->Ellipse(380,140,540,300);
Canvas->Pen->Color=clYellow;
Canvas->Ellipse(210,230,370,390);
Canvas->Pen->Color=clGreen;
Canvas->Ellipse(330,230,490,390);
}
struct point // структура из координат x,y
{ int x,y;
};
point l;
enum pos {h,v,left,right,up,down}; // переключатель: горизинтально, вертикально,
//влево, вправо, сверху, внизу
TCanvas *t; // поверхность холста - указатель t
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
t=Image1->Canvas; // поверхность рисунка (холст) - Image1->Canvas
}
//---------------------------------------------------------------------------
//подпрограмма передачи координаты x,y переменной структуры l
void set(int x, int y)
{ l.x = x;
l.y = y;
}
void set(point p)
{
l.x = p.x;
l.y = p.y;
}
// треугольник вправо
void triangle1(int x,int y)
{
t->MoveTo(x+20,y+8);
t->LineTo(x+20,y+18);
t->MoveTo(x+20,y+8);
t->LineTo(x+29,y+14);
t->MoveTo(x+29,y+14);
t->LineTo(x+20,y+18);
}
// треугольник вверх
void triangle(int x,int y)
{
t->MoveTo(x+20,y+8);
t->LineTo(x+15,y+18);
t->MoveTo(x+20,y+8);
t->LineTo(x+25,y+18);
t->MoveTo(x+15,y+18);
t->LineTo(x+25,y+18);
}
//антенна
void A(int x, int y)
{
t->MoveTo(x+20,y+8);
t->LineTo(x+20,y+28);
t->MoveTo(x+20,y+18);
t->LineTo(x+30,y+8);
t->MoveTo(x+20,y+18);
t->LineTo(x+10,y+8);
}
// транзистор
void tr(int x, int y)
{
t->MoveTo(x,y+26);
t->LineTo(x+24,y+26);
t->MoveTo(x+24,y+13);
t->LineTo(x+24,y+40);
t->MoveTo(x+24,y+25);
t->LineTo(x+40,y+15);
t->MoveTo(x+24,y+27);
t->LineTo(x+34,y+34);
//стрелка
t->MoveTo(x+40,y+40);
t->LineTo(x+29,y+36);
t->MoveTo(x+40,y+40);
t->LineTo(x+35,y+30);
t->MoveTo(x+35,y+30);
t->LineTo(x+29,y+36);
}
// подпрограмма изображения точки соединения (закрашенный круг)
void kf(void)
{
t->Brush->Color=clBlack;
t->Ellipse(l.x-3,l.y-3,l.x+3,l.y+3);
t->FloodFill(l.x,l.y,clBlack,fsBorder);
t->Brush->Style=bsClear;
}
// подпрограмма изображения линий соединений: горизонтальных и вертикальных
void q(int len,pos q)
{
t->MoveTo(l.x,l.y); //установить начало линии
if(q){
t->LineTo(l.x,l.y+len); // линия вертикальная
l.y+=len;
}else{
t->LineTo(l.x+len,l.y); // линия горизонтальная
l.x+=len;
}
}
// резистор: вертикальный или горизонтальный(с надписью)
void R(pos q,String s,pos p){
if(q){
t->Rectangle(l.x-7,l.y,l.x+7,l.y+40); // резистор вертикальный
switch(p){
case left:t->TextOutA(l.x-6-s.Length()*7,l.y+15,s);break; // надпись слева
case right:t->TextOutA(l.x+10,l.y+15,s);break; // надпись справа
}
l.y = l.y+40;
}else{
t->Rectangle(l.x,l.y-7,l.x+40,l.y+7); // резистор горизонтальный
switch(p){
case up:t->TextOutA(l.x+12,l.y-20,s);break; // надпись над элементом
case down:t->TextOutA(l.x+2,l.y+8,s);break; // надпись под элементом
}
l.x+=+40;
}
}
// конденсатор (емкость) : вертикальный или горизонтальный(с надписью)
void C(pos q,String s,pos p){
if(q){ // конденсатор для вертикальной линии
t->MoveTo(l.x-12,l.y);
t->LineTo(l.x+12,l.y);
t->MoveTo(l.x-12,l.y+5);
t->LineTo(l.x+12,l.y+5);
switch(p){
case left:t->TextOutA(l.x-7-s.Length()*10,l.y+2,s);break; // надпись слева
case right:t->TextOutA(l.x+15,l.y+0,s);break; // надпись справа
}
l.y += 5;
}else{ // конденсатор для горизонтальной линии
t->MoveTo(l.x,l.y-12);
t->LineTo(l.x,l.y+12);
t->MoveTo(l.x+5,l.y-12);
t->LineTo(l.x+5,l.y+12);
switch(p){
case up:t->TextOutA(l.x+2,l.y-24,s);break; // надпись над элементом
case down:t->TextOutA(l.x-2,l.y+12,s);break; // надпись под элементом
}
l.x += 5;
}
}
// индуктивность: вертикальная или горизонтальная (с надписью)
void L(pos q,String s,pos p){
if(q){ // индуктивность горизонтальная
for (int i=0;i<3;i++)
t->Arc(l.x-4,l.y+i*10,l.x+4,l.y+i*10+10,l.x,l.y+i*10+10,l.x,l.y+i*10);
switch(p){
case left:t->TextOutA(l.x-2-s.Length()*6,l.y+3,s);break; // надпись слева
case right:t->TextOutA(l.x+8,l.y-10,s);break; // надпись справа
}
l.y += 30;
}else{ // индуктивность вертикальная
for (int i=0;i<3;i++)
t->Arc(l.x+i*10,l.y-4,l.x+i*10+10,l.y+5,l.x+i*10+10,l.y,l.x+i*10,l.y);
switch(p){
case up:t->TextOutA(l.x+8,l.y-20,s);break; // надпись над элементом
case down:t->TextOutA(l.x+8,l.y+6,s);break; // надпись под элементом
}
l.x += 30;
}
}
// текст
void text (int x, int y,String s)
{
t->TextOutA(l.x,l.y,s);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
point s0,s1,s2,s3,s4,s5,s6;
triangle(300,50);
set(320,69);q(15,v);
R(v,"2.2K",right); q(10,v);kf();q(20,v);kf();s0=l;
q(30,h);kf();s1=l;
q(20,h); C(h,"10мк",up); q(30,h);
R(h,"400...680",down); q(25,h);
triangle1(450,141.5);
set(s1);q(20,v);C(v,"12*",right); q(20,v);kf();
q(20,v); C(v,"18",right); q(19,v);q(-35,h);
set(s0);q(7,v);L(v,"9вит",left); q(7,v);kf();s2=l;
q(30,h);
set(240,90);q(20,h); set(250,90); q(18,v);
C(v,"10n",right); q(20,v);kf(); s3=l;q(70,h);
set(s3); q(15,v);R(v,"100K*",left);q(10,v);kf();s4=l;
q(20,h);C(h,"50мк",up); q(20,h); q(45,v); q(25,h);kf(); s6=l;
q(15,v);R(v,"100",left);q(25,v);q(-10,h); q(20,h);
A(160,130); set(180,145);q(20,v); C(v,"12",left); q(20,v); kf();s5=l;
q(10,h); q(7,v); L(v,"5вит",right); q(7,v); q(-10,h);
set(s5);q(-10,h); q(20,v);C(v,"27",left); q(19,v);
q(10,h);q(15,v);q(-10,h);q(20,h);
set(175,255); q(10,h);
set(192,221);q(20,h);C(h,"50мк",down); q(80,h); tr(280,195);
set(s2); q(13,v); set(s6); q(-9,v);
set(s4);q(24,v);kf();
//подписи :
set(200,270);text (200,270,"P,1991.12.60");
set(360,240);text (360,240,"KT315Б");
set(480,150);text (480,150,"к УЗЧ");
set(310,40);text (310,40,"+3B");
set(205,208);text (205,208,"+");
set(260,185);text (205,208,"+");
}