Hiển thị các bài đăng có nhãn Kỹ thuật đồ họa. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Kỹ thuật đồ họa. Hiển thị tất cả bài đăng

Giải thuật sinh đường Ellipse

Người đăng: culaoxanh88 on Thứ Năm, 29 tháng 8, 2013


#include <graphics.h>
#include <conio.h>
#define ROUND(a) ((long)(a+0.5))
void plot(int xc, int yc, int x, int y, int color){
      putpixel(xc+x, yc+y, color);
      putpixel(xc-x, yc+y, color);
      putpixel(xc+x, yc-y, color);
      putpixel(xc-x, yc-y, color);
}
void Mid_ellipse(int xc, int yc, int a, int b, int color){
     long x, y, fx, fy, a2, b2, p;
     x = 0;
     y = b;
     a2 = a * a;
     b2 = b * b;
     fx = 0;
     fy = 2 * a2 * y;  
     plot(xc, yc, x,y, color);
     p = ROUND(b2-(a2*b)+(0.25*a));
     while (fx < fy){
         x++;
         fx += 2*b2;
         if (p<0)
              p += b2*(2*x +3);
        else{
              y--;
              p+= b2*(2*x +3) + a2*(-2*y +2);
              fy -= 2*a2;
       }
       plot(xc, yc, x, y, color);
       }
       p = ROUND(b2*(x+0.5)*(x+0.5) + a2*(y-1)*(y-1) - a2*b2);
       while (y>0){
              y--;
              fy -= 2*a2;
              if (p>=0)
              p+=a2*(3 - 2*y);
             else{
                x++;
                fx += 2*b2;
                p += b2*(2*x+2) + a2*(-2*y +3);
            }
        plot(xc, yc, x, y, color);
       }
}
void main(){
       int gr_drive = DETECT, gr_mode;
       initgraph(&gr_drive, &gr_mode, "");
       Mid_Ellipse(getmaxx() / 2, getmaxy() / 2, 150, 80, 4);
       getch();
       closegraph();
}
More about

Các giải thuật sinh đường tròn trong C/C++

Người đăng: culaoxanh88


1. Giải thuật sinh đường tròn Bresenham:
void Bre_circle(int xc, int yc, int Radius, int color) 
     int x, y, p; 
     x = 0; 
     y = Radius; 
     p = 3 - 2 * Radius; 
while (x <= y) 
     putpixel(xc + x, yc + y, color); 
     if (p < 0) 
           p += 4 * x + 6; 
     else 
           p += 4 * (x-y) + 10; 
           y--; 
     } 
     x++;} 
}
2. Giải thuật sinh đường tròn Midpoint :
void Mid_circle(int xc, int yc, int Radius, int color) 
    int x, y, d; 
    x = 0; 
    y = Radius; 
    d = 1- Radius; 
    while (x <= y) 
    putpixel(xc + x, yc + y, color); 
         if (d< 0) 
         d +=2 * x + 3; 
        else 
           d += 2 * (x-y) + 5; 
           y--; 
        } 
       x++; 
       } 
}
More about

Các thuật toán vẽ đoạn thẳng trong C/C++

Người đăng: culaoxanh88 on Thứ Bảy, 17 tháng 8, 2013


1. Thuật toán vẽ đoạn thẳng thông thường: 
void dline(int x1,int y1, int x2,int y2, int color) { 
   float y; 
   int x; 
   for (x=x1; x<=x2; x++) { 
         y = y1 + (x-x1)*(y2-y1)/(x2-x1) ; 
         putpixel(x, Round(y), color ); 
   } 

2. Thuật toán DDA (Digital Differential Analizer):
void ddaline (int x1,int y1,int x2,int y2,int c){ 
   int x=x1; 
   float y=y1; 
   float k=(float)(y2-y1)/(x2-x1); 
   putpixel(x,round(y),c); 
   for(int i=x1;i<=x2;i++) { 
       x++; 
       y=y+k; 
   putpixel(x,round(y),c); 
   } 

3. Thuật toán Bresenham
/*Thuat toan Bresenham ve dthang (0<k<1) */ 
void Bre_line(int x1, int y1, int x2, int y2, int c) 
{int x, y, dx, dy,p,const1,const2; 
     y = y1; 
    dx = x2 - x1; 
    dy = y2 - y1; 
    p = 2*dy - dx; 
    const1 = 2*dy; 
    const2 = 2*(dy-dx); 
    for (x=x1; x<=x2; x++) { 
           putpixel(x, y, c); 
           if (p < 0) 
               p += const1; // p=p + 2dy 
          else { 
               p +=const2; //p=p+2dy-2dx 
               y++; 
   } 

}
4. Thuật toán Trung điểm - Midpoint 
/* Thuat toan Midpoint de ve doan thang  (0<k<1) */ 
void Mid_line(int x1, int y1, int x2, int y2, int c){ 
        int x, y, dx, dy,d; 
        y = y1; 
       dx = x2 - x1; 
       dy = y2 - y1; 
       d= dy - dx/2; 
       for (x=x1; x<=x2; x++){ 
           putpixel(x, y, c); 
           if (d <= 0) 
                d = d + dy; 
          else { 
                y ++; 
               d = d + dy - dx; 
          }} 
}

More about