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

Đề tài: Vẽ đường thẳng DDA và Bresenham!

  1. #1
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    31

    Question Vẽ đường thẳng DDA và Bresenham!

    Bài này mình đã cho chạy thử nhưng ko thấy gì khi ctrl+F9. Màn hình đen xì rồi thoát ra luôn. Bây giờ mình muốn cho thêm 1 hàm input để nhập toạ độ điểm đầu và điểm cuối, hiện tên thuật toán+tên người viết. Nếu có thể các bạn chú thích ý nghĩa của các lệnh giùm mình nhé! Cho mình gửi lời cảm ơn trước !
    C++ Code:
    1. #include<conio.h>
    2. #include<stdio.h>
    3. #include<stdlib.h>
    4. #include<graphics.h>
    5. #include<dos.h>
    6. #include<iostream.h>
    7. #include<math.h>
    8. void DD_Line(int x1,int y1,int x2,int y2);
    9. void bres(int x1,int y1,int x2,int y2,int=6);
    10. int round(double);
    11.  
    12. void main(void)
    13. {
    14.     int driver=DETECT,mode,errorcode;
    15.     initgraph(&driver,&mode,"D:\TC\BGI");
    16.     outtextxy(250,10,"DD_Line Algo");
    17.     DD_Line(50,50,100,50);
    18.     getch();
    19.     cleardevice();
    20.     outtextxy(250,10,"Bresenham's Line Algo");
    21.     bres(50,30,100,50);
    22.     getch();
    23.     closegraph();
    24. }
    25.  
    26. void DD_Line(int x1,int y1,int x2,int y2)
    27. {
    28.     float dx,dy,y,m,x;
    29.     int xtra1,xtra2,mark=2;
    30.     if(x1>x2)
    31.       {
    32.       xtra1=y1;y1=y2;y2=xtra1;
    33.       xtra2=x1;x1=x2;x2=xtra2;
    34.       printf("%d %d %d %d",x1,y1,x2,y2);
    35.       }
    36.     dx=x2-x1;
    37.     dy=y2-y1;
    38.     if(fabs(dx)>fabs(dy))
    39.       {
    40.       m=dy/dx;
    41.       y=y1;
    42.       for(x=x1;x<x2;x++)
    43.         {
    44.         putpixel(x,round(y),mark);
    45.         y=y+m;mark=5;
    46.         }
    47.       }
    48.     else
    49.       {
    50.       m=dx/dy;
    51.       x=x1;mark=3;
    52.       if(y1<y2)
    53.         {
    54.         for(y=y1;y<y2;y++)
    55.           {
    56.           putpixel(round(x),y,mark);
    57.           x=x+m;mark=6;
    58.           }
    59.         }
    60.       else
    61.         {
    62.         for(y=y1;y>y2;y--)
    63.           {
    64.           putpixel(round(x),y,mark);
    65.           x=x-m;mark=6;
    66.           }
    67.         }
    68.       }
    69. }
    70.  
    71. int round(double y)
    72. {
    73.     double fraction, integer;
    74.     fraction=modf(y,&integer);
    75.     if(fraction>=0.5)
    76.       return ((int)integer+1);
    77.     else
    78.       return ((int)integer);
    79. }
    80.  
    81. void bres(int x1,int y1,int x2,int y2,int col)
    82. {
    83.     int x,y,dx,dy,e_inc=0,e_no=0,e=0;
    84.     y=y1;
    85.     dx=x2-x1;
    86.     dy=y2-y1;
    87.     e_no=dy+dy;
    88.     e=e_no-dx;
    89.     e_inc=e-dx;
    90.     for(x=x1;x<x2;x++)
    91.       {
    92.       putpixel(x,y,col);
    93.       if(e<0)
    94.         {
    95.         e=e+e_no;
    96.         }
    97.       else
    98.         {
    99.         y=y+1;
    100.         e=e+e_inc;
    101.         }
    102.       }
    103. }

    Lưu ý: Vui lòng đưa code vào tag nhé. Chọn phần code rồi nhấn hoặc nhấn

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

    do máy hư đang xài của thằng bạn nên mình không thể test thử bài của bạn bị sai chổ nào nhưng mình có một số nhận xét sau:
    - cái hàm round của bạn thì bạn đã làm quan trọng hóa vấn đề lên rồi đó.
    cái này chỉ cần 1 câu lệnh:
    Code:
    #define round(a)   int(a+0.5)
    - Còn khi đọc sơ qua thuật toán DDA của bạn thì thấy tạm ổn. mình nghĩ nếu thuật toán DDA như vậy chạy là nó không sai(chưa xét đến độ tối ưu trong viêc code của bạn) .
    Theo mình nghĩ thì lỗi của bạn có thể là chưa khởi động được hệ đồ họa trong TC.

    Với thằng TC(hay BC) thì khi dùng graphics phải chỉ chính xác đường dẫn đến thư mục grid của nó trên máy bạn. hoặc thư mục chứa file exe phải chứa các file của graphics.(bao gồm các file *.bgi, *.chr).

    Code:
    int driver=DETECT,mode=0,errorcode;
    initgraph(&driver,&mode,"D:\TC\BGI");
    cái này bạn phải chắc chắn là thằng TC của bạn được cài ở ổ D trên máy bạn.
    để cho chắc chắn bạn thử test lại với hàm main() được thêm vào một dòng lệnh nữa như sau:

    Code:
    void main(void)
    {
    int driver=DETECT,mode,errorcode;
    initgraph(&driver,&mode,"D:\TC\BGI");
    int iError;
    iError = graphresult(); // lấy mã lỗi trong quá trình mở chế độ đồ họa.
    if(iError != 0){
         printf("error %d", iError);
         getch();
         return;
    }
    outtextxy(250,10,"DD_Line Algo");
    DD_Line(50,50,100,50);
    getch();
    cleardevice();
    outtextxy(250,10,"Bresenham's Line Algo");
    bres(50,30,100,50);
    getch();
    closegraph();
    }
    ok giờ nếu có phát sinh lỗi bạn chắc bạn phải biết sửa như thế nào. bằng mã lỗi rồi.

    ghi chú: bạn có thể coi rõ hơn về đồ họa trong TC bằng sách: Kỹ thuật lập trình C . của: PHẠM VĂN ẤT.
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 18-11-2007 lúc 01:03 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. Cách vẽ đường thẳng nối 3 điểm của một đồ thị?
    Gửi bởi apo_silent trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 05-08-2012, 11:29 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. [ Solved ] Thuật toán vẽ đường thẳng Bresenham
    Gửi bởi nanosi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 01-11-2007, 01:09 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