язок між елементами і їх координатами у файл .
Методом SetBiggSmall ініціалізується поле Smaller класу TTriangleLst. За таким алгоритмом: перебираючи всі відрізки від другого до останнього потрібно порівняти їх з кожним відрізком (від першого - до останнього) в списку (окрім самого себе). В разі, якщо відрізок менший від Smaller (що спочатку вказує на перший елемент списку) то Smaller змінює своє значення на значення активного на даній ітерації елементу списку.
Функція Cross є основою програми, вона повертає булевський результат пересічення двох відрізків, поданих на вхід функції. В тілі функції відбувається складна перевірка координат відрізків, на основі системи рівнянь прямої.
Метод Filter концептуально не відрізняється від SetBiggSmall. Перебираючи всі елементи списку, для кожного (з допомогою функції Cross) перевіряється його пересічення з будь-яким іншим, і в разі позитивного результату перевірки результат відображається в полі Crossed класу TTriangle. Таким чином виконується фільтрація елементів згідно завдання курсової роботи.
Власне код функції main виконує послідовний визов функцій-членів і додаткових пояснень не потребує.
Список використаних джерел
- Методичні вказівки до виконання курсової роботи. Вінниця, ВДТУ - 1998.
- Страуструп Б. Язык программирования Си++. Москва, Радио и связь - 1991.
- Керниган, Ричи. Язык C. В электронном виде.
Додатки
Додаток А. Лістинг програми
#include <StdIo.h>
#include <ConIo.h>
#include <Graphics.h>
#include <Math.h>
#include <StdLib.h>
#include <String.h>
#include <FStream.h>Boolean
{= 0, True = 1
};char Byte;TListItem;TListItem
{* Next;* Prev;
};TList
{:ItemCount;* FirstItem;* CurrItem;();void Add(TListItem* Item);void Del();void Clear();~TList();
};
//*** TList methods::TList()
{= 0;= 0;= FirstItem;
};TList::Add(TListItem* Item)
{>Next = 0;>Prev = CurrItem;(CurrItem != 0)>Next = Item;= Item;= Item;++;
};TList::Del()
{* Item;* PrevItem;= CurrItem->Prev;= CurrItem->Next;>Prev = PrevItem;(CurrItem);= Item;-;
};TList::Clear()
{= FirstItem;(FirstItem != 0)
{= FirstItem->Next;();= FirstItem;
};
};::~TList()
{();
};
//*** Ctrls
#define VK_ESC 27
#define VK_ENTER 13
#define VK_LEFT 75
#define VK_RIGHT 77
#define VK_UP 72
#define VK_DOWN 80
#define VK_DEL 83
#define VK_BACK 8
#define LF = 10
#define CF = 13
#define CR = CF+LFchar TCaption[12+1];TExitFlag
{, efNext, efPrev
};TObject :public TListItem
{
//*** Abstract
};TApplication;void (*PButtonClick)(void* Sender);void (TApplication::*PAppButtonClick)(void* Sender);TControl:public TObject
{
//*** Предок всех элементов управления,
//*** содержит свойства для работы в TControlList:X, Y;Color, BkCol, ActiveCol;Active;ExitFlag;Tag;Caption;(Byte AX, Byte AY, TCaption ACaption, Byte ACol, Byte ABkCol,Byte AActiveCol,int ATag);void SetClr(Byte AItem, Byte ACol);void Enter();void Exit();void Draw() = 0;
~TControl(){};
};TButton :public TControl
{:* Owner;onClick;(TApplication* AOwner, Byte AX, Byte AY, TCaption ACaption, int ATag, PAppButtonClick AClick);void Draw();void Enter();void Run();
~TButton(){};
};TControlLst :public TList
{
//*** Динамический список элементов управления:();Run();void Repaint();
};TApplication
{:(){};
};TProga;ReadKey(char* Key, Boolean* CtrlKey);
//*** Types and declarationsTPoint
{X,Y;
};TLinePnt: public TListItem
{:Pnt;(){}
};TRect
{Left, Top, Right, Bottom;
};TShape: public TListItem
{
//*** Предок всех фигур,
//*** содержит свойства для работы в TShapeList:Crossed;Color;Tag;(){Color = RED; Tag = 0;};(Byte ACol, int ATag);void SetClr(Byte ACol);void Draw() = 0;~TShape();
};TLine: public TShape
};TTriangle: public TShape
{:A, B, C;Area;Smaller;(TPoint AA, TPoint AB, TPoint AC, Byte ACol, int ATag);void Draw();SetArea();void SetClr(Byte ACol);
};TShapeLst: public TList
{
//*** Динамический список фигур ***):* Smaller;();void Repaint();void LoadFromFile(char* FileName) = 0;void SaveToFile(char* FileName) = 0;
};TTriangleLst: public TShapeLst
{:* Line;();void Generate(int ACount);void LoadFromFile(char* FileName);void SaveToFile(char* FileName);SaveCrossedTria(char* FileName);void Filter();Boolean Cross(TLine* Item, TLine* SubItem);void SetBiggSmall();void Repaint();
};Power(long X)
{(X*X);
};GetLength(TPoint P1, TPoint P2)
{Result;= Power(P2.X - P1.X) + Power(P2.Y - P1.Y);(Result > 0)= sqrt(Result);//*** Иначе координаты двух точек равны= 0;(Result);
};
//*** TShape methodsTShape::TShape(Byte ACol, int ATag)
{= ACol;= ATag;
};TShape::SetClr(Byte ACol)
{= ACol;
};::~TShape()
{
//*** must be
};
//*** TLine methods::TLine(TPoint AA, TPoint AB, Byte ACol, int ATag): TShape(ACol,ATag)
{= AA;= AB;= SetLen();= False;
};TLine::SetLen()
{(GetLength(A,B));
};TLine::Draw()
{(Crossed)(YELLOW);(Color);(A.X, A.Y, B.X, B.Y);
};
//*** TTriangle methods::TTriangle(TPoint AA, TPoint AB, TPoint AC, Byte ACol, int ATag):(ACol,ATag)
{= TLine(AA,AB,Color,0);= TLine(AB,AC,Color,0);= TLine(AC,AA,Color,0);= False;= SetArea();= False;
};TTriangle::SetArea()
{P = A.Len + B.Len + C.Len;(sqrt(P*(P-A.Len)*(P-B.Len)*(P-C.Len)));
};TTriangle::SetClr(Byte ACol)
{.SetClr(ACol);.SetClr(ACol);.SetClr(ACol);
};TTriangle::Draw()
{(Crossed)
{.SetClr(YELLOW);.SetClr(YELLOW);.SetClr(YELLOW);
};(Smaller)
{.SetClr(BLUE);.SetClr(BLUE);.SetClr(BLUE);
};.Draw();.Draw();.Draw();
};
//*** TShapeLst methods::TShapeLst():TList()
{= 0;
};TShapeLst::Repaint()
{* Item;= (TShape*)FirstItem;(Item)
{>Draw();= (TShape*)Item->Next;
};
};
//*** TTrianlgeLst methods::TTriangleLst(): TShapeLst()
{
//*** must be
};TTriangleLst::Generate(int ACount)
{I;A, B, C;* T;(I = 1; I <= ACount; I++)
{.X = 50+random(450);.Y = 100+random(200);.X = A.X+random(50);.Y = A.Y-random(100);.X = B.X + (B.X - A.X);.Y = A.Y;= new TTriangle(A,B,C,GREEN,I);(T);
};.X = 50+random(450);.Y = 100+random(200);.X = 50+random(400);.Y = 100+random(300);= new TLine(A,B,WHITE,0);
};TTriangleLst::LoadFromFile(char* FileName)
{* Item;A, B, C;f;(f.open(FileName,ios::in) == 0)("Не могу открыть входной файл %s",FileName);from(&f);>> (A.X);.get();>> (A.Y);.get();>> (B.X);.get();>> (B.Y);.get();.get();= new TLine(A,B,WHITE,0);(!(from.eof()))
{>> (A.X);.get();>> (A.Y);.get();>> (B.X);.get();>> (B.Y);.get();>> (C.X);.get();>> (C.Y);.get();.get();= new TTriangle(A,B,C,GREEN,0);(Item);
};.close();
};TTriangleLst::SaveToFile(char* FileName)
{* Item;(FileName);f;(f.open(FileName,ios::out) == 0)("Не могу открыть выходной файл %s",FileName);to(&f);<< (Line->A.X) << '\n';<< (Line->A.Y) << '\n';<< (Line->B.X) << '\n';<< (Line->B.Y) << '\n';<< '\n';= (TTriangle*)FirstItem;(Item)
{<< (Item->A.A.X) << '\n';<< (Item->A.A.Y) << '\n';<< (Item->B.A.X) << '\n';<< (Item->B.A.Y) << '\n';<< (Item->C.A.X) << '\n';<< (Item->C.A.Y) << '\n';(Item->Next)<< '\n';= (TTriangle*)Item->Next;
};.close();("Tria.dat");
};TTriangleLst::SaveCrossedTria(char* FileName)
{* Item;(FileName);f;(f.open(FileName,ios::out) == 0)("Не могу открыть выходной файл %s",FileName);to(&f);= (TTriangle*)FirstItem;(Item)
{(Item->Crossed)
{<< (Item->A.A.X) << '\n';<< (Item->A.A.Y) << '\n';<< (Item->B.A.X) << '\n';<< (Item->B.A.Y) << '\n';<< (Item->C.A.X) << '\n';<< (Item->C.A.Y) << '\n';(Item->Next)<< '\n';
};= (TTriangle*)Item->Next;
};.close();
};TTriangleLst::SetBiggSmall()
{* Item;= (TShape*)FirstItem;= (TTriangle*)FirstItem->Next;(Item)
};
((TTriangle*)Smaller)->Smaller = True;
};TTriangleLst::Cross(TLine* Item, TLine* SubItem)
{x,y;x11 = Item->A.X, y11 = Item->A.Y;x12 = Item->B.X, y12 = Item->B.Y;x21 = SubItem->A.X, y21 = SubItem->A.Y;x22 = SubItem->B.X, y22 = SubItem->B.Y;b1,b2,d,dx,dy;k11,k12,k21,k22;
//*** Вычисл.= y12-y11;= x11-x12;= y22-y21;= x21-x22;= x11*k11+y11*k12;= x21*k21+y21*k22;= k11*k22-k12*k21;= b1*k22-b2*k12;= k11*b2-b1*k21;(d != 0)= dx/d;= dx;(d != 0)= dy/d;= dy;Result = False;//*** Дефолтово НЕ пересекаются(
(((x11<=x)&&(x<=x12))&&((y11<=y)&&(y<=y12))||
((x12<=x)&&(x<=x11))&&((y11<=y)&&(y<=y12))||
((x11<=x)&&(x<=x12))&&((y12<=y)&&(y<=y11))||
((x12<=x)&&(x<=x11))&&((y12<=y)&&(y<=y11)))
&&
(((x21<=x)&&(x<=x22))&&((y21<=y)&&(y<=y22))||
((x22<=x)&&(x<=x21))&&((y21<=y)&&(y<=y22))||
((x21<=x)&&(x<=x22))&&((y22<=y)&&(y<=y21))||
((x22<=x)&&(x<=x21))&&((y22<=y)&&(y<=y21))))= True;(Result);
};TTriangleLst::Filter()
{* Item;Accept;= (TTriangle*)FirstItem;(Item)
{= False;((Cross(&(Item->A),Line)) ||
(Cross(&(Item->B),Line)) ||
(Cross(&(Item->C),Line)))= True;(Accept)
{>Crossed = True;
};= (TTriangle*)Item->Next;
};
};TTriangleLst::Repaint()
{::Repaint();>Draw();
};TProgaMenu :public TControlLst
{:Repaint();
};TProga :public TApplication
{:Menu;Tag;Lines;MainMenu();onNew;onLoad;onSave;onRun;onExit;doNew(void* Sender);doLoad(void* Sender);doSave(void* Sender);doExit(void* Sender);doRun(void* Sender);BkRepaint();();
};
//*******************************************************
// RealiZation
//*******************************************************
//*** TControl methods::TControl(Byte AX, Byte AY, TCaption ACaption, Byte ACol, Byte ABkCol,Byte AActiveCol,int ATag)
{= efNext;= AX;= AY;(Caption,ACaption);= ACol;= ABkCol;= AActiveCol;= False;= ATag;
};TControl::SetClr(Byte AItem, Byte ACol)
{(AItem)
{0:Color = ACol;break;1:ActiveCol = ACol;break;2:BkCol = ACol;
};
};TControl::Enter()
{= True;();
};TControl::Exit()
{= False;();
};
//*** TButtons methods::TButton(TApplication* AOwner, Byte AX, Byte AY, TCaption ACaption, int ATag, PAppButtonClick AClick):(AX,AY,ACaption,BLUE,LIGHTGRAY,RED,ATag)
{= AOwner;= AClick;();
};TButton::Draw()
{text_info ti;(&ti);(X,Y);(Active)(ActiveCol);(BkCol);(Color);(int I = 0;I < strlen(Caption);I++)(Caption[I]);(ti.attribute);
};TButton::Enter()
{::Enter();();
};TButton::Run()
{Key;CtrlKey;Quit;= False;
{(&Key,&CtrlKey);(Key)
{VK_UP:if (CtrlKey)
{= True;= efPrev;
};break;VK_ENTER:
{= True;= efNext;
((Owner)->*onClick)(this);
};break;VK_DOWN:if (CtrlKey)
{= True;= efNext;
};break;VK_ESC:
{= True;= efExit;
};break;
};();
} while (!Quit);();
};
//*** TControlList methods::TControlLst():TList()
{
//must be
};TControlLst::Repaint()
{* Item = (TControl*)FirstItem;(Item)
};
};TControlLst::Run()
{
//*** CurrItem тут - синоним ActiveControl= FirstItem;
{
((TControl*)CurrItem)->Enter();(((TControl*)CurrItem)->ExitFlag)
{efNext:if (CurrItem->Next)= CurrItem->Next;break;efPrev:if (CurrItem->Prev)= CurrItem->Prev;break;
};();
} while ( !((TControl*)CurrItem)->ExitFlag == efExit );
};
//*** TProgaMenu methodsTProgaMenu::Repaint()
{::Repaint();
};ReadKey(char* Key, Boolean* CtrlKey)
{
*Key = getch();(*Key == 0)
{
*Key = getch();
*CtrlKey = True;
}
*CtrlKey = False;
};* DltChr(char* S,int Pos)
{
//*** S - строка, Pos - номер удаляемого символа (начиная с 1)* Begin = S;I = 1;(*S)
{(I >= Pos)
*S = *(S+1);++;++;
};(Begin);
};* InsChr(char* S,int Pos, char Ch)
{
//*** S - строка, Pos - номер вставляемого символа Ch* Begin = S;Chr;I = 1;(*S)
{(I >= Pos)
{= *S;
*S = Ch;= Chr;
};++;++;
};
*S = Ch;(Begin);
};
//*** TProga methods::TProga():TApplication()
{= (PAppButtonClick)&TProga::doNew;= (PAppButtonClick)&TProga::doLoad;= (PAppButtonClick)&TProga::doSave;= (PAppButtonClick)&TProga::doRun;= (PAppButtonClick)&TProga::doExit;
};TProga::MainMenu()
{* Btn;= new TButton(this,2,2," Новий ",1,onNew);.Add(Btn);= new TButton(this,2,3," Зчитати ",2,onLoad/*&doLoad*/);.Add(Btn);= new TButton(this,2,4," Записати ",3,onSave);.Add(Btn);= new TButton(this,2,5," Запуск ",4,onRun);.Add(Btn);= new TButton(this,2,6," Вихiд ",4,onExit);.Add(Btn);();.Repaint();.Run();
};TProga::doNew(void* Sender)
{.Clear();();.Generate(26);(0);
};TProga::doLoad(void* Sender)
{.Clear();.LoadFromFile("Test.dat");(0);
};TProga::doSave(void* Sender)
{.SaveToFile("test.dat");
};TProga::doExit(void* Sender)
{
((TControl*)(Menu.CurrItem))->ExitFlag = efExit;
};TProga::doRun(void* Sender)
{I;BLen, SLen, Len;* S;grDriver, grMode, errorcode;= DETECT;(&grDriver, &grMode,"..\\BGI\\");.Filter();.SetBiggSmall();
//*** Инфа("%d треугольников\n",Lines.ItemCount);("Синий - наименьший\n");("Желтым - те, что пересекаются с линией\n");("Белым - линия\n");.Repaint();();();();
};TProga::BkRepaint()
{(0);(7);();(int I = 1;I <= 25;I++)(int J = 1;J <= 80;J++)('░');(I = 20;I < 70;I++)
{(I,4);('═');
};(I = 20;I < 70;I++)
{(I,8);('═');
};(20,5);("%-50s","Курсова робота з програмування");(20,6);("%50s","Перевiряючий:");(20,7);("%50s","Черняк О. I.");(I = 53;I < 70;I++)
{(I,21);('═');
};(I = 53;I < 70;I++)
{(I,23);('═');
};(53,22);("%s","ВДТУ, ФIТКI, 2001");
};
//*** Mainmain()
{Proga;.MainMenu();(0);
}