如何仅使用 characters/symbols 在 c 中打印出一个空心圆
How to print out a hollow circle in c using just characters/symbols
给定用户的圆半径,程序应使用等式 (x^2+y^2=r^2) 打印出圆。
它有效,但我没有得到任何东西:
- 为什么圆的点数这么少,有没有办法让点数多一些?
- 为什么它看起来更像 ellipse/oval?
代码:
#include <stdio.h>
#include <stdlib.h>
void display(int r){
int x,y;
// x and y representing coordinates on an imaginary cartisian plane
for(x=-r;x<=r;x++)
{
printf("\t\t\t");//some tabs to make it kinda "centered"
for(y=-r;y<=r;y++)
{
/*if the coordinate:(x,y) is a point of the equation x^2+y^2=r^2 prints the char:*, if
not leaves that space empty*/
if( x*x+y*y == r*r)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
int main(){
int r;
printf("Enter radius:");
scanf("%d",&r);
display(r);
return 0;
}
为什么圆的点数这么少,有没有办法让点数多一些?
原因是您无法表示小数部分,您在终端中处理整数和字符。您可以将 r 乘以 4(小心溢出)并减小终端的 fontSize 以实现此结果。
为什么它看起来更像 ellipse/oval?
终端中的字符高度大于宽度。原因是能够舒适地阅读它们,也可能与 16/9 分辨率有关。
您可以通过调整方程式再次获得所需的输出...但此时您可能只想使用图形库!除非你掌握一些 ASCII 艺术...
_____ // I used 4 dash horizontally and 3 vertically.
_ _
_____
首先,默认情况下字符的纵横比为 1:2,因此为避免出现椭圆形,您必须每点打印 2 个字符。
而且为了填补点之间的空隙,你必须对这些空隙进行插值
这是一个简单的解决方案:
#include <stdio.h>
#include <stdlib.h>
void display(int r)
{
int x, y;
// x and y representing coordinates on an imaginary cartisian plane
for (x = -r; x <= r; x++)
{
printf("\t\t\t"); //some tabs to make it kinda "centered"
for (y = -r; y <= r; y++)
{
if (abs(x * x + y * y - r * r) < r - 1)
printf("**");
else
printf("--");
}
printf("\n");
}
for (x = -r; x <= r; x++)
{
printf("\t\t\t"); //some tabs to make it kinda "centered"
for (y = -r; y <= r; y++)
{
printf("%s%d", (abs(x * x + y * y - r * r) > 10 ? " " : " "), abs(x * x + y * y - r * r));
}
printf("\n");
}
}
int main()
{
int r;
printf("Enter radius:");
scanf("%d", &r);
display(r);
return 0;
}
Enter radius:6
**********
** **
** **
** **
** **
** **
** **
** **
** **
** **
** **
** **
**********
条件x*x + y*y == r*r
只有在x
、y
和r
描述直角三角形的边长时才满足。对于整数,只有“毕达哥拉斯三元组”如 3,4,5 和 5,12,13 等满足该条件。
允许 x*x + y*y
落在以 r*r
为中心的范围内可以绘制更多的点,例如,在 (r-½)² 之间和 (r+½)².
因为 (r-½)² = r²-r+¼,和 (r+½)² = r²+r+¼, 我们可以忽略 ¼为简单起见,使用范围 r*r-r
到 r*r+r
.
#include <stdio.h>
#include <stdlib.h>
void display(int r){
int x,y;
int xsq, ysq;
int rsq = r*r;
// x and y representing coordinates on an imaginary cartisian plane
for(x=-r;x<=r;x++)
{
xsq = x*x;
printf("\t\t\t");//some tabs to make it kinda "centered"
for(y=-r;y<=r;y++)
{
/*if the coordinate:(x,y) is a point of the equation x^2+y^2=r^2 prints the char:*, if
not leaves that space empty*/
int ysq = y*y;
int dsq = xsq + ysq;
if( dsq > rsq - r && dsq < rsq + r)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
int main(){
int r;
printf("Enter radius:");
scanf("%d",&r);
display(r);
return 0;
}
Input/output:
$ circle
Enter radius:10
*******
** **
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
** **
*******
考虑到 (r-½)² 和 (r+½)² 的扩展中被忽略的 ¼,条件可以从 dsq > rsq - r && dsq < rsq + r
更改为 dsq > rsq - r && dsq <= rsq + r
。这将稍微改变一些半径的输出。
- 圆圈看起来被拉长了,因为字体使用了非正方形的矩形网格。
给定用户的圆半径,程序应使用等式 (x^2+y^2=r^2) 打印出圆。
它有效,但我没有得到任何东西:
- 为什么圆的点数这么少,有没有办法让点数多一些?
- 为什么它看起来更像 ellipse/oval?
代码:
#include <stdio.h>
#include <stdlib.h>
void display(int r){
int x,y;
// x and y representing coordinates on an imaginary cartisian plane
for(x=-r;x<=r;x++)
{
printf("\t\t\t");//some tabs to make it kinda "centered"
for(y=-r;y<=r;y++)
{
/*if the coordinate:(x,y) is a point of the equation x^2+y^2=r^2 prints the char:*, if
not leaves that space empty*/
if( x*x+y*y == r*r)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
int main(){
int r;
printf("Enter radius:");
scanf("%d",&r);
display(r);
return 0;
}
为什么圆的点数这么少,有没有办法让点数多一些?
原因是您无法表示小数部分,您在终端中处理整数和字符。您可以将 r 乘以 4(小心溢出)并减小终端的 fontSize 以实现此结果。
为什么它看起来更像 ellipse/oval?
终端中的字符高度大于宽度。原因是能够舒适地阅读它们,也可能与 16/9 分辨率有关。
您可以通过调整方程式再次获得所需的输出...但此时您可能只想使用图形库!除非你掌握一些 ASCII 艺术...
_____ // I used 4 dash horizontally and 3 vertically.
_ _
_____
首先,默认情况下字符的纵横比为 1:2,因此为避免出现椭圆形,您必须每点打印 2 个字符。
而且为了填补点之间的空隙,你必须对这些空隙进行插值 这是一个简单的解决方案:
#include <stdio.h>
#include <stdlib.h>
void display(int r)
{
int x, y;
// x and y representing coordinates on an imaginary cartisian plane
for (x = -r; x <= r; x++)
{
printf("\t\t\t"); //some tabs to make it kinda "centered"
for (y = -r; y <= r; y++)
{
if (abs(x * x + y * y - r * r) < r - 1)
printf("**");
else
printf("--");
}
printf("\n");
}
for (x = -r; x <= r; x++)
{
printf("\t\t\t"); //some tabs to make it kinda "centered"
for (y = -r; y <= r; y++)
{
printf("%s%d", (abs(x * x + y * y - r * r) > 10 ? " " : " "), abs(x * x + y * y - r * r));
}
printf("\n");
}
}
int main()
{
int r;
printf("Enter radius:");
scanf("%d", &r);
display(r);
return 0;
}
Enter radius:6
**********
** **
** **
** **
** **
** **
** **
** **
** **
** **
** **
** **
**********
条件
x*x + y*y == r*r
只有在x
、y
和r
描述直角三角形的边长时才满足。对于整数,只有“毕达哥拉斯三元组”如 3,4,5 和 5,12,13 等满足该条件。允许
x*x + y*y
落在以r*r
为中心的范围内可以绘制更多的点,例如,在 (r-½)² 之间和 (r+½)².因为 (r-½)² = r²-r+¼,和 (r+½)² = r²+r+¼, 我们可以忽略 ¼为简单起见,使用范围
r*r-r
到r*r+r
.
#include <stdio.h>
#include <stdlib.h>
void display(int r){
int x,y;
int xsq, ysq;
int rsq = r*r;
// x and y representing coordinates on an imaginary cartisian plane
for(x=-r;x<=r;x++)
{
xsq = x*x;
printf("\t\t\t");//some tabs to make it kinda "centered"
for(y=-r;y<=r;y++)
{
/*if the coordinate:(x,y) is a point of the equation x^2+y^2=r^2 prints the char:*, if
not leaves that space empty*/
int ysq = y*y;
int dsq = xsq + ysq;
if( dsq > rsq - r && dsq < rsq + r)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
int main(){
int r;
printf("Enter radius:");
scanf("%d",&r);
display(r);
return 0;
}
Input/output:
$ circle
Enter radius:10
*******
** **
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
** **
*******
考虑到 (r-½)² 和 (r+½)² 的扩展中被忽略的 ¼,条件可以从 dsq > rsq - r && dsq < rsq + r
更改为 dsq > rsq - r && dsq <= rsq + r
。这将稍微改变一些半径的输出。
- 圆圈看起来被拉长了,因为字体使用了非正方形的矩形网格。