Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] построение графа


Автор: DrWeb 1.12.2007, 01:04
нужно нарисовать бесконтурный граф по матрице весов smile .Можно не код,а хотя бы алгоритм или навеять мысль smile 

реализовать надо на Turbo C++ 3.0

Автор: Kuvaldis 1.12.2007, 01:41

M
Kuvaldis
Не забываем указывать язык программирования в названии темы

Автор: Puoar 1.12.2007, 06:20
Цитата(DrWeb @  1.12.2007,  01:04 Найти цитируемый пост)
реализовать надо на Turbo C++ 3.0

В чем сложность? Если не надо использовать графику то можно подумать...  

Автор: DrWeb 1.12.2007, 14:54
нужно в графическом режиме нарисовать. я думал так: через rand создать массивы y-координат и х-координат.затем расставить точки по созданным координатам и соединить их линиями.надо подумать-у меня есть время до 6 декабря-дата когда надо сдать индивидуалку.строить граф не обязательно,но мне хочется это сделать.подскажите хотя бы алгоритм или ченить подобноеsmile

Автор: Puoar 1.12.2007, 16:24
Ок я что-то подобное делал но в текстовом режиме просто точки расставлял по монитору, до шестого напишу сюда или в PM если не зделаешь...

Автор: DrWeb 1.12.2007, 17:01
придумал 

Код

#include <graphics.h>
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

int Gd=DETECT,Gm,ErrC;
int mx,my;
int maxnodes=20;

void init_graph();
void draw_graf();
int rnd(int,int);

int rnd(int a,int b)
{
 return a+abs(random(b-a+1));
}

void init_graph()
{
 clrscr();
 initgraph(&Gd,&Gm,"\drivers");
 ErrC=graphresult();
 if (ErrC!=grOk)
 {
  cout<<"Error:"<<grapherrormsg(ErrC);
  getch();
  exit(-1);
 }
 setbkcolor(BLACK);
 mx=getmaxx();
 my=getmaxy();
}

void draw_graf()
{
 int y_c[20],x_c[20],i,j,tmp;
 for (i=1;i<=maxnodes;i++)
 {
  tmp=rnd(15,200);
  for (j=1;j<=i;j++)
   if (tmp==x_c[j])
    tmp=rnd(15,200);
   x_c[i]=tmp;
 }
  for (i=1;i<=maxnodes;i++)
 {
  tmp=rnd(15,200);
  for (j=1;j<=i;j++)
   if (tmp==y_c[j])
    tmp=rnd(15,200);
  y_c[i]=tmp;
 }
 for (i=1;i<=maxnodes;i++)
  cout<<x_c[i]<<" ";
 cout<<endl;
 for (i=1;i<=maxnodes;i++)
  cout<<y_c[i]<<" ";
 for (i=1;i<=maxnodes;i++)
 {
  circle(x_c[i],y_c[i],2);
  if (i+1<=maxnodes)
   line(x_c[i],y_c[i],x_c[i+1],y_c[i+1]);
 }
}

main()
{
 clrscr();
 init_graph();
 draw_graf();
 getch();
 return 0;
}



ток теперь надо придумать как сделать чтобы рисунок нормально видно было smile 

Автор: DrWeb 1.12.2007, 18:08
написал:строится граф по матрице весов дуг.осталось придумать как номера вершин расставить и направления,но основная работа сделана smile 
Код

#include <graphics.h>
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

int Gd=DETECT,Gm,ErrC;
int mx,my;
int maxnodes=0;
int a[20][20];

void init_graph();
void draw_graf();
int rnd(int,int);

int rnd(int a,int b)
{
 return a+abs(random(b-a+1));
}

void init_graph()
{
 clrscr();
 initgraph(&Gd,&Gm,"\drivers");
 ErrC=graphresult();
 if (ErrC!=grOk)
 {
  cout<<"Error:"<<grapherrormsg(ErrC);
  getch();
  exit(-1);
 }
 setbkcolor(BLACK);
 mx=getmaxx();
 my=getmaxy();
}

void draw_graf()
{
 int y_c[20],x_c[20],i,j,tmp;
 int rad=2;
 for (i=1;i<=maxnodes;i++)
 {
  tmp=rnd(mx/2-100,mx/2+100);
  for (j=1;j<=i;j++)
   if (tmp==x_c[j])
    tmp=rnd(mx/2-100,mx/2+100);
  x_c[i]=tmp;
 }
 for (i=1;i<=maxnodes;i++)
 {
  tmp=rnd(my/2-100,my/2+100);
  for (j=1;j<=i;j++)
   if (tmp==y_c[j])
    tmp=rnd(my/2-100,my/2+100);
  y_c[i]=tmp;
 }
 for (i=1;i<=maxnodes;i++)
 {
  for (j=1;j<=maxnodes;j++)
   if (x_c[j]>x_c[j+1])
   {
    x_c[j]=x_c[j]+x_c[j+1];
    x_c[j+1]=x_c[j]-x_c[j+1];
    x_c[j]=x_c[j]-x_c[j+1];
   }
 }
 for (i=1;i<=maxnodes;i++)
 {
  if (x_c[i+1]-x_c[i]<=30)
   x_c[i+1]=x_c[i]+35;
 }
 x_c[1]=x_c[2]-35;
 for (i=1;i<=maxnodes;i++)
  cout<<x_c[i]<<" ";
 cout<<endl;
 for (i=1;i<=maxnodes;i++)
  cout<<y_c[i]<<" ";
 for (i=1;i<=maxnodes;i++)
  for (j=1;j<=maxnodes;j++)
 {
  setcolor(GREEN);
  circle(x_c[i],y_c[i],2);
  if (a[i][j]!=0)
   if (i+1<=maxnodes)
   {
    setcolor(BLUE);
    line(x_c[i],y_c[i],x_c[j],y_c[j]);
   }
 }
}

main()
{
 clrscr();
 cout<<"Enter maxnodes:";
 cin>>maxnodes;
 for (int i=1;i<=maxnodes;i++)
  for (int j=1;j<=maxnodes;j++)
  {
   cout<<"Enter a["<<i<<"]["<<j<<"] : ";
   cin>>a[i][j];
  }
 init_graph();
 draw_graf();
 getch();
 return 0;
}


Автор: DrWeb 1.12.2007, 18:24
чтобы расставить вершины я сделал.надо после нарисовки самой вершины дописать:
Код

char *p;
setcolor(RED);
outtextxy(x_c[i]-10,y_c[i],itoa(i,p,10));


вот mail где я генерирую матрицу
Код

main()
{
 clrscr();
 cout<<"Enter maxnodes:";
 cin>>maxnodes;
 for (int i=1;i<=maxnodes;i++)
  for (int j=1;j<=maxnodes;j++)
  {
   a[i][j]=rnd(0,3);
   cout<<a[i][j]<<" ";
  }
 init_graph();
 draw_graf();
 getch();
 return 0;
}



если вершин больше 9,то граф строитс,но прога сразу вылетает с ошибкой и компилятор вырубается.че не так?подскажите? smile

Добавлено @ 18:35
до меня дошло!! smile 
вот тут ошибка
Код

outtextxy(x_c[i]-10,y_c[i],itoa(i,p,10));


так надо smile 
Код

outtextxy(x_c[i]-10,y_c[i],itoa(i,p,50));


похоже свою проблему я сам и решил smile 

Автор: Puoar 3.12.2007, 12:32
Цитата(DrWeb @  1.12.2007,  18:24 Найти цитируемый пост)
похоже свою проблему я сам и решил

+1 smile
Я так и не нашел тот исходник, но помню что основная проблема была с вычислением позиции всего графа  и каждой точки на плоскости(мониторе) процентном соотношении чтоб он весь вместился ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)