C语言绘制水平椭圆的方法及代码错误排查求助
C语言绘制水平椭圆的方法及代码错误排查求助
看起来你是想用C语言在控制台打印出水平椭圆,但目前的代码不仅没写完,还有几个关键问题,我帮你逐个梳理并修正哈~
先说说你代码里的几个明显问题:
- 循环范围完全不对:你现在x和y只循环到29(因为
y<center,center是30),但椭圆中心设的是(30,30),长轴是10(分母100是10的平方)、短轴是5(25是5的平方),这样的循环范围只能覆盖椭圆左上角的一小部分,根本画不出完整的椭圆。 - 用
pow算平方既没必要又有坑:pow是用来算任意幂次的浮点数函数,用它算整数平方不仅效率低,还可能因为浮点数精度误差导致判断出错,直接用(x-center)*(x-center)这种整数乘法香多了。 - 代码不完整+输出格式乱:你的
else分支是空的,没打印空格的话,控制台里的星号会挤成一团,椭圆形状根本看不出来;而且内层循环结束后没换行,每一行的y坐标对应一行输出,必须加换行才能让椭圆是竖直排列的。 - 椭圆边界没画出来:你写的判断条件是
<1,这样椭圆的边界点会被漏掉,改成<=1才能把整个椭圆的轮廓和内部都打印出来。
我给你改好了完整的代码,你可以直接试试:
#include <stdio.h> void ellipse(){ int x, y; int centerx = 30; // 把center改成centerx,变量名更直观 int centery = 30; int a = 10; // 水平方向的长半轴,控制椭圆的宽度 int b = 5; // 垂直方向的短半轴,控制椭圆的高度 // 循环覆盖椭圆所有的y坐标范围(中心±短半轴) for (y = centery - b; y <= centery + b; y++) { // 循环覆盖椭圆所有的x坐标范围(中心±长半轴) for (x = centerx - a; x <= centerx + a; x++) { // 把椭圆公式转成整数运算,完全避免浮点数精度问题 long long term_x = (long long)(x - centerx) * (x - centerx) * b * b; long long term_y = (long long)(y - centery) * (y - centery) * a * a; long long total = (long long)a * a * b * b; // 判断点是否在椭圆内(包括边界) if (term_x + term_y <= total) { printf("*"); } else { printf(" "); } } // 每一行结束必须换行,保证输出是正确的行结构 printf("\n"); } } int main() { ellipse(); return 0; }
简单说下这个修正版的思路:
- 把椭圆的标准公式转换成整数运算,避免浮点数的精度坑——标准公式是
((x-h)²/a²) + ((y-k)²/b²) ≤1,两边同乘a²b²就变成纯整数运算,不会出现精度误差。 - 循环范围精准覆盖椭圆的所有坐标,保证能画出完整的椭圆。
- 用空格填充非椭圆区域,这样在控制台里能清晰看到椭圆的形状。
如果觉得椭圆的位置、大小不合适,直接调整centerx、centery(控制中心位置)或者a、b(控制长、短半轴长度)就行~
内容来源于stack exchange
相关产品推荐
相关产品推荐

