gpt4 book ai didi

c++ - 使用标准笛卡尔圆公式在图形模式下绘制圆(C++)

转载 作者:太空狗 更新时间:2023-10-29 20:22:00 25 4
gpt4 key购买 nike

我想在 C++ 中使用 graphics.h 绘制一个圆,而不是直接使用 circle() 函数。我要绘制的圆使用较小的圆作为点,即较小的圆将构成较大圆的圆周。所以我想,如果我做这样的事情,它会起作用:

    {
int radius = 4;


// Points at which smaller circles would be drawn
int x, y;


int maxx = getmaxx();
int maxy = getmaxy();

// Co-ordinates of center of the larger circle (centre of the screen)
int h = maxx/2;
int k = maxy/2;

//Cartesian cirle formula >> (X-h)^2 + (Y-k)^2 = radius^2

//Effectively, this nested loop goes through every single coordinate on the screen

int gmode = DETECT;
int gdriver;

initgraph(&gmode, &gdriver, "");

for(x = 0; x<maxx; x++)
{
for(y = 0; y<maxy; y++)
{
if((((x-h)*(x-h)) + ((y-k)*(y-k))) == (radius*radius))
{
circle(x, y, 5) //Draw smaller circle with radius 5
} //at points which satisfy circle equation only!
}
}
getch();
}

这是我在 Turbo C++ 上使用 graphics.h 的时候,因为这是我们在学校学习的编译器。

我知道它很古老。

因此,理论上,由于嵌套的 for 循环会检查屏幕上的所有点,并在每个满足圆方程的点处绘制一个小圆,我想我会得到一个输入的半径大的圆,其周长由我在 for 循环中制作的较小圆圈组成。

但是,当我尝试这个程序时,我得到了四个双曲线(都指向屏幕中心),当我增加半径时,尖锐度(找不到更好的词)双曲线增加,直到最后,当半径为 256 或更大时,顶部和底部的两条双曲线相交,在我的屏幕上形成一个大十字,就像:“就是这样,用户,我放弃了!”

我发现值 256 是因为我注意到半径是 4 的倍数,这些数字看起来……更好?

我四处寻找解决方案很长一段时间,但找不到任何答案,所以我来了。

有什么建议吗???

编辑 >> 这是我得到的输出的粗略图表...

This is the rough output

最佳答案

您的代码中有两个问题:

首先:你真的应该在调用 getmaxxgetmaxy 之前调用 initgraph ,否则它们不一定会返回图形模式的正确尺寸。这可能是也可能不是影响因素,具体取决于您的设置。

其次,也是最重要的:在 Turbo C++ 中,int 是 16 位的。例如,这是一个半径为 100 的圆(在之前的 initgraph 顺序问题是固定):

enter image description here

注意四个角中的杂散圆圈。如果我们进行一些调试并添加一些打印输出(一个有用的策略,您应该存档以备将来引用):

if((((x-h)*(x-h)) + ((y-k)*(y-k))) == (radius*radius))
{
printf(": (%d-%d)^2 + (%d-%d)^2 = %d^2\n", x, h, y, k, radius);
circle(x, y, 5); //Draw smaller circle with radius
} //at points which satisfy circle equation only!

您可以看到发生了什么(第一行是 maxx 和 maxy,上面的代码片段中没有显示):

enter image description here

特别是 (63, 139) 处的圆是其中一个角。如果你计算一下,你会发现:

(63 - 319)2 + (139 - 239)2 = 75536

并且由于您的整数是 16 位的,所以 75536 模 65536 = 10000 = 最终计算的值 = 1002 = 一个不应该出现的圆圈。

一个简单的解决方案是将相关变量更改为long:

  • 最大,最大
  • x,y
  • h, k

所以:

long x, y;
...
initgraph(...);
...
long maxx = getmaxx();
long maxy = getmaxy();
...
long h = maxx / 2;
long k = maxy / 2;

然后你会得到正确的输出:

enter image description here

当然要注意like other answers point out ,因为你使用的是整数,你会错过很多点。这可能会或可能不会,但某些值会产生明显较差的结果(例如,半径 256 似乎只有 4 个整数解)。如果你愿意,你可以引入一个公差。您也可以使用 a more direct approach但这可能会破坏您使用笛卡尔圆公式进行练习的目的。如果您对这类事情感兴趣,这里有一份 24 页的文档,其中包含关于 integers that are the sum of two squares 的一系列讨论、证明和属性。 .

我对 Turbo C++ 的了解还不够,不知道您是否可以使用 32 位整数,我将把它作为练习留给您。

关于c++ - 使用标准笛卡尔圆公式在图形模式下绘制圆(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39970967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com