Đây là chương trình nhằm mục đích minh họa cho việc biểu diễn và cài đặt các thuật toán liên quan đến đồ thị thông qua thuật toán Floyd. Bạn có thể dùng chuột để vẽ và di chuyển các node của đồ thị, khoảng cách giữa hai node cũng như ma trận kề (adjacency matrix) của đồ thị sẽ được tính toán và tự động thay đổi theo.
Chương trình này cũng là một ví dụ đơn giản về cách vẽ, di chuyển và thay đổi kích thước các control bằng chuột trong quá trình runtime. Các đối tượng trong form hầu hết là control, bạn có thể thay thế hoàn toàn bằng GDI+ nhưng công việc xử lý sẽ tốn kém hơn.
Các công cụ vẽ bao gồm (trong Toolbox):
Tên | Phím tắt | Công dụng |
Move | Alt+M, 1 | Di chuyển đỉnh |
Node | Alt+N, 2 | Vẽ, di chuyển đỉnh |
Edge | Alt+E, 3 | Vẽ cạnh giữa 2 đỉnh |
Eraser | Alt+R, 4 | Xóa đỉnh, cạnh |
Update version 1.3.3 (21/3/2013)
– Cố định tốc độ di chuyển của bóng dẫn đường (bug).
– Cho phép chọn (edge tool), xoá cạnh (eraser tool).
Update version 1.3.2 (3/5/2011)
– Thêm hiệu ứng di chuyển trên đường đi ngắn nhất giữa 2 đỉnh.
– Thêm công cụ vẽ đồ thị
– Hiển thị đường đi ngắn nhất (gián tiếp) trên ma trận kề.
– Lưu trạng thái của chương trình sau khi thoát.
Update version 1.2 (29/4/2011)
– Thêm chức năng xóa node, edge
– Thay đổi nhỏ trong thuật toán vẽ
– Không cho phép di chuyển node ra ngoài khung nhìn
Update version 1.1: (26/4/2011)
– Hỗ trợ đồ thị vô hướng và có hướng
– Một vài thay đổi nhỏ trong thuật toán vẽ
Sử dụng:
– Dùng chuột trái để vẽ node và di chuyển, chuột phải để tạo đường đi giữa các node.
Download:
Tình cờ ghé thăm blog của anh không ngờ tìm được rất nhiều thứ mà em đang cần. Em cũng đang định viết 1 cái tương tự ^_^
Cảm ơn bạn, chương trình rất hay.
Thanks, mình đang làm đề tài có một số thứ cần thiết mình cần dùng tới đồ án này để cải tiến thực hiện cho Project của mình. Mình đã để link tham khảo đến web này. Lần nữa cảm ơn bạn rất nhiều.
slopesky
Hy vọng chương trình này giúp ích được cho các bạn, cảm ơn đã ghé thăm blog.
Thanks, mình đang làm mấy mục liên quan đến đồ thị, bài viết của bạn đã giúp ích rất nhiều cho mình. Thanks again.
bài viết rất hay, cảm ơn bạn
Khi chạy chương trình trong Visual 2010 mình bị lỗi sau:
An unhandled exception of type ‘System.NullReferenceException’ occurred in Y2VisualGraph.exe
Additional information: Object reference not set to an instance of an object.
Các bạn nào biết cách khắc phục xin chỉ cho mình với !
Thanks !
Lỗi bạn đưa chung chung quá, bạn có thể chỉ rõ lỗi ở dòng nào, file nào, hoặc post đoạn code lỗi lên đây không. Nếu như có thể debug được thì bạn có thể tự sửa cũng được.
Khi mình chạy phiên bản mới nhất của bạn ( version 1.3.2 (3/5/2011) ) trong Visual Studio 2010 thì bị lỗi duy nhất như trên tại dòng:
protected override void OnLoad(EventArgs e)
{
GraphData data= graphUI1.LoadGraph(FILENAME);
cboFrom.SelectedIndex=data.FormNode;//Lỗi ở đây !!!!!
cboTo.SelectedIndex=data.ToNode;
chkUndirectedGrapth.Checked=data.IsUndirectedGraph;
base.OnShown(e);
}
Còn các phiên bản cũ hơn của bạn thì mình đều cho chạy được ngon lành, mình không hiểu tại sao, liệu do mình chưa chỉnh các thông số gì cho Visual Studio hay ko ??
Mong bạn xem giúp. Chân thành cảm ơn bạn ^^.
Bạn ơi, mình cũng bị giống bạn,
bạn làm thế nào để khắc phục vậy?
Có thể là do file data ko có, bạn thử tắt đi run lại xem sao.
Lỗi trên là do file dữ liệu nạp không được (do file ko tồn tại hoặc các nguyên nhân khách quan nào đó). Bạn chỉ cần thêm try catch để báo lỗi là được.
Ok mình sẽ thử !
Có 1 câu hỏi nữa là cái graphicUI là cậu dùng toolbox gì vậy ?
hichic
Ý của mình là trong cái form giao diện chính Form1 ấy,
cái pannel mà cậu lấy là thuộc GraphUI, còn tớ toàn bị lấy từ System.Windows.Forms.Panel
à cái đó chỉ là một user control được tạo ra bằng cách kế thừa từ panel thôi.
Hahaha mình làm được rùi cảm ơn cậu nhiều nhé !
Blog của bạn rất hữu ích, mong bạn sẽ viết thật nhiều bài nữa để mọi người cùng tham khảo ^ ^
Cậu có thể viết cho mình 1 đoạn code hiển thị ma trận kề(adjacency matrix) được không ?
Mình nghĩ bạn nên cho ví dụ về cách lưu dữ liệu trước bởi vì cách in ma trận phụ thuộc vào cách lưu dữ liệu của đồ thị. Hơn nữa thuật toán cũng chỉ cần 2 vòng lặp lồng nhau và bạn có thể dễ dàng viết được nếu như đã học lập trình.
Ok, mình làm theo hường khác rùi nên ko cần hiển thị ma trận này nữa ^^. Thanks !
Trong hàm void GetPath(int x, int y) thì x, y ở đây là chỉ số node hả cậu?
Phương thức này dùng 2 tham số của FindShortestPath(x,y), x là index của node bắt đầu tìm và y là node kết thúc. Tức là tìm đường đi ngắn nhất từ x->y (các node được lưu trong một tập hợp).
Để xóa một cạnh bất kỳ bằng cách chỉ con trỏ chuột vào cạnh đó thì mình làm thế nào Yin Yang nhỉ ?
Cậu có ý tưởng gì về vấn đề này không?!
Đơn giản thôi, bạn chỉ cần kiểm tra vị trí chuột click có nằm trên đoạn thẳng ko tương tự như các hình khác.
Khi click chuột vào màn hình thì mình có thể biết được tọa độ của nó, tuy nhiên để tìm được cạnh nào mà gần nhất với điểm vừa click thì tớ thấy khó quá.
Cậu có thể hướng dẫn cụ thể hơn cho tớ hoặc viết cho tớ lun đoạn code này không ? ^ ^
Thanks a lot !
bạn có thể coi bài sau Kiểm tra một điểm nằm trên đoạn thẳng. Có thể sử dụng các node ở đầu đoạn thẳng để chọn hoặc trực tiếp click lên đoạn thẳng để chọn.
Cậu cho tớ hỏi một chút ^ ^
Trong class GraphUI, thì this.Control.Count cho ta biết số đối tượng trong Graph đúng vậy ko cậu?
Chẳng hạn trong đồ thị tớ đã vẽ 4 nút thi kể thêm cả cái matrix được vẽ kèm nữa là ta có this.Control.Count = 5 đúng ko cậu?
Đúng vậy, mỗi control đều có property là Controls được hiện thực từ ICollection nên đều có property là Count dùng để đếm số lượng phần tử của nó.
Thuật toán Floyd thuộc loại link state hay distance vector bạn nhỉ?
Mình không rành về mạng tuy nhiên mình nghĩ là hai khái niệm này không dùng để phân loại các thuật toán tìm đường.
bạn cho mình hỏi, do mình đang tìm hiểu và thấy code của bạn có chỗ GraphUI.cs, MaTran.cs và được xây dựng nằm trong toolbox. Vậy bạn có thể hướng dẫn cụ thể, khi tạo ra nó được không?. Mình cám ơn bạn.
Đó là một User Control (bạn nhấn phải project > Add > User Control). Bạn có thể kéo thả, thiết kế trên control này như một cửa sổ Form thông thường. Sau đó kéo build thì nó sẽ xuất hiện trên toolbox.
Cho mình hỏi dữ liệu đầu vào của file data.bin bạn tạo thế nào vậy? Minh muốn sử dụng phần vẽ hiển thị đồ thị của bạn nhưng lại mắc ở khâu đầu vào. Bạn cho thể giải thích cho mình cấu trúc dữ liệu đầu vào trước khi hiển thị được ko? thk u!
Mình sử dụng serializtion (https://yinyangit.wordpress.com/2011/06/02/net-serialization-and-deserialization-in-csharp/) để lưu trực tiếp đối tượng .NET thành dạng binary.
anh yin yang ơi anh có thể nói qua cho em về các vẽ các nút và kéo cây như trong vison 1.3.2. em dow về đọc không hiểu.thank anh
Để bữa nào rành mình viết 1 bài hướng dẫn cho tiện, comment dưới đây cũng khó đọc.
vâng, em viết nhanh hộ em với nhá, em đang vọc cái này mà đọc code kiêu chẳng hiểu gì, thank anh
anh yiyan ơi làm các nào để khi vẽ các node xong thì có thể nhập dữ liệu vào các node, anh có thể nói giải thuật được không anh
Trong chương trình của mình ko có phần nhập dữ liệu vào node. Ý bạn là tên của node hay là khoảng cách giữa các node?
vang, ý em là khi mình kéo các node với khoảng các của chúng ra giao diện ,rùi thì làm sao để tên node và giá tri nhập vào qua class Node để minh tính toán đường đi ngắn nhất cho chúng
Trong chương trình này thì mình cho nó tự động gán tên Node (từ A-Z), khoảng cách giữa các node cũng được tính tự động. Nếu bạn cần nhập tên node và khoảng cách thì có thể làm được vì đã có sẵn chức năng chọn Node và cạnh rồi. Chỉ cần hiển thị lên 1 cái dialog cho người dùng nhập thôi.
ý em là khi minh vẽ node xong rùi thì dùng hàm nào dể thêm node.giá trị con và khoảng cách tương ứng vào class node, để minh có thể dùng hàm tính toán đường đi đây
Bạn có thể viết câu hỏi rõ hơn được ko?
Có thể vẽ được bài này trên WB ko bạn
Được, bạn có thể dùng SVG hoặc canvas.
Vẽ trên WEB!
Cho mình hỏi! Trong phiên bản 1.1 sao code nó không thể chạy được nhỉ? Hay còn thiếu gì nữa? Mong mọi người trả lời với nhé!
À mình quên! Chạy được nhưng ko thể vẽ được các Node!
Yin Yang à! Bạn có thể viết code này trên WEB dạng đơn giản:
mình có 2 bảng lưu Node và Link.
sau đó vẽ sơ đồ này trên WEB. Và có các sự kiện (click, drag ..) trên sơ đồ này.
Bạn có thể hướng dẫn hoặc cho mình từ khóa để mình tìm kiếm cái mã nguồn được ko?
Yin Yang à! Bạn có thể viết code này trên WEB dạng đơn giản:
mình có 2 bảng lưu Node và Link.
sau đó vẽ sơ đồ này trên WEB. Và có các sự kiện (click, drag ..) trên sơ đồ này.
Bạn có thể hướng dẫn hoặc cho mình từ khóa để mình tìm kiếm cái mã nguồn được ko??
Mình cũng ko có thời gian để viết lại trên web. Bạn có thể tìm các bài về Html5 Canvas trên blog này để vẽ thử xem.
Chào anh..anh có thể cho em xin gmail của anh để em liên lạc được không ạ..em xin cám ơn..
Anh Yin Yang em đã học bài code định giá biều thức tiền tố và hậu tố của anh viết trên C# ..anh có code định giá biều thức tiền tố và hậu tố viết trên C++ không ? Nếu anh có thì cho em xin..Em đang rất cần vì em đang làm bài tập lớn môn đồ họa máy tính mà yêu cầu là phải viết trên C++.. Cám ơn Anh.
Email mình để ở phía trên nhưng ít khi xài và ko nhận mail hỏi đáp lập trình, code C++ mình cũng không có. Bạn thông cảm!
Cho mình cái cấu trúc file bin với! Mình muốn chuyển data sang oracle để chạy!
File bin này mình nhớ nó là tập tin binary với dữ liệu được serialize từ đối tượng trong C#, không phải là các loại tập tin DBMS.
mình mở bằng VS2012 thì gặp 2 lỗi thế này.. bạn có thể chỉ mình cách sửa được không
Message 1 Could not find type ‘Y2VisualGraph.GraphUI’. Please make sure that the assembly that contains this type is referenced. If this type is a part of your development project, make sure that the project has been successfully built using settings for your current platform or Any CPU. 0 0
Message 2 The variable ‘graphUI1’ is either undeclared or was never assigned. E:\Downloads\Video\dothi\Y2VisualGraph 1.3.3\Y2VisualGraph\Form1.Designer.cs 300 0
Bạn thử kiểm tra lại coi class GraphUI có trong project ko.
Cảm ơn bạn rất nhiều ^^
Có vì Floyd thể thay thành thuật toán tìm đường Dijkstra được không anh?