Как нарисовать круг с sin и cos в C? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть проблема сделать некоторую круговую орбиту (стимуляция солнечной системы) в C.

На самом деле, я делал это около дня. но я не могу понять.

Во-первых, как изменить скорость движения планет? Некоторые друзья сказали мне, что я могу использовать «Если» для настройки скорости, но я не смог ....

Во-вторых, настройка местоположения. Я рисую круг эллипсом, но не знаю, как сделать орбиту. моя околоземная орбита выходит из строя ... я сделал несколько кодов.

#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;
    }
}

enter image description here

1 Ответ

1 голос
/ 08 мая 2020

Ваш код неорганизован. Например, вы свободно смешиваете такие переменные, как earth_size, и зашитые числа, например 16. Это рецепт катастрофы. Пожалуйста, постарайтесь быть более систематизированным c.

Трудно не составить в ответ список ошибок dry

Положение (px, py) на круге с центром (cx, cy) и радиус r равен:

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

Как работает функция Ellipse в GDI, ваша команда рисования должна выглядеть так :

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: вы должны сохранить возвращаемое значение в переменной и выбрать его обратно в D C после того, как вы закончите. Если вы этого не сделаете, у вас будет утечка объектов GDI. Вы можете увидеть, сколько объектов GDI использует ваше приложение, в диспетчере задач. Если это число постоянно растет, у вас утечка предметов. В конце концов, ваше приложение будет вести себя странно.

...