Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: [ Solved ] Thuật toán vẽ đường thẳng Bresenham

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

    Mặc định [ Solved ] Thuật toán vẽ đường thẳng Bresenham

    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<graphics.h>
    #include<dos.h>
    #include<math.h>
    #include<string.h>
    #include<stdlib.h>
    #define PATH "D:\\BORLANDC\\BGI"
    void LineBres(int x1, int y1, int x2, int y2,int color)
    
    {
    
    int Dx, Dy, p, Const1, Const2;
    
    int x, y;
    int i;
    
    Dx = x2 - x1;
    
    Dy = y2 - y1;
    
    p = 2*Dy - Dx; // Dy <<1 - Dx
    
    Const1 = 2*Dy; // Dy <<1
    
    Const2 = 2*(Dy-Dx); // (Dy-Dx) <<1
    
    x = x1;
    
    y = y1;
    
    putpixel(x, y,color);
    
    for(i=x1; i<x2; i++)
    
    {
    
    if (p<0)
    
    p += Const1;
    
    else
    
    {
    
    p += Const2;
    
    y++;
    
    }
    
    x++;
    
    putpixel(x, y,color);
    
    }
    
    } // LineBres
    
    
    void main()
    {
     int mh,mode;
     mh=mode=0;
     initgraph(&mh,&mode,PATH);
     LineBres(200,100,300,450,WHITE);
    
     getch();
     closegraph();
    }
    Mình vẽ ra đường gấp khúc ??? >.< . Bạn nào rành xin chỉ bảo giùm . Thanks

  2. #2
    Ngày gia nhập
    06 2007
    Nơi ở
    Hà nội
    Bài viết
    77

    cái này là từng tọa độ ở các điểm gấp khúc của 1 đường gấp khúc đơn giản theo chiều từ trái qua phải,bạn nhìn vào nó thấy có gì đặc biệt ko,tùy vào độ dài và góc của đường gấp khúc so với phương nằm ngang mà có các tọa độ lần lượt khác nhau,nhưng nó luôn tuân theo 1 quy luật
    (x,y)
    (0,0)
    (1,1)
    (2,0)
    (3,1)
    (4,0)
    (5,1)
    .....
    Sống ở trên đời cần có một TẤM LÒNG để lúc đói còn có chỗ mà nhét THỨC ĂN

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

    Rõ ràng thuật toán này có gì đó không ổn . Một số trường hợp vẽ ra rất tốt nhưng một số thì lại cho ra đường gấp khúc chứ không có thẳng . Phải chỉnh sửa sao đây , ai giúp giùm vớiiiiiiii .á...á

  4. #4
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Cái này bạn mới viết được cho trường hợp x tăng nhanh, y tăng chậm (dx>dy>0) và dx>0 (x1<x2);
    muốn cho thuật toán Bres này chạy tốt cho mọi trường hợp bạn phải xét thêm một trường hợp nữa. là x tăng chậm, y tăng nhanh.
    sau đó bạn viết một hàm xét trường hợp. đoạn thẳng thuộc trường hợp nào thì vẽ trường hợp đó.

  5. #5
    Ngày gia nhập
    04 2007
    Bài viết
    27

    Tăng nhanh tăng chậm ??? Bạn có thể giải thích rõ hơn được không ạ .

  6. #6
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Mặc định [ Solved ] Thuật toán vẽ đường thẳng Bresenham

    Trích dẫn Nguyên bản được gửi bởi nanosi Xem bài viết
    Tăng nhanh tăng chậm ??? Bạn có thể giải thích rõ hơn được không ạ .
    1 - tăng nhanh tức là biến thiên nhanh + d? >0.
    2 - tăng chậm tức là biến thiên chậm + d? > 0
    3 - tăng nhanh tức là biến thiên nhanh + d? <0.
    4 - tăng chậm tức là biến thiên chậm + d? < 0
    dấu ? là x hoặc y

    trong các thuật toán vẽ đường conic và đường thẳng thì người ta quan tâm đến 2 điều đó là:
    1 - x tăng hay giảm, y tăng hay giảm
    2 - khi xác định được rồi thì xét giữa 2 biến x và y cái nào tăng(hay là giảm) nhanh hơn cái nào.
    Làm như vậy để người ta xác định được dạng của đường thẳng như thế nào để quyết định trong 2 biến x và y thì biến nào luôn luôn biến thiên.


    ví dụ: ta nói x tăng nhanh, y tăng chậm thì với thuật toán Bresenham thì x luôn luôn tăng còn y có tăng hay không thì tùy thuộc vào giá trị của biến p;

    vd1: đoạn thẳng AB có: A(10, 15); B(20,35);
    trong trường hợp này ta nói là x biến thiên chậm hơn biến y.
    vì ( dx = 20 - 10 < dy = 35 - 15)
    và x tăng (dx > 0) và y tăng (dy>0).
    như vậy ta có thể kết luận đoạn thẳng AB có tính chất là: y tăng nhanh và x tăng chậm.
    vd2: đoạn thẳng AB có: A(20,35) và B(50,10);
    thì trong trường hợp này ta nói là x biến thiên nhanh hơn y:
    vì ( |dx| = |50 - 20| > |dy| = |10 - 35| ).
    với lại: dx > 0, dy < 0 => dx tăng, dy giảm.
    vậy thì đoạn thẳng này có tính chất là: x tăng nhanh, y giảm chậm

    lời văn không được xuôn sẻ, hy vọng bạn hiểu ý của mình.
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 01-11-2007 lúc 01:11 AM.

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

  1. Kỹ thuật C++ Vẽ elip bằng thuật toán bresenham trong C chạy không ra kết quả đúng?
    Gửi bởi timduncanboy trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 08-10-2013, 08:37 PM
  2. Kỹ thuật C Thuật toán DDA vẽ đường thẳng trong C++?
    Gửi bởi knightherotam trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 20-09-2012, 10:10 PM
  3. Thuật toán vẽ đường thẳng Bresenham
    Gửi bởi trungtin1710 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 08-06-2010, 10:52 PM
  4. Tính P trong giải thuật vẽ đường thẳng Bresenham!
    Gửi bởi alias_va trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 08-01-2008, 10:50 PM
  5. Vẽ đường thẳng DDA và Bresenham!
    Gửi bởi alias_va trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 18-11-2007, 01:00 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