如何修复此控制台旋转动画中的孔

时间:2014-07-12 18:40:36

标签: c math rotation geometry

我在控制台中旋转了一个正方形,但是我得到了一些洞。我怎样才能正确填写?

enter image description here

#include <stdio.h>
#include <Windows.h>
#include <math.h>

void moveTo (int x, int y)
{
    COORD coord = { x, y };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

double round (double number)
{
    return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
}

double deg2rad (double a)
{
    double pi = 3.14159265358979323846;
    return a * pi / 180.0;
}

int main ()
{
    int w = 8;
    int h = 8;
    int cx = 20;
    int cy = 10;

    double a = 0;

    while (1)
    {
        system("cls");

        for (int y = 0; y < h; y++)
        {
            for (int x = 0; x < w; x++)
            {
                double xx = x - 4;
                double yy = y - 4;
                double fx = xx * cos(a) - yy * sin(a);
                double fy = xx * sin(a) + yy * cos(a);

                int ix = cx + round(fx);
                int iy = cy + round(fy);

                moveTo(ix, iy);
                printf("X");
            }
        }

        a += deg2rad(15.0);
        Sleep(100);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

  

不是真正的答案

显然,您的代码将始终在屏幕上打印相同数量的X,即使情况可能并非如此。

我认为你不应该重新计算每个预定义X的位置,而是计算方形周围线条的几何形状,并用X s填充空间,直到需要为止。它撞到了对面的边界或什么的。

另一种解决方案可能是将广场的“密度”加倍:

int w = 8*2;
int h = 8*2;
int cx = 20*2;
int cy = 10*2;
...
moveTo(ix/2, iy/2);

这应该会打印一些点,但也应填补空白。