Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: cách dùng chuột để vẽ đường thẳng trong C#

  1. #1
    Ngày gia nhập
    05 2007
    Bài viết
    49

    Mặc định cách dùng chuột để vẽ đường thẳng trong C#

    Các bạn cho mình hỏi trong form thì mình dùng chuột chấm 1 điểm trên form và dùng chuột chấm thêm điểm thứ 2 trên form sau khi chấm xong điểm thứ 2 thì nó sẽ vẽ 1 đoạn thẳng dựa vào 1 thuật toán đã có thì làm thế nào hả các bác, vd như thuật toán DDA. Qua tìm hiểu thì mình được biết phải dùng MouseDown và MouseUp nhưng cụ thể thế nào thì mình lại chưa biết. Mong mọi người chỉ dẫn

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn nhấn chuột phải vào form, bấm chọn nút hình tia chớp để chọn sự kiện chuột. Khi chuột nhấn xuống bạn lưu tọa độ của điểm đầu tiên của đường thẳng. Khi chuột rê bạn vẽ đường thằng nối điểm vừa lưu và điểm hiện thời. Khi nhả chuột ra thì bạn chính thức lưu 2 điểm của đường thằng và vẽ lại.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    05 2007
    Bài viết
    49

    thanks bạn meoconlongvang đã gợi ý, mình đã làm được thế này rồi, nhưng còn 1 vấn đề là: Ở chỗ m=(y2-y1)/(x2-x1) báo lỗi chia cho 0 mà mình chưa tìm được cách sửa. Mong bạn chỉ giáo tiếp.

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Drawing.Drawing2D;
    7. using System.Text;
    8. using System.Windows.Forms;
    9.  
    10. namespace WindowsApplication3
    11. {
    12.     public partial class Form1 : Form
    13.     {
    14.         public Form1()
    15.         {
    16.             InitializeComponent();
    17.         }
    18.  
    19.         int x1, x2, y1, y2;
    20.         private void Form1_Paint(object sender, PaintEventArgs e)
    21.         {
    22.             LineDDA(x1,y1,x2,y2);
    23.         }
    24.  
    25.         private void Form1_MouseDown(object sender, MouseEventArgs e)
    26.         {
    27.             x1 = e.X;
    28.             y1 = e.Y;
    29.             label1.Text = e.X + ";" + e.Y;
    30.         }
    31.  
    32.         private void Form1_MouseUp(object sender, MouseEventArgs e)
    33.         {
    34.             x2 = e.X;
    35.             y2 = e.Y;
    36.             label2.Text = e.X + ";" + e.Y;
    37.         }
    38.  
    39.         void LineDDA(int x1, int y1, int x2, int y2)
    40.         {
    41.             int i, x = x1;
    42.             float y = y1;
    43.             float m;
    44.             m=(y2-y1)/(x2-x1);
    45.             Graphics d = this.CreateGraphics();
    46.             d.FillEllipse(Brushes.Black,x,y,1F,1F);
    47.             for(i=x1;i<=x2;i++)
    48.             {
    49.                 x++;
    50.                 y+=m;
    51.                 d.FillEllipse(Brushes.Black, x, y, 1F, 1F);
    52.             }
    53.         }
    54.     }
    55. }

    Lần sau post code lên diễn đàn thì bắc buộc phải để trong tag CODE. Xin vui lòng đọc hướng dẫn!
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 10-11-2008 lúc 10:33 PM. Lý do: Thêm tag [code=C#]

  4. #4
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Sặc, đường thẳng thì chắc chắn x1 trùng x2 rồi, bị chia cho 0 là lẽ đương nhiên, bạn tìm hiểu lại lý thuyết hình học giải tích rồi áp dụng vào nha.

  5. #5
    Ngày gia nhập
    08 2008
    Bài viết
    68

    nếu đó là đường thẳng không song song với trục thì không = 0 đâu...
    nếu song song với trục thì vẽ sẽ đơn giản hơn nhiều vì x1=x2 hoặc y1=y2.

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định cách dùng chuột để vẽ đường thẳng trong C#

    @nobita611 : Khi x1 = x2 thì đơn giản là bạn cho vòng for quét từ y1 đến y2 và vẽ, đây là trường hợp đặc biệt của DDA.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  7. #7
    Ngày gia nhập
    05 2007
    Bài viết
    49

    @meoconlongvang: mèo ơi, nhưng vấn đề ở chỗ khi mình chạy chương trình thì tọa độ điểm đầu đc lấy do mình ấn chuột và điểm thứ 2 do mình di chuột ra chỗ khác và thả chuột cơ mà. Hiểu nôm na là ngay từ đầu x1=x2 rồi, trong khi đó thì y1=y2 và đều chưa biết bằng bao nhiêu.

  8. #8
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi nobita611 Xem bài viết
    @meoconlongvang: mèo ơi, nhưng vấn đề ở chỗ khi mình chạy chương trình thì tọa độ điểm đầu đc lấy do mình ấn chuột và điểm thứ 2 do mình di chuột ra chỗ khác và thả chuột cơ mà. Hiểu nôm na là ngay từ đầu x1=x2 rồi, trong khi đó thì y1=y2 và đều chưa biết bằng bao nhiêu.
    Lúc ấy ban khoan hãy vẽ, đợi mouse up rồi hãy bắt đầu vẽ.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  9. #9
    Ngày gia nhập
    05 2007
    Bài viết
    49

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Drawing.Drawing2D;
    7. using System.Text;
    8. using System.Windows.Forms;
    9.  
    10. namespace WindowsApplication3
    11. {
    12.     public partial class Form1 : Form
    13.     {
    14.         public Form1()
    15.         {
    16.             InitializeComponent();
    17.         }
    18.  
    19.         int x1, x2, y1, y2;
    20.        
    21.         private void Form1_MouseDown(object sender, MouseEventArgs e)
    22.         {
    23.             x1 = e.X;
    24.             y1 = e.Y;
    25.             label1.Text = e.X + ";" + e.Y;
    26.         }
    27.  
    28.         private void Form1_MouseUp(object sender, MouseEventArgs e)
    29.         {
    30.             x2 = e.X;
    31.             y2 = e.Y;
    32.             label2.Text = e.X + ";" + e.Y;
    33.             LineDDA(x1,y1,x2,y2);
    34.         }
    35.  
    36.         void LineDDA(int x1, int y1, int x2, int y2)
    37.         {
    38.             int i, x = x1;
    39.             float y = y1;
    40.             float m;
    41.             m=(y2-y1)/(x2-x1);
    42.             Graphics d = this.CreateGraphics();
    43.             d.FillEllipse(Brushes.Black,x,y,1F,1F);   ???
    44.             for(i=x1;i<=x2;i++)
    45.             {
    46.                 x++;
    47.                 y+=m;
    48.                 d.FillEllipse(Brushes.Black, x, y, 1F, 1F);    ???
    49.             }
    50.         }
    51.     }
    52. }
    Mình đã sửa được thành thế này rồi nhưng nó vẫn chưa vẽ được hình là sao nhỉ ? Hình như lệnh d.FillEllipse(Brushes.Black, x, y, 1F, 1F) không được vào thì phải

  10. #10
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn làm như thế là sai rồi. Trong hàm mouse up, bạn phải gọi phương thức this.Refresh() để nó gián tiếp gọi hàm xử lý sự kiện OnPaint và mọi thao tác vẽ phải được thực hiện trong hàm này. Hàm này có tham số EventArgs, trong đó có graphics và bạn dùng graphics đó để vẽ, ko cần phải tạo mới.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

Các đề tài tương tự

  1. Graphic Vẽ đường thẳng bị mất khi dùng scroll cho Panel?
    Gửi bởi vinh0202 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 07-04-2012, 09:14 PM
  2. Vẽ đường thẳng bằng chuột với WPF trong C#
    Gửi bởi nhuvayday trong diễn đàn Dự án & Source code C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 02-01-2012, 09:27 PM
  3. vẽ đường thẳng trong C#
    Gửi bởi gen.infor trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 29-10-2011, 04:55 PM
  4. Graphic xóa 1 chuỗi khi dùng Graphics.DrawString(...) vẽ ra trong Bitmap
    Gửi bởi search_ trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 29-10-2011, 10:11 AM
  5. Cách đánh dấu một điểm trên Form (bằng chuột), vẽ một đường thẳng bằng chuột?????????
    Gửi bởi nguyentinh trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 17-10-2007, 12:17 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn