2016-08-09 27 views
2

我是C++的新手,我正在做一個練習題。 我做了什麼:如何用C++中的明星繪製圓圈​​?

for (int i = 0; i < 2 * r; i++) { 
    for (int j = 0; j < 2 * r; j++) { 
     if (i == sqrt((static_cast<int> (r))^2 - j^2)) { 
      cout << "*"; 
     } else { 
      cout << " "; 
     } 
    } 
    cout << endl; 
} 

但是,它沒有吸引我。 :(

+0

您是否嘗試過通過該計劃在調試器步進?你真的在執行這些循環嗎?你可以試着創建一個[Minimal,** Complete **和Verifiable Example](http://stackoverflow.com/help/mcve)並告訴我們嗎? –

+0

什麼是'r'?聲明如何?它的價值是什麼? – LPs

+2

我懷疑sqrt返回一個不完全等於i的浮點值。你使用調試器嗎?如果不是,那麼執行代碼並檢查正在計算的值。 – Tarik

回答

1

enter image description here

下面的代碼是一種簡單的繪製圓的方法,無需使用奇特的函數跳轉到任意選定的x或y位置。

#include <iostream> 
#include <math.h> 

using namespace std; 

int pth (int x,int y) { 
    return sqrt (pow(x,2)+pow(y,2)); 
} 

int main () { 

    int c=0; 
    int r=10; 

    const int width=r; 
    const int length=r*1.5; 

    for (int y=width;y >= -width;y-=2) { 
     for (int x=-length;x <= length;x++) { 

      if ((int) pth(x,y)==r) cout << "*"; 
      else cout << " "; 

     } 
     cout << "\n"; 
    } 
    cin.get(); 

return 0; 
} 

如果你想更先進的代碼,你是在Windows平臺上,你使用Visual Studio來創建程序,然後下面的代碼將intrest的。

它使用SetConsoleCursorPosition()等功能設置xy位置,SetConsoleTextAttribute()設置顏色。該代碼在控制檯文本窗口中繪製線條,像素,矩形和圓圈。

enter image description here

#include<stdio.h> 
#include <iostream> 
#include <stdio.h> 
#include <math.h> 
#include <time.h> 
#include <windows.h> 

using namespace std; 

void gotoxy(int x, int y); 
void setcolor(WORD color); 
void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor); 
void clearscreen(); 
void drawpixel(unsigned char x, unsigned char y, unsigned char Color); 
void drawpixel2(unsigned char x, unsigned char y, unsigned char Color, char character); 
void drawcircle(int x, int y, int a, int b, int color); 
void drawline(int x0, int y0, int x1, int y1, int color); 
void drawfilledrectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol); 
void drawframe(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[]); 
void drawwindow(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,unsigned char bkcol,char text_[]); 
void drawcolorpalette(); 



int main(void){ 

    setcolor(15); 
    clearscreen(); 
    drawwindow(3,2,77,15,31,31,31,"a window is drawn"); 

    int X = 40; 
    int Y = 12; 
    int rad = 8; 
    int col = 15; 
    double deg = 0; 

    // draw a circle using sin() and cos() 
    do { 
     X = (int) (rad * cos(deg)); 
     Y = (int) (rad * sin(deg)); 
     drawpixel2 (40+X, 12+Y, col, '*'); 
     deg += 0.005; 
    } while (deg <= 6.4); 




    drawcircle(60, 10, 8, 8, 15); 

    drawline(1,1,77,22,15); 

    gotoxy(40,4); 
    cout<<"Another circle is drawn."; 


    gotoxy(60,22); 
    cout<<"A Line is drawn."; 

    gotoxy(20,13); 
    cout<<"A circle is drawn."; 



    setcolor(7); 
    gotoxy(1,23); 
    cin.ignore(); 
    cin.get(); 

return 0; 
} 


//***************************************************************************** 

void gotoxy(int x, int y){ 
    COORD coord; 
    coord.X = x; coord.Y = y; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); 
    return; 
} 

//***************************************************************************** 

void setcolor(WORD color){ 
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color); 
    return; 
} 


// 
//  colors: 
//  0 = Black 
//  1 = Blue 
//  2 = Green 
//  3 = Cyan 
//  4 = Red 
//  5 = Magenta 
//  6 = Yellow 
//  7 = LightGray 
//  8 = DarkGray 
//  9 = LightBlue 
//  10 = LightGreen 
//  11 = LightCyan 
//  12 = LightRed 
//  13 = LightMagenta 
//  14 = LightYellow 
//  15 = White 


// 

//***************************************************************************** 

void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor){ 
    int color=16*BackGroundColor+ForeGroundColor; 
    setcolor(color); 
} 

//***************************************************************************** 

void clearscreen(){ 
    COORD coordScreen = { 0, 0 }; 
    DWORD cCharsWritten; 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    DWORD dwConSize; 
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 

    GetConsoleScreenBufferInfo(hConsole, &csbi); 
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y; 
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten); 
    GetConsoleScreenBufferInfo(hConsole, &csbi); 
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten); 
    SetConsoleCursorPosition(hConsole, coordScreen); 
    return; 
} 

//***************************************************************************** 

void drawpixel(unsigned char x, unsigned char y, unsigned char Color){ 
     setcolor(Color); 
     gotoxy(x,y);printf("Û"); 
} 

//***************************************************************************** 

void drawpixel2(unsigned char x, unsigned char y, unsigned char Color, char character){ 
     setcolor(Color); 
     gotoxy(x,y);printf("%c",character); 
} 

//***************************************************************************** 

void drawcircle(int x, int y, int a, int b, int color){ 
    int wx, wy; 
    int thresh; 
    int asq = a * a; 
    int bsq = b * b; 
    int xa, ya; 

    drawpixel(x, y+b, color); 
    drawpixel(x, y-b, color); 

    wx = 0; 
    wy = b; 
    xa = 0; 
    ya = asq * 2 * b; 
    thresh = asq/4 - asq * b; 

    for (;;) { 
     thresh += xa + bsq; 

     if (thresh >= 0) { 
      ya -= asq * 2; 
      thresh -= ya; 
      wy--; 
     } 

     xa += bsq * 2; 
     wx++; 

     if (xa >= ya) 
      break; 


     drawpixel(x+wx, y-wy, color); 
     drawpixel(x-wx, y-wy, color); 
     drawpixel(x+wx, y+wy, color); 
     drawpixel(x-wx, y+wy, color); 
    } 

    drawpixel(x+a, y, color); 
    drawpixel(x-a, y, color); 

    wx = a; 
    wy = 0; 
    xa = bsq * 2 * a; 

    ya = 0; 
    thresh = bsq/4 - bsq * a; 

    for (;;) { 
     thresh += ya + asq; 

     if (thresh >= 0) { 
      xa -= bsq * 2; 
      thresh = thresh - xa; 
      wx--; 
     } 

     ya += asq * 2; 
     wy++; 

     if (ya > xa) 
      break; 

     drawpixel(x+wx, y-wy, color); 
     drawpixel(x-wx, y-wy, color); 
     drawpixel(x+wx, y+wy, color); 
     drawpixel(x-wx, y+wy, color); 
    } 
} 

//***************************************************************************** 

void drawline(int x0, int y0, int x1, int y1, int color){ 
    int pix = color; 
    int dy = y1 - y0; 
    int dx = x1 - x0; 
    int stepx, stepy; 

    if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; } 
    if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; } 
    dy <<= 1;             // dy is now 2*dy 
    dx <<= 1;             // dx is now 2*dx 

    drawpixel(x0, y0,pix); 
    if (dx > dy) { 
     int fraction = dy - (dx >> 1);       // same as 2*dy - dx 
     while (x0 != x1) { 
      if (fraction >= 0) { 
       y0 += stepy; 
       fraction -= dx;        // same as fraction -= 2*dx 
      } 
      x0 += stepx; 
      fraction += dy;         // same as fraction -= 2*dy 
      drawpixel(x0, y0,pix); 
     } 
    } else { 
     int fraction = dx - (dy >> 1); 
     while (y0 != y1) { 
      if (fraction >= 0) { 
       x0 += stepx; 
       fraction -= dy; 
      } 
      y0 += stepy; 
      fraction += dx; 
      drawpixel(x0, y0,pix); 
     } 
    } 
} 

//***************************************************************************** 


void drawframe(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[]) 
{ 
    unsigned i,j,m; 
    { 

     m=(sx-x);      //differential 
     j=m/8;       //adjust 
     j=j-1;       //more adjustment 
     gotoxy(x,y);printf("É");  //Top left corner of box 
     gotoxy(sx,y);printf("»");  //Top right corner of box 
     gotoxy(x,sy);printf("È");  //Bottom left corner of box 
     gotoxy(sx,sy);printf("¼");  //Bottom right corner of box 

     for (i=x+1;i<sx;i++) 
     { 
      gotoxy(i,y);printf("Í");  // Top horizontol line 
      gotoxy(i,sy);printf("Í"); // Bottom Horizontal line 
     } 

     for (i=y+1;i<sy;i++) 
     { 
      gotoxy(x,i);printf("º");  //Left Vertical line 
      gotoxy(sx,i);printf("º"); //Right Vertical Line 
     } 

      gotoxy(x+j,y);printf(text_); //put Title 
      gotoxy(1,24); 
    } 
} 

//***************************************************************************** 

void drawfilledrectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol) 
{ 
    int x,y; 
    setcolor(bkcol);      //Set to color bkcol 

    for (y=y1;y<y2;y++)     //Fill Y Region Loop 
    { 
     for (x=x1;x<x2;x++)    //Fill X region Loop 
     { 
      gotoxy(x,y);printf(" ");  //Draw Solid space 
     } 
    } 
} 

//***************************************************************************** 

void drawwindow(unsigned x,unsigned y,unsigned sx,unsigned sy, 
     unsigned char col, unsigned char col2,unsigned char bkcol,char text_[]) 
{ 
    drawfilledrectangle(x,y,sx,sy,bkcol); 
    drawframe(x,y,sx,sy,col,col2,text_); 
} 

void drawcolorpalette() 
{ 
    for (int i=0;i<16;i++) 
    { 
     for (int j=0;j<16;j++) 
     { 
      setForeGroundAndBackGroundColor(i,j); 
      gotoxy(i*4,j);printf("%d",(i*j)+1); 


     } 

    } 

} 
0

你不能在任意位置與cout畫 - 這是基於線輸出到控制檯(當然你也可以繪製由線環線,如果這就是你想要的)

你可以使用ncurses的。基於控制檯繪圖

如果你希望能夠吸引到「畫布」在任意lications,那麼你可以使用許多圖書館 - 例如SFMLSDLQt和許多

+0

它看起來像練習是在標準輸出上做。 – Tarik

+0

是的。它要求我用std做 –