Форум — Ответы ( К темам )
? | gali: C++ (17-05-2003 08:54:32) |
Помогите построить граф, заданный матрицей смежности, или подскажите какие-нибудь графические библиотеки в C++ Builder | |
Георгий (17-05-2003 10:57:56) | |
давай определимся что тебе именно надо: 1. построить в памяти машины граф (например, чтоб потом что-то считать по нему) 2. вывести на экран картинку похожую на граф | |
gali (17-05-2003 13:44:20) | |
Спасибо за ответ. Мне нужно построить "картинку, похожую на граф"
| |
Георгий (17-05-2003 17:58:15) | |
компонентов я не знаю, но сейчас за 1,5 часа написал такой код: TForm1 *Form1; static Graphics::TBitmap *bmp=0; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { bmp=new Graphics::TBitmap; bmp->Width=200; bmp->Height=200; } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1Paint(TObject *Sender) { if (bmp) { this->PaintBox1->Canvas->Draw(0,0,bmp); } } //--------------------------------------------------------------------------- __fastcall TForm1::~TForm1() { bmp->FreeImage(); delete bmp; } void __fastcall TForm1::Button1Click(TObject *Sender) { //ñ÷èòàåì ÷èñëî óçëîâ TStrings * str=new TStringList; AnsiString str1; int i; for (i=0;i<10;i++) if (!this->StringGrid1->Cells[0][i].IsEmpty() && !this->StringGrid1->Cells[1][i].IsEmpty()) { if (str->IndexOf(this->StringGrid1->Cells[0][i])==-1)str->Add(this->StringGrid1->Cells[0][i]); if (str->IndexOf(this->StringGrid1->Cells[1][i])==-1)str->Add(this->StringGrid1->Cells[1][i]); }; this->Memo1->Lines->AddStrings(str); //ðàçäà¸ì êîîðäèíàòû óçëàì è ðèñóåì óçëû TRect* a=new TRect[str->Count]; for (i=0;i<str->Count;i++) { a[i].Left =(i%5)*40; a[i].Top =(i/5)*40; a[i].Right =a[i].Left+20; a[i].Bottom=a[i].Top +20; bmp->Canvas->Pen->Color=clBlack; bmp->Canvas->Pen->Style=psSolid; bmp->Canvas->Brush->Style=bsClear; bmp->Canvas->TextRect(a[i],a[i].Left+5,a[i].Top+5,str->Strings[i]); bmp->Canvas->Ellipse(a[i]); }; //ðèñóåì ñâÿçè TRect r1,r2; for (i=0;i<10;i++) if (!this->StringGrid1->Cells[0][i].IsEmpty() && !this->StringGrid1->Cells[1][i].IsEmpty()) { r1=a[str->IndexOf(this->StringGrid1->Cells[0][i])]; r2=a[str->IndexOf(this->StringGrid1->Cells[1][i])]; bmp->Canvas->MoveTo((r2.Left+r2.Right)/2,(r2.Top+r2.Bottom)/2); bmp->Canvas->LineTo((r1.Left+r1.Right)/2,(r1.Top+r1.Bottom)/2); }; delete[] a; delete str; this->PaintBox1->Refresh(); } вроде рисует узлы и связи между ними. если хочешь, то на почту могу прислать весь исходник | |
Георгий (18-05-2003 03:23:17) | |
а теперь с возможностью мышкой таскать узлы: TForm1 *Form1; static Graphics::TBitmap *bmp=0; static TStrings * str; static TRect* a; static TRect* movedPtr=0; static int move_x,move_y; bool Hit(const TRect& r,int X, int Y) { return (r.Left<X) && (r.Right >X) && (r.Top <Y) && (r.Bottom>Y); }; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { bmp=new Graphics::TBitmap; bmp->Width=200; bmp->Height=200; str=new TStringList; a=0; } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1Paint(TObject *Sender) { if (bmp) { this->PaintBox1->Canvas->Draw(0,0,bmp); } } //--------------------------------------------------------------------------- __fastcall TForm1::~TForm1() { bmp->FreeImage(); delete bmp; delete[] a; delete str; } void __fastcall TForm1::Button1Click(TObject *Sender) { //ñ÷èòàåì ÷èñëî óçëîâ str->Clear(); AnsiString str1; int i; for (i=0;i<10;i++) if (!this->StringGrid1->Cells[0][i].IsEmpty() && !this->StringGrid1->Cells[1][i].IsEmpty()) { if (str->IndexOf(this->StringGrid1->Cells[0][i])==-1)str->Add(this->StringGrid1->Cells[0][i]); if (str->IndexOf(this->StringGrid1->Cells[1][i])==-1)str->Add(this->StringGrid1->Cells[1][i]); }; this->Memo1->Lines->AddStrings(str); //ðàçäà¸ì êîîðäèíàòû óçëàì è ðèñóåì óçëû if (a) delete[]a; a=new TRect[str->Count]; for (i=0;i<str->Count;i++) { a[i].Left =(i%5)*40; a[i].Top =(i/5)*40; a[i].Right =a[i].Left+20; a[i].Bottom=a[i].Top +20; };//for (i=0;i<str->Count;i++) this->Button2->Click(); } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if (movedPtr) { movedPtr->Top +=Y-move_y; movedPtr->Bottom+=Y-move_y; movedPtr->Left +=X-move_x; movedPtr->Right +=X-move_x; move_y=Y; move_x=X; Button2->Click(); }; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { int i; bmp->Canvas->Brush->Style=bsSolid; bmp->Canvas->Brush->Color=clWhite; bmp->Canvas->FillRect(TRect(0,0,200,200)); for (i=0;i<str->Count;i++) { bmp->Canvas->Pen->Color=clBlack; bmp->Canvas->Pen->Style=psSolid; bmp->Canvas->Brush->Style=bsClear; bmp->Canvas->TextRect(a[i],a[i].Left+5,a[i].Top+5,str->Strings[i]); bmp->Canvas->Ellipse(a[i]); };//for (i=0;i<str->Count;i++) //ðèñóåì ñâÿçè TRect r1,r2; for (i=0;i<10;i++) if (!this->StringGrid1->Cells[0][i].IsEmpty() && !this->StringGrid1->Cells[1][i].IsEmpty()) { r1=a[str->IndexOf(this->StringGrid1->Cells[0][i])]; r2=a[str->IndexOf(this->StringGrid1->Cells[1][i])]; bmp->Canvas->MoveTo((r2.Left+r2.Right)/2,(r2.Top+r2.Bottom)/2); bmp->Canvas->LineTo((r1.Left+r1.Right)/2,(r1.Top+r1.Bottom)/2); }; this->PaintBox1->Refresh(); } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { //íàõîæèì íà ÷òî íàæàëè è ïîäãîòàâëèâàåì ýòî ê äâèæåíèþ int i; if (Button==mbLeft) { for (i=0;i<str->Count;i++) if (Hit(a[i],X,Y)){movedPtr=&a[i];move_x=X;move_y=Y;break;}; //isMoved=true; };//if (Button==mbLeft) } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { //äâèæåíèå îêîí÷åíî int i; if (Button==mbLeft && movedPtr) { movedPtr->Top +=Y-move_y; movedPtr->Bottom+=Y-move_y; movedPtr->Left +=X-move_x; movedPtr->Right +=X-move_x; Button2->Click(); //isMoved=true; };//if (Button==mbLeft) movedPtr=0; } //--------------------------------------------------------------------------- опять же — если кто заинтересовался, то могу выслать весь проект в архиве, по почте | |
Provider (18-05-2003 03:47:01) | |
Я заинтересовался!!! И даже очень... Вышли весь пожалуйста, если не трудно.... арес указан..... | |
gali (18-05-2003 08:35:47) | |
Спасибо, мне очень понравилось. Если можешь, то пришли мне по почте.
| |
Георгий (18-05-2003 10:11:29) | |
кто просил, тем послал, а если ещё будут желающие, то берите с georiestar.pisem.net — там это называется graph.rar
|