如何在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 对象。如果该数字不断增长,则表明您正在泄漏对象。最终,您的应用程序会出现异常行为。
关于在 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 对象。如果该数字不断增长,则表明您正在泄漏对象。最终,您的应用程序会出现异常行为。