PDA

View Full Version : سوال: چطور میشه یک ماتریس رو به گراف تبدیل کرد؟



asefy2008
شنبه 08 خرداد 1389, 12:23 عصر
سلام
من یک ماتریس n*n دارم می خوام اون رو به صورت یک گراف نمایش بدم، دوستان راهی می شناسن؟
(هرخونه ماتریس در صورت true بودن نشان دهنده یک ارتباط بین دو گره هست-قطر اصلی صفر هست-گره ها اندیس آرایه هستن یعنی از 0 تا n)
دوستان اگه با کد راهنمایی کنن یا sample بدن بینهایت ممنون میشم.

با تشکر

exlord
شنبه 08 خرداد 1389, 13:46 عصر
private void button1_Click(object sender, EventArgs e)
{
Pen p = new Pen(Color.Black);
Graphics g = this.CreateGraphics();
Dictionary<int, Point> points = new Dictionary<int, Point>();

points.Add(0, new Point(100, 100));
points.Add(1, new Point(200, 100));
points.Add(2, new Point(100, 200));
points.Add(3, new Point(200, 200));
points.Add(4, new Point(100, 300));
foreach (Point item in points.Values)
{
g.DrawEllipse(p, item.X - 2, item.Y - 2, 4, 4);
}

int[,] matris = new int[5, 5] {
{0,1,0,1,1},
{0,0,1,0,0},
{1,0,0,1,0},
{0,1,1,0,1},
{0,1,0,1,0}
};

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (matris[i, j] == 1)
{
g.DrawLine(p, points[i], points[j]);
}
}
}
}

asefy2008
شنبه 08 خرداد 1389, 21:52 عصر
ممنون دوست عزیز
حالا یه سوال دارم چطور می تونم یک شماره مثلا 1 رو در یک گره قرار بدم(چون می خوام داخل هر گره یک شماره باشه تا معلوم بشه گره اول کجا و یا آخره)
بازم از کد ممنون، کلی کارم رو راه انداخت

exlord
یک شنبه 09 خرداد 1389, 08:44 صبح
foreach (Point item in points.Values)
{
g.DrawEllipse(p, item.X - 2, item.Y - 2, 4, 4);
}


به جای بالایی اینو بزار ......

SolidBrush b = new SolidBrush(Color.Red);
Font f = new Font("Lucida Console", 10);

foreach (var item in points)
{
g.DrawEllipse(p, item.Value.X - 4, item.Value.Y - 4, 8, 8);
g.DrawString(item.Key.ToString(), f, b, item.Value);
}

asefy2008
یک شنبه 09 خرداد 1389, 10:04 صبح
خیلی ممنون
و یک سوال دیگه نمیشه این خط های بین گره ها به صورت جهت دار باشه؟ (به سمت یکی از گره ها)

asefy2008
یک شنبه 09 خرداد 1389, 10:54 صبح
در ضمن چون تعداد گره ها از پیش مشخص نیست(یعنی بعد از یکسری پردازش تعداد گره ها و ارتباط بین آنها بدست می آید) بنابراین وقتی گره ها رسم میشه (از طریق قطعه کد بالا) ممکن هست یکسری خطوط روی هم قرار بگیره برای رفع این مشکل راهی وجود داره؟

exlord
یک شنبه 09 خرداد 1389, 11:16 صبح
//-------------------------------
Pen arrowP = new Pen(Color.Blue);
arrowP.EndCap = System.Drawing.Drawing2D.LineCap.Custom;
arrowP.CustomEndCap = new System.Drawing.Drawing2D.AdjustableArrowCap(5, 5);
//-------------------------------



if (matris[i, j] == 1)
{
Point point3 = new Point();
point3.X = ((points[i].X + points[j].X) / 2);
point3.Y = ((points[i].Y + points[j].Y) / 2);
if (i > j)
{
point3.X = point3.X - 20;
point3.Y = point3.Y - 20;
}
else
{
point3.X = point3.X + 20;
point3.Y = point3.Y + 20;
}
g.DrawCurve(arrowP, new Point[] { points[i], point3, points[j] });

}

asefy2008
یک شنبه 09 خرداد 1389, 11:34 صبح
میشه بگی این کد رو چطور استفاده کنم؟:خجالت:

exlord
یک شنبه 09 خرداد 1389, 12:01 عصر
private void button1_Click(object sender, EventArgs e)
{
Pen p = new Pen(Color.Black);
//-------------------------------
Pen arrowP = new Pen(Color.Blue);
arrowP.EndCap = System.Drawing.Drawing2D.LineCap.Custom;
arrowP.CustomEndCap = new System.Drawing.Drawing2D.AdjustableArrowCap(5, 5);
//-------------------------------
Graphics g = this.CreateGraphics();
Dictionary<int, Point> points = new Dictionary<int, Point>();
SolidBrush b = new SolidBrush(Color.Red);
Font f = new Font("Lucida Console", 10);

points.Add(0, new Point(100, 100));
points.Add(1, new Point(200, 100));
points.Add(2, new Point(100, 200));
points.Add(3, new Point(200, 200));
points.Add(4, new Point(100, 300));
foreach (var item in points)
{
g.DrawEllipse(p, item.Value.X - 4, item.Value.Y - 4, 8, 8);
g.DrawString(item.Key.ToString(), f, b, item.Value);
}

int[,] matris = new int[5, 5] {
{0,1,0,1,1},
{0,0,1,0,0},
{1,0,0,1,0},
{0,1,1,0,1},
{0,1,0,1,0}
};

for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (matris[i, j] == 1)
{
Point point3 = new Point();
point3.X = ((points[i].X + points[j].X) / 2);
point3.Y = ((points[i].Y + points[j].Y) / 2);
if (i > j)
{
point3.X = point3.X - 20;
point3.Y = point3.Y - 20;
}
else
{
point3.X = point3.X + 20;
point3.Y = point3.Y + 20;
}
g.DrawCurve(arrowP, new Point[] { points[i], point3, points[j] });

}
}
}
}

asefy2008
جمعه 14 خرداد 1389, 00:52 صبح
یه سوال دیگه
چطور میشه از این شکل رسم شده پرینت گرفت؟
آیا میشه ذخیرش هم کرد(save as)؟
و دیگه این که چطور میتونم گره ها رو به صورت مرتب شده داشته باشم چون همون طور که گفتم تعداد گره ها ثابت نیست ممکنه یک دفعه 2 گره باشه یه دفعه 40 گره . خوب این طوری خطوط ممکنه با هم اشتباه بشن(از نظر کاربر) و این که خود کاربر بتونه جای گره ها رو تغییر بده (با موس) طبیعتا باید جای خطوط ارتباطی بین گره ها هم، به همراه تغییر مکان گره، تغییر کنه

tefos666
جمعه 14 خرداد 1389, 11:06 صبح
با استفاده از Delegate كه خروجي اون List<> باشه بهتر ميتوني اينكار رو انجام بدي.

exlord
شنبه 15 خرداد 1389, 12:08 عصر
یه سوال دیگه
چطور میشه از این شکل رسم شده پرینت گرفت؟
آیا میشه ذخیرش هم کرد(save as)؟
و دیگه این که چطور میتونم گره ها رو به صورت مرتب شده داشته باشم چون همون طور که گفتم تعداد گره ها ثابت نیست ممکنه یک دفعه 2 گره باشه یه دفعه 40 گره . خوب این طوری خطوط ممکنه با هم اشتباه بشن(از نظر کاربر) و این که خود کاربر بتونه جای گره ها رو تغییر بده (با موس) طبیعتا باید جای خطوط ارتباطی بین گره ها هم، به همراه تغییر مکان گره، تغییر کنه

خودت نمی خوای کاری بکنی ؟؟ همشو می خوای من بنویسم برات ؟؟ اینجوری هیچی یاد نمیگیری هاااااااااااا !!!!!!!!!!!!

exlord
شنبه 15 خرداد 1389, 13:17 عصر
این مال درگ پوینت ها :

private bool loaded = false;
private bool draging = false;
private Point dragingPoint;
private int dragingPointIndex;
Pen p = new Pen(Color.Black);
Pen arrowP = new Pen(Color.Blue);
Graphics g;
Dictionary<int, Point> points = new Dictionary<int, Point>();
SolidBrush b = new SolidBrush(Color.Red);
Font f = new Font("Lucida Console", 10);
int[,] matris;
private void button1_Click(object sender, EventArgs e)
{
arrowP.EndCap = System.Drawing.Drawing2D.LineCap.Custom;
arrowP.CustomEndCap = new System.Drawing.Drawing2D.AdjustableArrowCap(5, 5);
//-------------------------------
g = this.CreateGraphics();


points.Add(0, new Point(100, 100));
points.Add(1, new Point(200, 100));
points.Add(2, new Point(100, 200));
points.Add(3, new Point(200, 200));
points.Add(4, new Point(100, 300));


matris = new int[5, 5] {
{0,1,0,1,1},
{0,0,1,0,0},
{1,0,0,1,0},
{0,1,1,0,1},
{0,1,0,1,0}
};
loaded = true;
this.Invalidate();
}

private void matristograf_Paint(object sender, PaintEventArgs e)
{
if (loaded)
{
foreach (var item in points)
{
g.DrawEllipse(p, item.Value.X - 4, item.Value.Y - 4, 8, 8);
g.DrawString(item.Key.ToString(), f, b, item.Value);
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (matris[i, j] == 1)
{
Point point3 = new Point();
point3.X = ((points[i].X + points[j].X) / 2);
point3.Y = ((points[i].Y + points[j].Y) / 2);
if (i > j)
{
point3.X = point3.X - 20;
point3.Y = point3.Y - 20;
}
else
{
point3.X = point3.X + 20;
point3.Y = point3.Y + 20;
}
g.DrawCurve(arrowP, new Point[] { points[i], point3, points[j] });

}
}
}
}
}

int initX;
int initY;
private void matristograf_MouseDown(object sender, MouseEventArgs e)
{
initX = e.X;
initY = e.Y;
foreach (var p in this.points)
{
if (p.Value.X + 4 >= initX && p.Value.X - 4 <= initX)
{
if (p.Value.Y + 4 >= initY && p.Value.Y - 4 <= initY)
{
this.Cursor = Cursors.SizeAll;
draging = true;
dragingPointIndex = p.Key;
return;
}
}
}
this.Cursor = Cursors.Default;
}

private void matristograf_MouseMove(object sender, MouseEventArgs e)
{
if (draging)
{
dragingPoint = this.points[dragingPointIndex];
dragingPoint.X = e.X;
dragingPoint.Y = e.Y;
this.points[dragingPointIndex] = dragingPoint;
this.Invalidate();
}
}

private void matristograf_MouseUp(object sender, MouseEventArgs e)
{
draging = false;
this.Cursor = Cursors.Default;
}

exlord
شنبه 15 خرداد 1389, 13:24 عصر
یه سوال دیگه
چطور میشه از این شکل رسم شده پرینت گرفت؟
آیا میشه ذخیرش هم کرد(save as)؟
و دیگه این که چطور میتونم گره ها رو به صورت مرتب شده داشته باشم چون همون طور که گفتم تعداد گره ها ثابت نیست ممکنه یک دفعه 2 گره باشه یه دفعه 40 گره .
پرینت و ذخیره سادن خودت فکر کن .... بگرد اگه نتونستی میگم ....
منظورت از مرتب شده چیه؟

Dictionary<int, Point> points = new Dictionary<int, Point>();مگه این collection گره ها رو نگه نمیداره ... خوب هرجوری میخوای تو runtime بهش گره ها تو اضافه من ....
حالا اینکه میخوای گره هارو چجوری تو صفحه بچینی به خودت بستگی داره ..... من اینجوری چیدم .... تو میتونی روی یه دایره بچینی ....

points.Add(0, new Point(100, 100));

points.Add(شماره مختصات , شماره گره);

asefy2008
دوشنبه 17 خرداد 1389, 02:12 صبح
خودت نمی خوای کاری بکنی ؟؟ همشو می خوای من بنویسم برات ؟؟ اینجوری هیچی یاد نمیگیری هاااااااااااا !!!!!!!!!!!!
چرا خیلی دوست دارم کار کنم ولی یک استاد داریم از ما خواسته تو 10 روز یک پروژه بنویسیم که کد بگیره و گراف اون رو رسم کنه( تقریبا یک شبهه کامپایلر باید بنویسم) حالا شما خودت رو جای من آماتور بزار ببین می تونی بدون کمک دوستان و اساتید این برنامه به این بزرگی رو بنویسی.


این مال درگ پوینت ها
ممنون عالی بود:خجالت:


پرینت و ذخیره سادن خودت فکر کن .... بگرد اگه نتونستی میگم ....
آقا شرمنده، گشتم چندتا نمونه هم تو این سایت و چند تا سایت دیگه پیدا کردم ولی مشکلم رو حل نکرد اگر لطف کنی و بزاری، واقعا شرمندم می کنی (گرچه تا همین جا هم کلی زحمت کشیدی)


منظورت از مرتب شده چیه؟
دقیقا منظورم چینش بود که به نظر میرسه به خودم بر میگرده

exlord
سه شنبه 18 خرداد 1389, 10:48 صبح
برو حالشو ببر .......
update : ماتریسشم میتونی الان ببینی .......