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

Đề tài: [DOS] Lập trình đồ họa trong C++

  1. #1
    Ngày gia nhập
    12 2006
    Bài viết
    72

    Mặc định [DOS] Lập trình đồ họa trong C++

    Như chúng ta đã biết ,bất kì một chương trình nào khi được đưa vào sử dụng ngoài những tính năng độc đáo mà chương trình đó đem lại thì phần đồ họa hay thiết kế giao diện người dùng (graphic user interface_GUI) cũng không kém phần quan trọng.
    Bên cạnh đó phần đồ họa trong C++ cũng rất ít được nhắc tới do C++ không hỗ trợ hoàn toàn đầy đủ (so với các phần mềm khác)
    Do đó mình xin mạo muội lập ra topic này nhằm tập hợp những bài viết về đồ họa trong C++,và mình cũng xin đóng góp chút xíu những gì mà mình biết. Cũng xin nói rằng trong cuốn Lập trình C++_GS Phạm Văn Ất cũng sẽ không nói đến đồ họa vì mình sẽ tách phần đó sang đây để lấy làm phần nhập môn về đồ họa C++.
    Thôi không dài dòng nữa,mình sẽ bắt đầu ngay đây!
    Bài mở đầu: Các khái niệm cơ bản
    1.Màn hình văn bản và màn hình đồ họa,pixel,độ phân giải
    Nếu gạt bỏ đồ họa sang một bên, chỉ quan tâm tới những gì mà từ trươc đến nay chúng ta vẫn làm trên màn hình chúng ta sẽ nói rằng chúng ta làm việc trên màn hình kiểu văn bản (từ khâu viết code trên màn hình xanh của turbo C đến khâu chạy chương trình trên màn hình đen của DOS). Vậy thế nào là màn hình kiểu văn bản? Đó là loại màn hình được thiết kế với 80 cột và 25 dòng giống như một bàn cờ nhưng chỉ khác về số dòng và số cột, trong mỗi ô của một bàn cờ chứa một quân cờ thì trong mỗi ô của màn hình đồ họa chứa một kí tự.
    Khi làm việc trên màn hình văn bản , các kí tự hiển thị đã được qui định từ trước bởi phần cứng máy tính, do đó không thể nào thay đổi được kích thước cũng như kiểu chữ. Tuy nhiên nhu cầu của chúng ta thì không dừng lại ở đó,vì thể người ta tìm cách thu nhỏ các ô này lại sao cho mỗi ô chỉ chiếm 1 phần rất nhỏ của 1 kí tự,khi đó chúng ta có thể xử lí kích thước và hình dạng của kiểu chữ dựa trên các phần rất nhỏ đó. Do đó một khái niệm mới được ra đời đó là pixel (chấm điểm) _một từ có lẽ cũng quen thuộc với chúng ta. Sự bố trí các pixel trên màn hình gọi là độ phân giải ,do mỗi kiểu màn hình đồ họa có một cách xử lí đồ họa riêng nên Turbo C++ cung cấp cho mỗi kiểu màn hình đồ họa một tệp tin điều khiển riêng, (trong windows ,những tệp điều khiển đồ họa gọi là driver)
    Các tệp tin điều khiển trong C++ có đuôi BGI và được liệt kê dưới bảng sau:


    Màn hình đồ họa được sắp xếp trên các đường thẳng ngang và dọc. Điều này đúng cho tất cả các kiểu màn hình đồ họa của máy tính.Khác biệt chủ yếu giữa chúng là kích thước của mỗi điểm ảnh (hay số điểm ảnh). Chúng ta thường hay thấy mọi người nói độ phân giải là :1024x768 hay 1600x1200… các bạn nhân nó lên sẽ ra số điểm ảnh được bỗ trí trên màn hình. Điểm ảnh càng nhỏ thì số điểm ảnh trên màn hình càng nhiều và tất nhiên sẽ cho chất lượng ảnh càng cao.
    2.Hệ tọa độ của màn hình đồ họa,cấu trúc một chương trình đồ họa trong C++
    Mỗi kiểu đồ họa dùng một hệ tọa độ riêng.Lấy ví dụ cho hệ tọa độ của màn hình VGA là 640x480 như sau:

    Nhờ hệ tọa độ này ,ta có thể tác động hay tham chiếu đến bất kì điểm ảnh nào trên màn hình đồ họa.Trong C++ để lấy tọa độ x và y lớn nhất trong kiểu đồ họa đang dùng ta lần lượt dùng 2 hàm getmaxx() và getmaxy().
    Ngoài ra,trong C++,khi muốn làm việc trên màn hình đồ họa ta thường phải làm những việc sau:
    + Khởi động hệ thống đồ họa
    + Kiểm tra lỗi đồ họa
    + Các thao tác trên màn hình đồ họa
    + Đóng hệ thống đồ họa để trở về mode (kiểu) văn bản.
    Hẹn gặp lại trong bài tiếp theo!

  2. #2
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Mặc định Thuật toán DDA vẽ đường thẳng

    Mình xin tiếp tục bài của "thangtran" nha:
    GIỚI THIỆU THUẬT TOÁN VÀ TÔ CÁC ĐƯỜNG
    Thuật toán DDA vẽ đường thẳng:
    C++ Code:
    1. #include<iostream.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. #include<graphics.h>
    5.  
    6. void ktdh(){
    7.     int mh=9;
    8.     int mode=2;
    9.     initgraph(&mh,&mode,"D:\\BORLANDC\\BGI");
    10.     int maloi=graphresult();
    11.     if (maloi==0) cout<<"Da khoi tao do hoa";
    12.     else cout<<"Co loi khoi tao do hoa";
    13.     };
    14. void DDA(double x1,double y1, double x2, double y2, int color){
    15.     ktdh();
    16.     double x,y,temp;
    17.     if(abs(x2-x1)>abs(y2-y1)) temp=abs(x2-x1);
    18.     else temp=abs(y2-y1);
    19.     x=x1;
    20.     y=y1;
    21.     putpixel(ceil(x),ceil(y),color);
    22.     for(double i=1;i<=temp;i++){
    23.         x=x+(x2-x1)/temp;
    24.         y=y+(y2-y1)/temp;
    25.         putpixel(ceil(x),ceil(y),color);
    26.     };
    27. };
    28. void main(){
    29.     double x1,x2,y1,y2;
    30.     cout<<"Nhap x1, y1:";
    31.     cin>>x1>>y1;
    32.     cout<<endl<<"Nhap x2, y2:";
    33.     cin>>x2>>y2;
    34.     DDA(x1,y1,x2,y2,4);
    35.     getch();
    36. };
    Thuật toán Bresenham vẽ đường thẳng
    C++ Code:
    1. void Bres_Line(int x1, int y1, int x2, int y2,int color){
    2.      int dx,dy,x,y,P,const1,const2;
    3.      dx=x2-x1;
    4.      dy=y2-y1;
    5.      P=2*dy-dx;
    6.      const1=2*dy;const2=2*(dy-dx);
    7.      putpixe(x,y,color);
    8.      while (x<x2){
    9.              x=x+1;
    10.              if (P<0) P=P+const1;
    11.              else
    12.                   {
    13.                          y=y+1;P=P+const2;
    14.                    };
    15.      };
    16. };
    Hẹn gặp lại bài tiếp theo ha, thuật toán vẽ đường tròn, Ellipse
    Tham khảo được đó!!!!!!!!!!!!!!!!!!!
    Đã được chỉnh sửa lần cuối bởi kitti : 27-02-2011 lúc 10:26 PM. Lý do: chỉnh lại tiêu đề cho dễ nhận biết và đưa code vào tag code
    Không biết ghi gì luôn ...

  3. #3
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Mặc định thuật toán vẽ đường tròn

    Hôm nay mình tiếp tục đưa thêm thuật toán vẽ đường tròn.
    C++ Code:
    1. void circle(int x0, int y0, int color){
    2.     int x,y;
    3.     for(int x=0; x<=ceil(R*sqrt(2)/2); x++){
    4.         y=ceil(sqrt(R*R-x*x);
    5.         // Ve doi xung
    6.         putpixel(x0+x,y0+y,color);
    7.         putpixel(x0-x,y0+y,color);
    8.         putpixel(x0+x,y0-y,color);
    9.         putpixel(x0-x,y0-y,color);
    10.         putpixel(x0+y,y0+x,color);
    11.         putpixel(x0-y,y0+x,color);
    12.         putpixel(x0+y,y0-x,color);
    13.         putpixel(x0-y,y0-x,color);
    14.     };
    15. };
    Tham khảo tài liệu về đồ hoạ.
    Đã được chỉnh sửa lần cuối bởi kitti : 27-02-2011 lúc 10:26 PM. Lý do: chỉnh lại tiêu đề cho dễ nhận biết và đưa code vào tag code
    Không biết ghi gì luôn ...

  4. #4
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Mặc định Thuật toán vẽ Ellipse

    Thuật toán vẽ Ellipse:
    C++ Code:
    1. void ellipse(int xc, int yc, int a, int b, int color){
    2.     int x,y
    3.     float z1,z2,P;
    4.     x=0;y=b;
    5.     z1=(b*b)/(a*a);
    6.     z2=1/z1;   
    7.     P=2*z1-2*b+1;
    8.     while(z1*(x/y)<=1){
    9.         putpixel(xc+x,yc+y,color);
    10.         putpixel(xc-x;yc+y,color);
    11.         putpixel(xc+x,yc-y,color);
    12.         putpixel(xc-x,yc-y,color);
    13.         if (P<0) P=P+2*z1*(2*x+3);
    14.         else{
    15.             P=P+2*z1*(2*x+3)+4*(1-y);
    16.             y--;
    17.         };
    18.         x++;
    19.     };
    20.     x=a;y=0;
    21.     P=2*z2-2*a+1;
    22.     while(z2*(y/x)<1){
    23.         putpixel(xc+x,yc+y,color);
    24.         putpixel(xc-x;yc+y,color);
    25.         putpixel(xc+x,yc-y,color);
    26.         putpixel(xc-x,yc-y,color);
    27.         if (P<0) P=P+2*z2*(2*y+3);
    28.         else{
    29.             PP+2*z2*(2*y+3)+4*(1-x);
    30.             x--;
    31.         };
    32.         y++;
    33.     };
    34. };
    Tham khảo tài liệu.
    Đã được chỉnh sửa lần cuối bởi kitti : 27-02-2011 lúc 10:26 PM. Lý do: chỉnh lại tiêu đề cho dễ nhận biết và đưa code vào tag code
    Không biết ghi gì luôn ...

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

    Mặc định vẽ đồ họa bằng thư viện glut

    tớ dùng VC 6.0 để vẽ đồ họa
    dùn thư viện glut

    để chạy được các cậu phải có file sau.
    glut32.lib
    glut32.dll
    glut32.h

    http://www.box.net/shared/h3qsfhb5ef

    có đủ file đầy đủ trong đó và hướng dẫn.
    Kỳ này Học môn này tớ quải đạn quá toàn toán hình học mình lại yếu với lại không giúp ích được gì cho mình.Dù sao trông cho thi qua

    VẼ hình tròn bao gồm các ngôi sao bên trong.

    C++ Code:
    1. #include<gl/glut.h>
    2. #include<math.h>
    3. #define PI 3.14159
    4. #define Width 640
    5. #define Height 480
    6. #define Radius 200
    7. void display(void)
    8. {
    9.     int i,R;double phi;
    10.     glClear(GL_COLOR_BUFFER_BIT);
    11.     glColor3f(10,1.0,0.0);
    12.     //ve ngu giac
    13.     phi=PI/2;
    14.     glBegin(GL_LINE_LOOP);
    15.     for(i=0;i<5;i++)
    16.     {
    17.             glVertex2f(Radius*cos(phi),Radius*sin(phi));
    18.             phi+=2*PI/5;
    19.     }
    20.     glEnd();
    21.     //ve luc giac
    22.     phi=PI/3;
    23.     glBegin(GL_LINE_LOOP);
    24.     for(i=0;i<6;i++)
    25.     {
    26.             glVertex2f(Radius*cos(phi),Radius*sin(phi));
    27.             phi+=2*PI/6;
    28.     }
    29.     glEnd();
    30.     //ve ngoi sao
    31.     phi=PI/2;
    32.     R=Radius;
    33.     //glBegin(GL_LINE_LOOP);
    34.     //for(int k=0;k<3;k++)
    35.     //{
    36.         glBegin(GL_LINE_LOOP);
    37.         for(i=0;i<5;i++)
    38.         {
    39.             glVertex2f(R*cos(phi),R*sin(phi));
    40.             phi+=4*PI/5;
    41.         }
    42.         glEnd();
    43.         phi=PI/2+PI/5;
    44.         R=(R*sin(PI/10))/sin(3*PI/10);
    45.         glBegin(GL_LINE_LOOP);
    46.         for(i=0;i<5;i++)
    47.         {
    48.             glVertex2f(R*cos(phi),R*sin(phi));
    49.             phi+=4*PI/5;
    50.         }
    51.         glEnd();
    52.     //}
    53.     glEnd();
    54.  
    55.    
    56.     // ve vong tron
    57.     glBegin(GL_LINE_LOOP);
    58.     for(i=0;i<100;i++)
    59.     {
    60.         phi=2*PI*i/100;
    61.         glVertex2f(Radius*cos(phi),Radius*sin(phi));
    62.     }
    63.     glEnd();
    64.     //ve ngoi sao
    65.     glFlush();
    66. }
    67. void init(void)
    68. {
    69.     GLdouble hW,hH;
    70.     glClearColor(0.0,0.0,0.0,0.0);
    71.     hW=(GLdouble) Width/2.0;
    72.     hH=(GLdouble) Height/2.0;
    73.     gluOrtho2D(-hW,hW,-hH,hH);
    74. }
    75. void main(int argc,char **argv)
    76. {
    77.     glutInit(&argc,argv);
    78.     glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    79.     glutInitWindowSize(Width,Height);
    80.     glutCreateWindow(" kkkkk");
    81.     init();
    82.     //glutDisplayFunc(vengugiac);
    83.     glutDisplayFunc(display);
    84.     glutMainLoop();
    85. }
    Đã được chỉnh sửa lần cuối bởi kitti : 27-02-2011 lúc 10:27 PM. Lý do: chỉnh lại tiêu đề cho dễ nhận biết và đưa code vào tag code
    .....oooo0.............
    .....(.....)....0oooo..
    ......\...(......(.....)....
    .......\._).......).../.....
    ..................(_./......
    Bước chậm mà chắc.

  6. #6
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Mặc định Source graphics.h

    Nếu là Borland C thì bạn làm thế này nhé:
    Chọn menu Options/linker.../Libraries.../ Đánh dấu chọn Graphics library
    Xem lại thử nha
    Source graphics.h bạn cần có phải đây không?
    C++ Code:
    1. /*  graphics.h
    2.  
    3.     Definitions for Graphics Package.
    4.  
    5.     Copyright (c) 1987, 1992 by Borland International
    6.     All Rights Reserved.
    7. */
    8.  
    9. #if defined( _Windows )
    10. #error BGI graphics not supported under Windows
    11. #endif
    12.  
    13. #if !defined(__GRAPHICS_H)
    14. #define __GRAPHICS_H
    15.  
    16. #if !defined(___DEFS_H)
    17. #include <_defs.h>
    18. #endif
    19.  
    20. #define _Cdecl  cdecl
    21.  
    22. enum graphics_errors {      /* graphresult error return codes */
    23.     grOk           =   0,
    24.     grNoInitGraph      =  -1,
    25.     grNotDetected      =  -2,
    26.     grFileNotFound     =  -3,
    27.     grInvalidDriver    =  -4,
    28.     grNoLoadMem    =  -5,
    29.     grNoScanMem    =  -6,
    30.     grNoFloodMem       =  -7,
    31.     grFontNotFound     =  -8,
    32.     grNoFontMem    =  -9,
    33.     grInvalidMode      = -10,
    34.     grError        = -11,   /* generic error */
    35.     grIOerror      = -12,
    36.     grInvalidFont      = -13,
    37.     grInvalidFontNum   = -14,
    38.     grInvalidVersion   = -18
    39. };
    40.  
    41. enum graphics_drivers {     /* define graphics drivers */
    42.     DETECT,         /* requests autodetection */
    43.     CGA, MCGA, EGA, EGA64, EGAMONO, IBM8514,    /* 1 - 6 */
    44.     HERCMONO, ATT400, VGA, PC3270,          /* 7 - 10 */
    45.     CURRENT_DRIVER = -1
    46. };
    47.  
    48. enum graphics_modes {       /* graphics modes for each driver */
    49.     CGAC0      = 0,  /* 320x200 palette 0; 1 page   */
    50.     CGAC1      = 1,  /* 320x200 palette 1; 1 page   */
    51.     CGAC2      = 2,  /* 320x200 palette 2: 1 page   */
    52.     CGAC3      = 3,  /* 320x200 palette 3; 1 page   */
    53.     CGAHI      = 4,  /* 640x200 1 page          */
    54.     MCGAC0     = 0,  /* 320x200 palette 0; 1 page   */
    55.     MCGAC1     = 1,  /* 320x200 palette 1; 1 page   */
    56.     MCGAC2     = 2,  /* 320x200 palette 2; 1 page   */
    57.     MCGAC3     = 3,  /* 320x200 palette 3; 1 page   */
    58.     MCGAMED    = 4,  /* 640x200 1 page          */
    59.     MCGAHI     = 5,  /* 640x480 1 page          */
    60.     EGALO      = 0,  /* 640x200 16 color 4 pages    */
    61.     EGAHI      = 1,  /* 640x350 16 color 2 pages    */
    62.     EGA64LO    = 0,  /* 640x200 16 color 1 page     */
    63.     EGA64HI    = 1,  /* 640x350 4 color  1 page     */
    64.     EGAMONOHI  = 0,  /* 640x350 64K on card, 1 page - 256K on card, 4 pages */
    65.     HERCMONOHI = 0,  /* 720x348 2 pages         */
    66.     ATT400C0   = 0,  /* 320x200 palette 0; 1 page   */
    67.     ATT400C1   = 1,  /* 320x200 palette 1; 1 page   */
    68.     ATT400C2   = 2,  /* 320x200 palette 2; 1 page   */
    69.     ATT400C3   = 3,  /* 320x200 palette 3; 1 page   */
    70.     ATT400MED  = 4,  /* 640x200 1 page          */
    71.     ATT400HI   = 5,  /* 640x400 1 page          */
    72.     VGALO      = 0,  /* 640x200 16 color 4 pages    */
    73.     VGAMED     = 1,  /* 640x350 16 color 2 pages    */
    74.     VGAHI      = 2,  /* 640x480 16 color 1 page     */
    75.     PC3270HI   = 0,  /* 720x350 1 page          */
    76.     IBM8514LO  = 0,  /* 640x480 256 colors      */
    77.     IBM8514HI  = 1   /*1024x768 256 colors      */
    78. };
    79.  
    80. /* Colors for setpalette and setallpalette */
    81.  
    82. #if !defined(__COLORS)
    83. #define __COLORS
    84.  
    85. enum COLORS {
    86.     BLACK,          /* dark colors */
    87.     BLUE,
    88.     GREEN,
    89.     CYAN,
    90.     RED,
    91.     MAGENTA,
    92.     BROWN,
    93.     LIGHTGRAY,
    94.     DARKGRAY,           /* light colors */
    95.     LIGHTBLUE,
    96.     LIGHTGREEN,
    97.     LIGHTCYAN,
    98.     LIGHTRED,
    99.     LIGHTMAGENTA,
    100.     YELLOW,
    101.     WHITE
    102. };
    103. #endif
    104.  
    105. enum CGA_COLORS {
    106.     CGA_LIGHTGREEN     = 1,     /* Palette C0 Color Names   */
    107.     CGA_LIGHTRED       = 2,
    108.     CGA_YELLOW         = 3,
    109.  
    110.     CGA_LIGHTCYAN      = 1,     /* Palette C1 Color Names   */
    111.     CGA_LIGHTMAGENTA   = 2,
    112.     CGA_WHITE          = 3,
    113.  
    114.     CGA_GREEN          = 1,     /* Palette C2 Color Names   */
    115.     CGA_RED        = 2,
    116.     CGA_BROWN          = 3,
    117.  
    118.     CGA_CYAN           = 1,     /* Palette C3 Color Names   */
    119.     CGA_MAGENTA        = 2,
    120.     CGA_LIGHTGRAY      = 3
    121. };
    122.  
    123.  
    124. enum EGA_COLORS {
    125.     EGA_BLACK        =  0,      /* dark colors */
    126.     EGA_BLUE         =  1,
    127.     EGA_GREEN        =  2,
    128.     EGA_CYAN         =  3,
    129.     EGA_RED      =  4,
    130.     EGA_MAGENTA      =  5,
    131.     EGA_BROWN        =  20,
    132.     EGA_LIGHTGRAY    =  7,
    133.     EGA_DARKGRAY     =  56,     /* light colors */
    134.     EGA_LIGHTBLUE    =  57,
    135.     EGA_LIGHTGREEN   =  58,
    136.     EGA_LIGHTCYAN    =  59,
    137.     EGA_LIGHTRED     =  60,
    138.     EGA_LIGHTMAGENTA     =  61,
    139.     EGA_YELLOW       =  62,
    140.     EGA_WHITE        =  63
    141. };
    142.  
    143. enum line_styles {      /* Line styles for get/setlinestyle */
    144.     SOLID_LINE   = 0,
    145.     DOTTED_LINE  = 1,
    146.     CENTER_LINE  = 2,
    147.     DASHED_LINE  = 3,
    148.     USERBIT_LINE = 4,   /* User defined line style */
    149. };
    150.  
    151. enum line_widths {      /* Line widths for get/setlinestyle */
    152.     NORM_WIDTH  = 1,
    153.     THICK_WIDTH = 3,
    154. };
    155.  
    156. enum font_names {
    157.     DEFAULT_FONT    = 0,    /* 8x8 bit mapped font */
    158.     TRIPLEX_FONT    = 1,    /* "Stroked" fonts */
    159.     SMALL_FONT  = 2,
    160.     SANS_SERIF_FONT = 3,
    161.     GOTHIC_FONT = 4,
    162.     SCRIPT_FONT = 5,
    163.     SIMPLEX_FONT = 6,
    164.     TRIPLEX_SCR_FONT = 7,
    165.     COMPLEX_FONT = 8,
    166.     EUROPEAN_FONT = 9,
    167.     BOLD_FONT = 10
    168. };
    169.  
    170. #define HORIZ_DIR   0   /* left to right */
    171. #define VERT_DIR    1   /* bottom to top */
    172.  
    173. #define USER_CHAR_SIZE  0   /* user-defined char size */
    174.  
    175. enum fill_patterns {        /* Fill patterns for get/setfillstyle */
    176.     EMPTY_FILL,     /* fills area in background color */
    177.     SOLID_FILL,     /* fills area in solid fill color */
    178.     LINE_FILL,      /* --- fill */
    179.     LTSLASH_FILL,       /* /// fill */
    180.     SLASH_FILL,     /* /// fill with thick lines */
    181.     BKSLASH_FILL,       /* \\\ fill with thick lines */
    182.     LTBKSLASH_FILL,     /* \\\ fill */
    183.     HATCH_FILL,     /* light hatch fill */
    184.     XHATCH_FILL,        /* heavy cross hatch fill */
    185.     INTERLEAVE_FILL,    /* interleaving line fill */
    186.     WIDE_DOT_FILL,      /* Widely spaced dot fill */
    187.     CLOSE_DOT_FILL,     /* Closely spaced dot fill */
    188.     USER_FILL       /* user defined fill */
    189. };
    190.  
    191. enum putimage_ops {     /* BitBlt operators for putimage */
    192.     COPY_PUT,       /* MOV */
    193.     XOR_PUT,        /* XOR */
    194.     OR_PUT,         /* OR  */
    195.     AND_PUT,        /* AND */
    196.     NOT_PUT         /* NOT */
    197. };
    198.  
    199. enum text_just {        /* Horizontal and vertical justification
    200.                    for settextjustify */
    201.     LEFT_TEXT   = 0,
    202.     CENTER_TEXT = 1,
    203.     RIGHT_TEXT  = 2,
    204.  
    205.     BOTTOM_TEXT = 0,
    206.      /* CENTER_TEXT = 1,  already defined above */
    207.     TOP_TEXT    = 2
    208. };
    209.  
    210.  
    211. #define MAXCOLORS 15
    212.  
    213. struct palettetype {
    214.     unsigned char size;
    215.     signed char colors[MAXCOLORS+1];
    216. };
    217.  
    218. struct linesettingstype {
    219.     int linestyle;
    220.     unsigned upattern;
    221.     int thickness;
    222. };
    223.  
    224. struct textsettingstype {
    225.     int font;
    226.     int direction;
    227.     int charsize;
    228.     int horiz;
    229.     int vert;
    230. };
    231.  
    232. struct fillsettingstype {
    233.     int pattern;
    234.     int color;
    235. };
    236.  
    237. struct pointtype {
    238.     int x, y;
    239. };
    240.  
    241. struct viewporttype {
    242.     int left, top, right, bottom;
    243.     int clip;
    244. };
    245.  
    246. struct arccoordstype {
    247.     int x, y;
    248.     int xstart, ystart, xend, yend;
    249. };
    250.  
    251. #ifdef __cplusplus
    252. extern "C" {
    253. #endif
    254. void       far _Cdecl arc(int __x, int __y, int __stangle, int __endangle,
    255.               int __radius);
    256. void       far _Cdecl bar(int __left, int __top, int __right, int __bottom);
    257. void       far _Cdecl bar3d(int __left, int __top, int __right, int __bottom,
    258.                 int __depth, int __topflag);
    259. void       far _Cdecl circle(int __x, int __y, int __radius);
    260. void       far _Cdecl cleardevice(void);
    261. void       far _Cdecl clearviewport(void);
    262. void       far _Cdecl closegraph(void);
    263. void       far _Cdecl detectgraph(int far *__graphdriver,int far *__graphmode);
    264. void       far _Cdecl drawpoly(int __numpoints, const int far *__polypoints);
    265. void       far _Cdecl ellipse(int __x, int __y, int __stangle, int __endangle,
    266.                   int __xradius, int __yradius);
    267. void       far _Cdecl fillellipse( int __x, int __y, int __xradius, int __yradius );
    268. void       far _Cdecl fillpoly(int __numpoints, const int far *__polypoints);
    269. void       far _Cdecl floodfill(int __x, int __y, int __border);
    270. void       far _Cdecl getarccoords(struct arccoordstype far *__arccoords);
    271. void       far _Cdecl getaspectratio(int far *__xasp, int far *__yasp);
    272. int    far _Cdecl getbkcolor(void);
    273. int    far _Cdecl getcolor(void);
    274. struct palettetype far * far _Cdecl getdefaultpalette( void );
    275. char *     far _Cdecl getdrivername( void );
    276. void       far _Cdecl getfillpattern(char far *__pattern);
    277. void       far _Cdecl getfillsettings(struct fillsettingstype far *__fillinfo);
    278. int    far _Cdecl getgraphmode(void);
    279. void       far _Cdecl getimage(int __left, int __top, int __right, int __bottom,
    280.                    void far *__bitmap);
    281. void       far _Cdecl getlinesettings(struct linesettingstype far *__lineinfo);
    282. int    far _Cdecl getmaxcolor(void);
    283. int    far _Cdecl getmaxmode(void);
    284. int    far _Cdecl getmaxx(void);
    285. int    far _Cdecl getmaxy(void);
    286. char *     far _Cdecl getmodename( int __mode_number );
    287. void       far _Cdecl getmoderange(int __graphdriver, int far *__lomode,
    288.                    int far *__himode);
    289. unsigned   far _Cdecl getpixel(int __x, int __y);
    290. void       far _Cdecl getpalette(struct palettetype far *__palette);
    291. int    far _Cdecl getpalettesize( void );
    292. void       far _Cdecl gettextsettings(struct textsettingstype far *__texttypeinfo);
    293. void       far _Cdecl getviewsettings(struct viewporttype far *__viewport);
    294. int    far _Cdecl getx(void);
    295. int    far _Cdecl gety(void);
    296. void       far _Cdecl graphdefaults(void);
    297. char *     far _Cdecl grapherrormsg(int __errorcode);
    298. void       far _Cdecl _graphfreemem(void far *__ptr, unsigned __size);
    299. void far * far _Cdecl _graphgetmem(unsigned __size);
    300. int    far _Cdecl graphresult(void);
    301. unsigned   far _Cdecl imagesize(int __left, int __top, int __right, int __bottom);
    302. void       far _Cdecl initgraph(int  far *__graphdriver,
    303.                 int  far *__graphmode,
    304.                 const char far *__pathtodriver);
    305. int    far _Cdecl installuserdriver( const char far *__name,
    306.                 int huge (*detect)(void) );
    307. int    far _Cdecl installuserfont( const char far *__name );
    308. void       far _Cdecl line(int __x1, int __y1, int __x2, int __y2);
    309. void       far _Cdecl linerel(int __dx, int __dy);
    310. void       far _Cdecl lineto(int __x, int __y);
    311. void       far _Cdecl moverel(int __dx, int __dy);
    312. void       far _Cdecl moveto(int __x, int __y);
    313. void       far _Cdecl outtext(const char far *__textstring);
    314. void       far _Cdecl outtextxy(int __x, int __y, const char far *__textstring);
    315. void       far _Cdecl pieslice(int __x, int __y, int __stangle, int __endangle,
    316.                    int __radius);
    317. void       far _Cdecl putimage(int __left, int __top, const void far *__bitmap,
    318.                 int __op);
    319. void       far _Cdecl putpixel(int __x, int __y, int __color);
    320. void       far _Cdecl rectangle(int __left, int __top, int __right, int __bottom);
    321. void       far _Cdecl restorecrtmode(void);
    322. void       far _Cdecl sector( int __X, int __Y, int __StAngle, int __EndAngle,
    323.                   int __XRadius, int __YRadius );
    324. void       far _Cdecl setactivepage(int __page);
    325. void       far _Cdecl setallpalette(const struct palettetype far *__palette);
    326. void       far _Cdecl setaspectratio( int __xasp, int __yasp );
    327. void       far _Cdecl setbkcolor(int __color);
    328. void       far _Cdecl setcolor(int __color);
    329. void       far _Cdecl setfillpattern(const char far *__upattern, int __color);
    330. void       far _Cdecl setfillstyle(int __pattern, int __color);
    331. unsigned   far _Cdecl setgraphbufsize(unsigned __bufsize);
    332. void       far _Cdecl setgraphmode(int __mode);
    333. void       far _Cdecl setlinestyle(int __linestyle, unsigned __upattern,
    334.                    int __thickness);
    335. void       far _Cdecl setpalette(int __colornum, int __color);
    336. void       far _Cdecl setrgbpalette(int __colornum,
    337.                     int __red, int __green, int __blue);
    338. void       far _Cdecl settextjustify(int __horiz, int __vert);
    339. void       far _Cdecl settextstyle(int __font, int __direction, int __charsize);
    340. void       far _Cdecl setusercharsize(int __multx, int __divx,
    341.                       int __multy, int __divy);
    342. void       far _Cdecl setviewport(int __left, int __top, int __right, int __bottom,
    343.                   int __clip);
    344. void       far _Cdecl setvisualpage(int __page);
    345. void       far _Cdecl setwritemode( int __mode );
    346. int    far _Cdecl textheight(const char far *__textstring);
    347. int    far _Cdecl textwidth(const char far *__textstring);
    348.  
    349. /***** graphics drivers *****/
    350.  
    351. int        _Cdecl registerbgidriver(void (*driver)(void));
    352. int    far _Cdecl registerfarbgidriver(void far *__driver);
    353.  
    354. /* !!        These "functions" are NOT user-callable          !! */
    355. /* !! They are there just so you can link in graphics drivers !! */
    356.  
    357. void           _Cdecl CGA_driver(void);
    358. void           _Cdecl EGAVGA_driver(void);
    359. void           _Cdecl IBM8514_driver(void);
    360. void           _Cdecl Herc_driver(void);
    361. void           _Cdecl ATT_driver(void);
    362. void           _Cdecl PC3270_driver(void);
    363.  
    364. extern int far _Cdecl CGA_driver_far[];
    365. extern int far _Cdecl EGAVGA_driver_far[];
    366. extern int far _Cdecl IBM8514_driver_far[];
    367. extern int far _Cdecl Herc_driver_far[];
    368. extern int far _Cdecl ATT_driver_far[];
    369. extern int far _Cdecl PC3270_driver_far[];
    370.  
    371.  
    372. /***** graphics fonts *****/
    373.  
    374. int        _Cdecl registerbgifont(void (*font)(void));
    375. int    far _Cdecl registerfarbgifont(void far *__font);
    376.  
    377. /* !!   These "functions" are NOT user-callable,   !! */
    378. /* !! they are there just so you can link in fonts !! */
    379.  
    380. void           _Cdecl   triplex_font(void);
    381. void           _Cdecl     small_font(void);
    382. void           _Cdecl sansserif_font(void);
    383. void           _Cdecl    gothic_font(void);
    384.  
    385. extern int far _Cdecl   triplex_font_far[];
    386. extern int far _Cdecl     small_font_far[];
    387. extern int far _Cdecl sansserif_font_far[];
    388. extern int far _Cdecl    gothic_font_far[];
    389.  
    390. #ifdef __cplusplus
    391. }
    392. #endif
    393.  
    394. #endif
    Đã được chỉnh sửa lần cuối bởi kitti : 27-02-2011 lúc 10:28 PM. Lý do: chỉnh lại tiêu đề cho dễ nhận biết và đưa code vào tag code
    Không biết ghi gì luôn ...

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

    Mặc định Cách vẽ ngôi sao n đỉnh

    Thấy mấy bạn post mấy bài về phần đồ họa mình cũng xin góp 1 bài.

    bài này mình làm ở cái kỳ mình học môn đồ họa.

    cái này mình viết để mình vẽ ngôi sao n đỉnh.
    C++ Code:
    1.  
    2. void DrawStartN(CDC *pDC,
    3.                 CPoint pc, // tam
    4.                 int r, // ban kinh duong tron ben ngoai
    5.                 int n, // so canh _ la so chan
    6.                 double angle, // goc tai vi tri bat dau ve
    7.                                 int color // mau duong bien cua ngoi sao
    8.                 )
    9. {
    10.     CPoint *a;
    11.     a = new CPoint[n*2];
    12.     float anpha = angle ;
    13.     float tmp = PI - PI/n - PI/(n*2);
    14.     int ir = (int)(r*sin(PI/(n*2)))/sin(tmp);
    15.  
    16.     for(int i=0; i<n*2; i+=2)
    17.     {
    18.         a[i].x = r*cos(anpha)+pc.x;
    19.         a[i].y = r*sin(-anpha)+pc.y;
    20.         anpha += 2*PI/n;
    21.     }
    22.     anpha = angle + PI/n;
    23.     for(int i=1; i<n*2; i+=2)
    24.     {
    25.         a[i].x = ir*cos(anpha)+pc.x;
    26.         a[i].y = ir*sin(-anpha)+pc.y;
    27.         anpha += 2*PI/n;
    28.     }
    29.     for(int i=0; i<n*2-1; i++)
    30.     {
    31.         DrawLine(pDC,a[i],a[i+1],color);
    32.     }
    33.     DrawLine(pDC,a[0],a[n*2-1],color);
    34.     delete(a);
    35. }

    với hàm DrawLine các bạn có thể dùng các hàm của thuật toán DDA, Bres, hay là MidPoint đều được.
    các hàm này mình thấy có bạn đã post lên rồi nên mình ko post lên nữa.
    Đã được chỉnh sửa lần cuối bởi kitti : 27-02-2011 lúc 10:28 PM. Lý do: chỉnh lại tiêu đề cho dễ nhận biết và đưa code vào tag code

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

    Một thuộc tính khác của màn hình là tỉ số phương (aspect ratio). Tỉ số phương là tỉ lệ của các điểm dọc và các điểm ngang cần để phát sinh các đoạn đoạn thẳng có độ dài đơn vị theo cả hai hướng trên màn hình (trong một số trường hợp người ta thường dùng tỉ số phương như là tỉ số của các điểm theo chiều ngang so với các điểm theo chiều dọc). Với màn hình có tỉ số phương khác 1, dễ dàng nhận thấy là các hình vuông hiển thị trên nó sẽ có dạng hình chữ nhật, các hình tròn sẽ có dạng hình ellipse. Thực ra khái niệm tỉ số phương xuất phát từ bản chất khoảng cách (nếu tính cùng một đơn vị độ dài) giữa các điểm dọc không bằng khoảng cách giữa các điểm ngang. một tỉ số phương có giá trị 3/4 có nghĩa là vẽ 3 điểm theo chiều dọc sẽ có cùng độ dài với việc vẽ 4 điểm theo chiều ngang.

    Đây là một khái niêm mà mình nghĩ cũng rất quan trọng trong đồ họa máy tính. Bởi vì kích thước màn hình của ta có thể thay đổi nên những hình ảnh mà chúng ta hiển thị có thể bị biến dạng. vậy làm sao để có áp dụng cái khái niệm này một cách đúng đắn trong quá trình xử lý việc hiển thị trên màn hình mong mọi người cùng thảo luận để cho nó được rõ ràng hơn.

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

    @duonggiatuong: sorry bạn có một thời gian mình không vào cviet nay mới quay lại hơn tháng nay . lúc quay lại thì bài này nó trôi đi mất xuống mấy trang dưới đó nên không thấy để trả lời cho bạn được. cái CDC ở đây là hồi trước mình làm bên VC++6.0 môi trường MFC. CDC là lớp chuẩn về đồ họa của GDI trong MFC. cái này muốn chạy được thì phải mang vào MFC để chạy.

    @ghost_IT: tại đây
    Code:
    //khoi tao
    initgraph(&gdriver,&gmode,"");
    trong dấu "" bạn nên đưa đường dẫn của graphics của TC hay BC vào.
    vd:
    Code:
    //khoi tao
    initgraph(&gdriver,&gmode,"???");
    cái ??? là đường dẫn tới file đồ họa của BC hay TC. ví dụ: "C:\\BC\\Graphics" lâu rùi không đụng tới 2 cu này nên quên béng mất tiu rùi bạn xem để cursor vào chổ initgraph sau đó Ctrl+F1 là thấy ví dụ của nó rùi bắt chước là được ah.

    chúc bạn thành công.
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 11-09-2008 lúc 12:17 PM.

  10. #10
    Ngày gia nhập
    11 2008
    Bài viết
    2

    Tui vừa làm bài tập về: Vẽ hình sao vừa quay vừa di chuyển(Dùng 4 phím mũi tên để di chuyển).Thấy mọi người góp bài tôi cũng xin góp.


    C++ Code:
    1. #include<dos.h>
    2.  #include<stdio.h>
    3.  #include<stdlib.h>
    4.  #include<math.h>
    5.  #include<conio.h>
    6.  #include<iostream.h>
    7.  void mode(int m)
    8.  {
    9.     union REGS r;
    10.     r.h.ah=0;
    11.     r.h.al=m;
    12.     int86(16,&r,&r);
    13.  }
    14.  
    15.  void point(int x, int y,int c)
    16.  {
    17.    if ((x>=0)&&(x<200)&&(y>=0)&&(y<320))
    18.       *((char far*) 0xA0000000 + 320*x+y)=c;
    19.  }
    20.  
    21.  void dt1(int x1, int y1, int x2, int y2, int color)
    22.  {
    23. int d, ax, ay, sx, sy, dx, dy;
    24.  
    25. dx = x2-x1;
    26. ax = abs(dx) << 1;
    27. if (dx < 0) sx = -1; else sx = 1;
    28.  
    29. dy = y2-y1;
    30. ay = abs(dy) << 1;
    31. if (dy < 0) sy = -1; else sy = 1;
    32.  
    33. point(x1, y1, color);
    34.  
    35. if (ax > ay) {
    36. d = ay-(ax >> 1);
    37. while (x1 != x2) {
    38. if (d >= 0) {
    39. y1 = y1 + sy;
    40. d = d - ax;
    41. }
    42. x1 = x1 + sx;
    43. d = d + ay;
    44. point(x1, y1, color);
    45. } //while
    46. } else {
    47. d = ax-(ay >> 1);
    48. while (y1 != y2) {
    49. if (d >= 0) {
    50. x1 = x1 + sx;
    51. d = d - ay;
    52. }
    53. y1 = y1 + sy;
    54. d = d + ax;
    55. point(x1, y1, color);
    56. } //while
    57. } //if
    58. } //end drawLine
    59.  
    60.    void ve_hinhsao(double afa,int xo,int yo,int xc,int yc,int r,int c)
    61.      {
    62.     int a[5],b[5];
    63.     double i;
    64.      //  xo=xc+r; yo=yc;
    65.     //  cout<<afa<<"\n";
    66.        for (i=1;i<5;i+=1)
    67.       {
    68.          a[i]=ceil(r*cos(afa+(72*3.14*i)/180))+xc;
    69.          b[i]=ceil(r*sin(afa+(72*3.14*i)/180))+yc;
    70.        }
    71.       dt1(xo,yo,a[2],b[2],c);
    72.       dt1(xo,yo,a[3],b[3],c);
    73.       dt1(a[1],b[1],a[3],b[3],c);
    74.       dt1(a[2],b[2],a[4],b[4],c);
    75.       dt1(a[1],b[1],a[4],b[4],c);
    76.      }
    77.        void sao_dc(double a,int xo,int yo,int xc,int yc,int r,int c)
    78.       {
    79.       xo=xc+r;yo=yc;
    80.       a=atan(yo/xo) ;
    81.       ve_hinhsao(a,xo,yo,xc,yc,r,c);
    82.       delay(50);
    83.       ve_hinhsao(a,xo,yo,xc,yc,r,0);
    84.  
    85.    char c1, c2; int i=1;
    86.     while (1) {
    87.         if (i==360) i=0;
    88.         else i++;
    89.         xo=ceil(r*cos(a+i*3.14/180))+xc;
    90.         yo=ceil(r*sin(a+i*3.14/180))+yc;
    91.         ve_hinhsao(a+i*3.14/180,xo,yo,xc,yc,r,c);
    92.         delay(50);
    93.         ve_hinhsao(a+i*3.14/180,xo,yo,xc,yc,r,0);
    94.  
    95.     if (kbhit()) {
    96.         if ((c1=getch())==0) {
    97.         c2 = getch();
    98.         if (c2==77)
    99.         {
    100.          ve_hinhsao(a,xo,yo,xc,yc,r,c);
    101.          ve_hinhsao(a,xo,yo,xc,yc,r,0);
    102.          yc++;
    103.         }
    104.         else if (c2==75)
    105.         {
    106.          ve_hinhsao(a,xo,yo,xc,yc,r,c);
    107.          ve_hinhsao(a,xo,yo,xc,yc,r,0);
    108.           yc--;
    109.          }
    110.         else if (c2==80)
    111.         {
    112.          ve_hinhsao(a,xo,yo,xc,yc,r,c);
    113.          ve_hinhsao(a,xo,yo,xc,yc,r,0);
    114.           xc++;
    115.          }
    116.         else if (c2==72)
    117.         {
    118.          ve_hinhsao(a,xo,yo,xc,yc,r,c);
    119.          ve_hinhsao(a,xo,yo,xc,yc,r,0);
    120.            xc--;
    121.          }
    122.  
    123.         }
    124.         else
    125.                 break;
    126.     }
    127.     }
    128.  
    129.  }
    130.  
    131.   void main()
    132.  {
    133.    int lc,xo,yo,xc,yc,c,r;
    134.   xc=90;yc=90;c=11;r=50;
    135.    mode(19);
    136.  int    a=0;
    137.     sao_dc(a,xo,yo,xc,yc,r,c);
    138.  
    139.    getch();
    140.    mode(3);
    141.  }

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