如何在C中用sin和cos画圆?

How to draw circle with sin and cos in C?

关于在 C 中制作一些圆形轨道(太阳系刺激)我遇到了问题

实际上,我做了大约一天。但我想不通。

一、如何改变行星的运动速度? 有朋友告诉我可以用"If"进行速度编排,但是我失败了....

二、位置设置。我用椭圆画了一些圆,但我不知道如何制作轨道。 我的地球轨道出错了……我做了一些代码。

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

#define solar_size 30
#define earth_size 16
#define PI 3.141592654
#define MOVE_SPEED 3
#define rad angle*180/PI

int angle;
double sun_x,sun_y,earth_x,earth_y;
double x,y;
int dx;
int dy;
int i;

int main(void) {

    HWND hwnd = GetForegroundWindow();
    HDC hdc = GetWindowDC(hwnd);

    SelectObject(hdc, CreateSolidBrush(RGB(0, 0, 0)));
    Rectangle(hdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));

    TextOut(hdc, 250, 450, L"solar system Simulation", 23); 

    while (1) {

        sun_x = 250;
        sun_y = 250;

        earth_x = sun_x + 40;
        earth_y = sun_y + 40;

        SelectObject(hdc, CreatePen(PS_SOLID, 3, RGB(255, 0, 0)));
        SelectObject(hdc, CreateSolidBrush(RGB(255, 0, 0)));
        Ellipse(hdc, sun_x, sun_y, sun_x + solar_size, sun_y + solar_size);

        for (angle = 0; angle <= 360; angle++) {

            SelectObject(hdc, CreatePen(PS_SOLID, 3, RGB(0, 0, 220)));
            SelectObject(hdc, CreateSolidBrush(RGB(0, 0, 220)));
            Ellipse(hdc, earth_x, earth_y, earth_x + earth_size, earth_y + earth_size);

            Sleep(50);

            SelectObject(hdc, CreatePen(PS_SOLID, 3, RGB(0, 0, 0)));
            SelectObject(hdc, CreateSolidBrush(RGB(0, 0, 0)));
            Ellipse(hdc, earth_x + 30, earth_y + 30, earth_x + earth_size, earth_y  + earth_size);

            earth_x = 40 * cos(rad)+40;
            earth_y = 40 * sin(rad)+40;

                    }
        continue;
    }
}

您的代码没有组织。例如,您可以自由混合 earth_size 等变量和 16 等固定数字。那是灾难的根源。请尽量系统化。

很难不把答案列成一大堆错误。

圆心(cx, cy)、半径r的圆上的位置(px, py)为:

px = cx + r * cos(angle)
py = cy + r * sin(angle)

因此,你的初始化是错误的:

earth_x = sun_x + 40;
earth_y = sun_y + 40;      // should be just sun_y

GDI 中 Ellipse 函数的工作方式,您的绘图命令应如下所示:

Ellipse(hdc, earth_x - earth_size / 2, earth_y - earth_size / 2,
             earth_x + earth_size / 2, earth_y + earth_size / 2);

也许将天体的数据(位置、大小、颜色)收集到一个结构体中并为它编写一个只写 DrawBody(hdc, earth) 的绘图函数很有用,这样你就没有重复(即复制和粘贴)绘图代码。

至于你的速度:一个可能的错误来源在这里:

#define rad angle*180/PI

这是错误的方式。

最后,了解 SelectObject 的工作原理:您应该将 return 值保存在一个变量中,并在完成后 select 将其返回到 DC。如果不这样做,就会泄漏 GDI 对象。您可以在任务管理器中查看您的应用程序使用了多少 GDI 对象。如果该数字不断增长,则表明您正在泄漏对象。最终,您的应用程序会出现异常行为。