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

Đề tài: Mã nguồn C | Thuật toán vẽ ellipse bằng C

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

    Mặc định Mã nguồn C | Thuật toán vẽ ellipse bằng C

    C Code:
    1. #include <math.h>
    2. #include <stdio.h>
    3. #include <conio.h>
    4. #include <graphics.h>
    5. #define Round(a) int(a+0.5)
    6. int color=GREEN;
    7. void putpixel(int x,int y)//,int t1,int t2)
    8. {
    9.     //int x0,y0;
    10.     putpixel(x+100,y+100,color);
    11.     putpixel(x+100,-y+100,color);
    12.     putpixel(-x+100,-y+100,color);
    13.     putpixel(-x+100,y+100,color);
    14. }
    15. void ellipse(int a,int b)
    16. {
    17.     int x,y,x0,y0;
    18.     float p1,p2,p;
    19.     //printf("Toa do x0 ban dau:");scanf("%d",&x0);
    20.     //printf("Toa do y0 ban dau:");scanf("%d",&y0);
    21.     x=0;
    22.     y=b;
    23.     putpixel(x,y);
    24.     p=2*b*b/(a*a)-2*b+1;
    25.     while(a*a*y>b*b*x)
    26.     {
    27.  
    28.         if(p<=0)
    29.             p+=2*b*b/(a*a)*(2*x+3);
    30.         else
    31.         {
    32.             p+=2*b*b/(a*a)*(2*x+3)+4*(1-y);
    33.             y--;
    34.         }
    35.         x++;
    36.         putpixel(x,y);
    37.     }
    38.     x=a;
    39.     y=0;
    40.     putpixel(x,y);
    41.     p=2*a*a/b*b-2*a+1;
    42.     while(a*a*y<=b*b*x)
    43.     {
    44.  
    45.         if(p<0)
    46.             p+=2*a*a/(b*b)*(2*y+3);
    47.         else
    48.         {
    49.             p+=2*a*a/(b*b)*(2*y+3)+4*(1-x);
    50.             x--;
    51.         }
    52.         y++;
    53.         putpixel(x,y);
    54.     }
    55. }
    56. main()
    57. {
    58.     int gd=DETECT,gm,r;
    59.     initgraph(&gd,&gm,"d:\\tc\\bgi");
    60.     //printf("Ban kinh duong tron:");scanf("%d",&r);
    61.     //ellipse(100,100,0,360,100,50);
    62.     ellipse(100,50);
    63.  
    64.     //circle(100,100,100);
    65.     //line(50,50,350,300);
    66.     getch();
    67.     closegraph();
    68. }

    Moi người cho tớ hỏi bài vẽ ellipse này tớ sai ở đâu mà nó kô vẽ đc thế, có phải sai chỗ vòng lặp không thế, nếu đúng vậy thì cho tớ hỏi là tớ phải sửa thế nào cho đúng.

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

    Cho bạn khúc code của mình nè code bằng midpoint.
    compiler VC++
    cái này là một phần trong class CEllipse của mình bạn tham khảo thêm nhé.

    C++ Code:
    1.  
    2. void CEllipse::DrawMidPoint(CDC *pDC)
    3. {
    4.     int xc,yc;
    5.     xc = point_center.x;
    6.     yc = point_center.y;
    7.     int x,y,a2,b2,max_x,max_y;
    8.     int n,m,phi;
    9.     a2 = a*a;
    10.     b2 = b*b;
    11.    
    12.     phi = b2 - a2*b;
    13.     m = 3*b2;
    14.     n = 2*a2-2*a2*b+3*b2;
    15.  
    16.     x = 0;
    17.     y = b;
    18.  
    19.     max_x = int(a2/sqrtf(a2+b2));
    20.     max_y = int(b2/sqrtf(a2+b2));
    21.  
    22.     Set4Pixel(pDC,x,y);
    23.     while(x < max_x)
    24.     {
    25.         if(phi < 0)
    26.         {
    27.             phi+=m;
    28.             m+=2*b2;
    29.             n += 2*b2;
    30.         }
    31.         else
    32.         {
    33.             phi += n;
    34.             m += 2*b2;
    35.             n += (2*a2+2*b2);
    36.             y--;
    37.         }
    38.         x++;
    39.         Set4Pixel(pDC,x,y);;
    40.     }
    41.  
    42.     // cong viec 2
    43.     phi = a2 - b2*a;
    44.     m = 3*a2;
    45.     n = 2*b2-2*b2*a+3*a2;
    46.  
    47.     x = a;
    48.     y = 0;
    49.  
    50.     Set4Pixel(pDC,x,y);;
    51.     while(y < max_y)
    52.     {
    53.         if(phi < 0)
    54.         {
    55.             phi+=m;
    56.             m+=2*a2;
    57.             n += 2*a2;
    58.         }
    59.         else
    60.         {
    61.             phi += n;
    62.             m += 2*a2;
    63.             n += (2*b2+2*a2);
    64.             x--;
    65.         }
    66.         y++;
    67.         Set4Pixel(pDC,x,y);;
    68.     }
    69. }
    70. // hàm set 4 pixel.
    71. void CEllipse::Set4Pixel(CDC *pDC,int x,int y)
    72. {
    73.     int xc,yc;
    74.     xc =point_center.x;
    75.     yc = point_center.y;
    76.    
    77.     pDC->SetPixel(xc+x,yc+y,color);
    78.     pDC->SetPixel(xc+x,yc-y,color);
    79.     pDC->SetPixel(xc-x,yc+y,color);
    80.     pDC->SetPixel(xc-x,yc-y,color);
    81. }

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

    bạn ơi, thuật toán thì mình nắm được rồi nhưng kô hiểu vì sao lại không vẽ ra nổi thôi.

  4. #4
    Ngày gia nhập
    03 2010
    Nơi ở
    Sứ Lục Bắc Giang
    Bài viết
    24

    Mình cũng mắc lỗi đoạn này. Bài của mình là dùng thuật toán Midpoint để vẽ Elip. Ai biết test hộ Em bài này với. Em nghĩ mãi mà chẳng ra :(

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <graphics.h>
    4. #include <stdlib.h>
    5. #include <dos.h>
    6.  
    7. void tructd()
    8. {
    9.     line(-150,0,150,0);
    10.     line(145,5,150,0);
    11.     line(145,-5,150,0);
    12.     line(0,-150,0,150);
    13.     line(-5,-145,0,-150);
    14.     line(5,-145,0,-150);
    15.     outtextxy(5,5,"0");
    16.     outtextxy(150,10,"X");
    17.     outtextxy(10,-145,"Y");
    18.  
    19. }
    20. void put4(int u,int v,int x,int y,int c)
    21. {
    22.     putpixel(u+x,v+y,c);
    23.     putpixel(u+x,-v+y,c);
    24.     putpixel(-u+x,v+y,c);
    25.     putpixel(-u+x,-v+y,c);
    26.  
    27. }
    28. void elip()
    29. {
    30.  
    31.     int a,b,x,y;
    32.     printf(" Nhap toa do tam x= "); scanf("%d",&x);
    33.     printf(" Nhap toa do tam y= "); scanf("%d",&y);
    34.     printf(" Nhap do dai a= "); scanf("%d",&a);
    35.     printf(" Nhap do dai b= "); scanf("%d",&b);
    36.     int u,v;
    37.  
    38.     float p;
    39.     u=0;
    40.     v=b;
    41.     p=b*b-a*a*b+0.25*a*a;
    42.     put4(u,v,x,y,8);
    43.     while ( a*a*(v-0.5)>b*b*(u+1) )
    44.     {
    45.         if (p < 0)
    46.             p=p+b*b*(2*u+3);
    47.         else
    48.         {
    49.             p=p+b*b*(2*u+3)+a*a*(-2*v+2);
    50.             v=v-1;
    51.         }
    52.         u=u+1;
    53.         put4(u,v,x,y,8);
    54.         delay(50);
    55.      }
    56.      while(v>0)
    57.      {
    58.         if(p<0)
    59.         {
    60.             p=p+b*b*(2*u+2)+a*a*(3-2*v);
    61.             u=u+1;
    62.         }
    63.         else
    64.             p=p+a*a*(-2*v+3);
    65.         v=v-1;
    66.         put4(u,v,x,y,8);
    67.         delay(50);
    68.      }
    69.  
    70.  
    71. }
    72.  
    73. void main()
    74. {
    75.     int mh=0,mode=0;
    76.     initgraph(&mh,&mode,"E:\\LAPTRI~1\\SETUP\\BORLANDC\\BGI");
    77.     setbkcolor(1);
    78.     setviewport(200,200,400,400,0);
    79.     tructd();
    80.     elip();
    81.     getch();
    82.     closegraph();
    83. }

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

    Trích dẫn Nguyên bản được gửi bởi nobita611 Xem bài viết
    Moi người cho tớ hỏi bài vẽ ellipse này tớ sai ở đâu mà nó kô vẽ đc thế, có phải sai chỗ vòng lặp không thế, nếu đúng vậy thì cho tớ hỏi là tớ phải sửa thế nào cho đúng.
    Điều cơ bản là int a, int b đó, phải float chứ vì có phép chia a/b và b/a. Một chú ý nữa là, sao không đặt c = a*a/b/b để khỏi thực hiện mấy phép tính đó tại mỗi bước nhỉ.
    C Code:
    1. #include <math.h>
    2. #include <stdio.h>
    3. #include <conio.h>
    4. #include <graphics.h>
    5. #define Round(a) int(a+0.5)
    6. int color=GREEN;
    7. void putpixel(float x,float y)//,float t1,float t2)
    8. {
    9.     putpixel(x+100,y+100,color);
    10.     putpixel(x+100,-y+100,color);
    11.     putpixel(-x+100,-y+100,color);
    12.     putpixel(-x+100,y+100,color);
    13. }
    14. void ellipse(float a,float b)
    15. {
    16.     float x,y,x0,y0;
    17.     float p1,p2,p;
    18.     float c = b*b/a/a;
    19.     x=0;
    20.     y=b;
    21.     putpixel(x,y);
    22.     p=2*c-2*b+1;
    23.     while(y>=c*x)
    24.     {
    25.  
    26.         if(p<0) p+=2*c*(2*x+3);
    27.         else
    28.         {
    29.             p+=2*c*(2*x+3)+4*(1-y);
    30.             y--;
    31.         }
    32.         x++;
    33.         putpixel(x,y);
    34.     }
    35.     x=a;
    36.     y=0; c= a*a/b/b;
    37.     putpixel(x,y);
    38.     p=2*c-2*a+1;
    39.     while(c*y<=x)
    40.     {
    41.  
    42.         if(p<0)
    43.             p+=2*c*(2*y+3);
    44.         else
    45.         {
    46.             p+=2*c*(2*y+3)+4*(1-x);
    47.             x--;
    48.         }
    49.         y++;
    50.         putpixel(x,y);
    51.     }
    52. }
    53. void main()
    54. {
    55.     int gd=DETECT,gm,r;
    56.     initgraph(&gd,&gm,"d:\\tc\\bgi");
    57.     ellipse(100,50);
    58.     getch();
    59.     closegraph();
    60. }

  6. #6
    Ngày gia nhập
    03 2011
    Bài viết
    1

    Mặc định Mã nguồn C | Thuật toán vẽ ellipse bằng C

    bạn có thể dùng đoạn code sau:
    void drawelip(int xc,int yc,int a,int b)
    {
    float m1,m2,p;
    int x=0,y=b;
    m1=(float)(b*b)/(a*a);
    m2=(float)1/m1;
    p=2*m1-(2*b)+1;
    while(m1*(double)x/y<=1)
    {
    put4pixel(xc,yc,x,y);
    if (p<0)
    p=p+2*m1*(2*x+3);
    else
    {
    p=p+2*m1*(2*x+3)+4*(1-y);
    y--;
    }
    x++;
    }
    x=a;y=0;
    p=2*m2-2*a+1;
    while(m2*(double)y/x<=1)
    {
    put4pixel(xc,yc,x,y);
    if (p<0)
    p=p+2*m2*(2*y+3);
    else
    {
    p=p+2*m2*(2*y+3)+4*(1-x);
    x--;
    }
    y++;
    }
    }

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

  1. Kỹ thuật C++ giải thuật và thuật toán vẽ 3 đường conic
    Gửi bởi luuvanhoa93 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 04-09-2013, 11:36 AM
  2. Thuật toán C tô màu ellipse theo thuật toán dòng quét
    Gửi bởi san93st trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 0
    Bài viết cuối: 05-05-2013, 06:01 PM
  3. Vẽ đồ thị hàm số, Ứng dụng viết bằng C# [Đầy đủ mã nguồn]
    Gửi bởi thuongyeuxit trong diễn đàn Dự án & Source code C#, ASP.NET
    Trả lời: 5
    Bài viết cuối: 21-04-2013, 08:19 PM
  4. Mã nguồn C | Vẽ đường thẳng qua tọa độ 2 điểm
    Gửi bởi moonlight trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 01-09-2010, 11:26 AM
  5. Mã nguồn C++ | Thuật toán Trộn trên C++?
    Gửi bởi ITSPRO trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 21-10-2009, 06:12 PM

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