• برنامه پیدا کننده نزدیکترین راه در سی شارپ
    #1
    Note 
    سلام دوستان
    تو این پست یه برنامه بسیار جالب برای شما اوردم این برنامه ار میان نود هایی که شما میکشید نزدیکترین راه رو پیدا میکنه و نمایش میده.

    تصویر:

    [تصویر:  20140131-763-node.png]

    سورس برنامه:

    [CSHARP]using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Collections;
    using System.Drawing.Drawing2D;

    //this project downloaded from
    namespace Dijkstra
    {
    public partial class Main : Form
    {
    public Main()
    {
    InitializeComponent();
    }

    struct NodeStructure
    {
    public int NodeName;
    public Point Point;
    }
    struct JoinStructure
    {
    public int source;
    public int destination;
    public int joinLenght;
    public bool selected;
    }


    NodeStructure srcNode;
    ArrayList NodeList = new ArrayList();
    ArrayList JointList = new ArrayList();
    int startNode = -1, endNode = -1;

    private void processBtn_Click(object sender, EventArgs e)
    {
    string ErrText = JointList.Count == 0 ? "!...مسیری بین گره ها وجود ندارد" : startNode == -1 ? ".نقطه شروع مسیر مشخص نشده است" : endNode == -1 ? ".نقطه پایان مسیر مشخص نشده است" : null;
    if (JointList.Count == 0 || startNode == -1 || endNode == -1)
    {
    MessageBox.Show(ErrText, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
    return;
    }

    int n = NodeList.Count;
    float[] distance = new float[n], previous = new float[n];
    float[,] graph = new float[n, n];

    for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
    if (i == j) graph[i, j] = 0; else graph[i, j] = float.PositiveInfinity;
    for (int i = 0; i < JointList.Count; i++)
    graph[((JoinStructure)JointList[i]).source, ((JoinStructure)JointList[i]).destination] = ((JoinStructure)JointList[i]).joinLenght;
    for (int i = 0; i < n; i++)
    previous[i] = -1;
    for (int i = 0; i < n; i++)
    distance[i] = graph[startNode, i];
    do
    {
    int min = -1;
    for (int j = 0; j < n; j++)
    {
    if (min != -1)
    {
    if (distance[j] < distance[min] && distance[j] != -1) min = j;
    }
    else
    if (distance[j] != -1 && distance[j] != 0)
    min = j;
    }
    if (min == -1) break;
    for (int j = 0; j < n; j++)
    {
    if (distance[min] + graph[min, j] < distance[j])
    {
    distance[j] = distance[min] + graph[min, j];
    previous[j] = min;
    }
    }
    distance[min] = -1;
    }
    while (true);

    DrawPath();
    DikjstraPath(previous, endNode, (int)previous[endNode]);
    DrawAllNode();
    }

    private void Main_Load(object sender, EventArgs e)
    {
    srcNode.NodeName = -1;
    DrawPath();
    this.Cursor = Cursors.Hand;
    textBox1.Text = @"تعریف گره : 2 بار کلیک در محیط رنگی
    رسم مسیر : کلیک بر روی یک گره جهت شروع و کلیک روی گره دیگر جهت خاتمه مسیر. که میتواند یک طرفه یا 2 طرفه باشد.
    تعیین گره های شروع و پایان : راست کلیک رو گره مبدا جهت تعیین نقطه شروع مسیر و راست کلیک روی گره ی دیگر جهت تعیین نقطه پایان.
    ";
    }

    private void DikjstraPath(float[] path, int src, int dest)
    {
    if (dest == -1)
    {
    if (RecognizeJoint(startNode, src))
    DrawNearestPath(((NodeStructure)NodeList[startNode]).Point, ((NodeStructure)NodeList[src]).Point);
    }
    else
    {
    DrawNearestPath(((NodeStructure)NodeList[src]).Point, ((NodeStructure)NodeList[dest]).Point);
    DikjstraPath(path, dest, (int)path[dest]);
    }
    }

    void DrawNearestPath(Point src, Point dest)
    {
    Bitmap bmp = new Bitmap(graphBoardPB.Image);
    Graphics gph = Graphics.FromImage(bmp);
    gph.SmoothingMode = SmoothingMode.AntiAlias;
    gph.DrawLine(new Pen(Brushes.Gold, 5), src, dest);
    graphBoardPB.Image = bmp;
    }

    private void DrawNode(string nodeTxt, Point point, Brush TextColor, Brush BackColor)
    {
    Bitmap bmp = new Bitmap(graphBoardPB.Image);
    Graphics gph = Graphics.FromImage(bmp);
    gph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    gph.FillPie(BackColor, new Rectangle(point.X - 10, point.Y - 10, 20, 20), 0, 360);
    gph.DrawArc(new Pen(TextColor), new Rectangle(point.X - 10, point.Y - 10, 20, 20), 0, 360);
    gph.DrawString(nodeTxt, new Font("tahoma", 8, FontStyle.Bold), TextColor, new PointF(point.X - (gph.MeasureString(nodeTxt, new Font("tahoma", 8, FontStyle.Bold)).Width) / 2, point.Y - 6));
    graphBoardPB.Image = bmp;
    }

    private void DrawPath()
    {
    Bitmap bmp = new Bitmap(graphBoardPB.Width, graphBoardPB.Height);
    Graphics gph = Graphics.FromImage(bmp);
    gph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    gph.FillRectangle(Brushes.SkyBlue, new Rectangle(0, 0, bmp.Width, bmp.Height));
    for (int i = 0; i < JointList.Count; i++)
    {
    Point srcPoint = ((NodeStructure)NodeList[((JoinStructure)JointList[i]).source]).Point, destPoint = ((NodeStructure)NodeList[((JoinStructure)JointList[i]).destination]).Point;
    LinearGradientBrush gBrushe = new LinearGradientBrush(srcPoint, destPoint, Color.Transparent, Color.Black);
    gph.DrawLine(new Pen(gBrushe, 1), srcPoint, destPoint);
    gph.DrawString(((JoinStructure)JointList[i]).joinLenght.ToString(), new Font("tahoma", 6, FontStyle.Bold), Brushes.Black, new PointF((Math.Max(srcPoint.X, destPoint.X) + Math.Min(srcPoint.X, destPoint.X)) / 2, (Math.Max(srcPoint.Y, destPoint.Y) + Math.Min(srcPoint.Y, destPoint.Y)) / 2));
    Application.DoEvents();
    }
    graphBoardPB.Image = bmp;
    DrawAllNode();
    }

    private void DrawAllNode()
    {
    for (int i = 0; i < NodeList.Count; i++)
    {
    Brush brush = i == startNode || i == endNode ? Brushes.Gold : Brushes.WhiteSmoke;
    DrawNode(((NodeStructure)NodeList[i]).NodeName.ToString(), ((NodeStructure)NodeList[i]).Point, Brushes.Black, brush);
    }
    }

    private void ResetBtn_Click(object sender, EventArgs e)
    {
    Application.Restart();
    }

    private void graphBoardPB_MouseDoubleClick(object sender, MouseEventArgs e)
    {
    if (e.Button == MouseButtons.Left)
    {
    if (graphBoardPB.Cursor == Cursors.Cross)
    {
    DrawNode(NodeList.Count.ToString(), e.Location, Brushes.Black, Brushes.WhiteSmoke);
    NodeStructure Node = new NodeStructure();
    Node.NodeName = NodeList.Count;
    Node.Point = new Point(e.X, e.Y);
    NodeList.Add(Node);
    }
    else
    MessageBox.Show(".در این ناحیه گره دیگری وجود دارد و امکان ایجاد گره جدید وجود ندارد", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
    }
    }

    private void graphBoardPB_MouseClick(object sender, MouseEventArgs e)
    {
    if (e.Button == MouseButtons.Left)
    {
    NodeStructure destNode = RecognizeNode(e.X, e.Y);
    if (destNode.NodeName != -1)
    if (srcNode.NodeName == -1)
    {
    srcNode = destNode;
    DrawNode(srcNode.NodeName.ToString(), srcNode.Point, Brushes.Black, Brushes.LightGray);
    }
    else
    {
    string ErrText = destNode.Point == srcNode.Point ? "!...امکان ایجاد دور وجود ندارد" : RecognizeJoint(srcNode.NodeName, destNode.NodeName) ? ".این اتصال قبلا ایجاد شده است و امکان برقراری مجدد آن وجود ندارد" : null;
    if (destNode.Point != srcNode.Point && !RecognizeJoint(srcNode.NodeName, destNode.NodeName))
    {
    JoinStructure join = new JoinStructure();
    join.source = srcNode.NodeName;
    join.destination = destNode.NodeName;
    join.joinLenght = (int)Math.Sqrt(Math.Pow(srcNode.Point.X - destNode.Point.X, 2) + Math.Pow(srcNode.Point.Y - destNode.Point.Y, 2));
    join.selected = false;
    JointList.Add(join);
    DrawPath();
    srcNode.NodeName = -1;
    }
    else
    {
    MessageBox.Show(ErrText, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
    srcNode.NodeName = -1;
    DrawPath();
    }
    }
    }
    else if (e.Button == MouseButtons.Right)
    {
    NodeStructure destNode = RecognizeNode(e.X, e.Y);
    if (destNode.NodeName != -1)
    {
    if (destNode.NodeName != startNode)
    {
    if (startNode == -1)
    startNode = destNode.NodeName;
    else
    endNode = destNode.NodeName;
    }
    else
    MessageBox.Show("!...نقاط شروع و پایان نمی توانند یکسان باشند", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign);
    }
    else
    startNode = endNode = -1;
    DrawPath();
    }
    }

    private bool RecognizeJoint(int src, int dest)
    {
    for (int i = 0; i < JointList.Count; i++)
    if (((JoinStructure)JointList[i]).source == src && ((JoinStructure)JointList[i]).destination == dest) return true;
    return false;
    }

    private NodeStructure RecognizeNode(int X, int Y)
    {
    for (int i = 0; i < NodeList.Count; i++)
    if (X >= ((NodeStructure)NodeList[i]).Point.X - 10 && X <= ((NodeStructure)NodeList[i]).Point.X + 10 && Y >= ((NodeStructure)NodeList[i]).Point.Y - 10 && Y <= ((NodeStructure)NodeList[i]).Point.Y + 10)
    return (NodeStructure)NodeList[i];
    NodeStructure nullNode = new NodeStructure();
    nullNode.NodeName = -1;
    return nullNode;
    }

    private void graphBoardPB_MouseMove(object sender, MouseEventArgs e)
    {
    if (RecognizeNode(e.X, e.Y).NodeName != -1)
    graphBoardPB.Cursor = Cursors.Hand;
    else
    graphBoardPB.Cursor = Cursors.Cross;
    }

    private void Main_KeyDown(object sender, KeyEventArgs e)
    {
    switch (e.KeyCode)
    {
    case Keys.F5:
    processBtn_Click(processBtn, new EventArgs());
    break;
    case Keys.Escape:
    Close();
    break;
    }
    }

    private void button1_Click(object sender, EventArgs e)
    {
    if (Height == 380) Height = 480;
    else Height = 380;
    }
    }
    }[/CSHARP]

    دانلود :
    موفق باشید. :happysmiley:

    پاسخ
    ایجاد موضوع جدید   پاسخ به موضوع  

    موضوعات مرتبط با این موضوع...
    موضوع نویسنده پاسخ بازدید آخرین ارسال
    Note کتاب آموزش Parse کردن یک خبر خوان وردپرسی برای ویندوزفون The Arrow 0 1,423 23-04-2015 ساعت 09:24
    آخرین ارسال: The Arrow
    Note سوال ساخت تقویم فارسی در ویندوز 8.1 The Arrow 2 1,467 16-01-2015 ساعت 00:32
    آخرین ارسال: The Arrow
    Note دیتابیس SQLite در سی شارپ The Arrow 3 3,151 07-11-2014 ساعت 22:40
    آخرین ارسال: VBProgrammer
    Note FileAssociation در سی شارپ The Arrow 1 719 05-11-2014 ساعت 12:32
    آخرین ارسال: SOFTAFZAR
    Note آموزش کامل سی شارپ (ویدئو) xMAN 2 850 02-10-2014 ساعت 12:50
    آخرین ارسال: xMAN
    Note explorer سی شارپ cMan 1 608 30-08-2014 ساعت 12:07
    آخرین ارسال: SOFTAFZAR
    Note پیدا کردن متن در سی شارپ arfanz 7 1,243 27-08-2014 ساعت 01:10
    آخرین ارسال: The Arrow
    Note برنامه نویسی موازی با سی شارپ xMAN 0 550 05-08-2014 ساعت 12:01
    آخرین ارسال: xMAN
    Note جستجو در یک متن در سی شارپ arfanz 12 2,879 16-07-2014 ساعت 09:32
    آخرین ارسال: Stack OverFlow
    Note مخفف کنترلهای سی شارپ mshayan 2 1,040 15-07-2014 ساعت 13:32
    آخرین ارسال: mshayan

    کاربرانِ درحال بازدید از این موضوع:   1 مهمان