[英]C Graphics - How to move an object with specific angle
我正在研究 C 圖形程序,我會向最終用戶詢問投影角度,然后使用該角度從地球(圓形)表面發射火箭。
但我不能這樣做。
這是我在谷歌上找到的:
x1 = x + cos(angle) * distance;
y1 = y + sin(angle) * distance;
其中 x1 y1 是 object 的新像素 position。
我試過了,但它似乎不起作用。 另外我希望火箭不斷移動直到屏幕結束,但上面的代碼將直接將 object 從 position A 打印到 position B。
完整程序代碼
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <dos.h>
#include <math.h>
#include <stdlib.h>
#include <iostream.h>
#define cld cleardevice()
int _moonRadius = 20, _earthRadius = 40, _marsRadius = 25;
void mars () {
setfillstyle(9, BROWN);
setcolor(BROWN);
circle(getmaxx() - 25, 50, _marsRadius);
floodfill(getmaxx() - 27, 52, BROWN);
}
void moon () {
setfillstyle(9, WHITE);
setcolor(WHITE);
circle(getmaxx()/2, getmaxy()/2, _moonRadius);
floodfill(getmaxx()/2, getmaxy()/2, WHITE);
// Moon's gravitational area
setfillstyle(SOLID_FILL, DARKGRAY);
setcolor(DARKGRAY);
circle(getmaxx()/2, getmaxy()/2, _moonRadius * 5);
}
void earth () {
setfillstyle(9, GREEN);
setcolor(GREEN);
circle(40, getmaxy() - 100, _earthRadius);
floodfill(42, getmaxy() - 102, GREEN);
}
void rocket (int x, int y) {
setcolor(WHITE);
rectangle(x, y - 105, x + 70, y - 95);
}
void rocket_clear (int x, int y) {
setcolor(BLACK);
rectangle(x, y - 105, x + 70, y - 95);
}
void main () {
clrscr();
int angle, speed;
printf("Please provide input parameters.");
printf("Enter projection angle (range from 5 to 90)\n");
scanf("%d", &angle);
printf("Enter projection speed (range from 10 to 100)\n");
scanf("%d", &speed);
int gd=DETECT, gm, i, j, k;
initgraph(&gd, &gm, "C:\\TURBOC3\\BGI");
// Planets and rocket
mars();
moon();
earth();
rocket(80, 550); // let say initial pixel position x = 80, y = 550
// Moving the rocket
// Right now its only moving towards horizontal line, with speed implementation
// Now here I want to implement the angle of projection
for (i = 81; i < getmaxx() + 100; i++) {
// Also I am not sure about this loop's final range, should it go to getmaxx() or some other range
rocket(i, 550);
rocket_clear(i - 1, 550); // 550 is hard coded right now, so rocket will move only horizontally
delay(500 / speed);
}
getch();
}
需要你們的幫助,請。
(供參考:你也可以從殺手position到某個角度的人position移動子彈)
謝謝:)
請閱讀以//=====
開頭的評論
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <dos.h>
#include <math.h>
#include <stdlib.h>
#include <iostream.h>
#define cld cleardevice()
//===== making these values as constants
static const int _moonRadius = 20, _earthRadius = 40, _marsRadius = 25;
static double projection_angle = 0.0;
void mars () {
setfillstyle(9, BROWN);
setcolor(BROWN);
circle(getmaxx() - _marsRadius, 50, _marsRadius);
floodfill(getmaxx() - 27, 52, BROWN);
}
void moon () {
setfillstyle(9, WHITE);
setcolor(WHITE);
circle(getmaxx()/2, getmaxy()/2, _moonRadius);
floodfill(getmaxx()/2, getmaxy()/2, WHITE);
// Moon's gravitational area
setfillstyle(SOLID_FILL, DARKGRAY);
setcolor(DARKGRAY);
circle(getmaxx()/2, getmaxy()/2, _moonRadius * 5);
}
void earth () {
setfillstyle(9, GREEN);
setcolor(GREEN);
circle(40, getmaxy() - 100, _earthRadius);
floodfill(42, getmaxy() - 102, GREEN);
}
void rocket (int x, int y) {
setcolor(WHITE);
//===== a box of size 10x10
rectangle(x, y, x + 10, y - 10);
}
void rocket_clear (int x, int y) {
setcolor(BLACK);
//===== a box of size 10x10
rectangle(x, y, x + 10, y - 10);
}
void main () {
clrscr();
int angle, speed;
printf("Please provide input parameters.");
printf("Enter projection angle (range from 5 to 90)\n");
scanf("%d", &angle);
//===== angle validation
if (angle < 5 || angle > 90)
{
printf("Please provide angle in range [5, 90]\n");
getch();
return;
}
//===== calculate angle in radians
projection_angle = (angle * 3.14) / 180.0;
printf("projection_angle = %d\n", projection_angle);
printf("Enter projection speed (range from 10 to 100)\n");
scanf("%d", &speed);
//===== speed validation
if (speed < 10 || speed > 100)
{
printf("Please provide speed in range [10, 100]\n");
getch();
return;
}
int gd=DETECT, gm, i, j, k;
initgraph(&gd, &gm, "C:\\TURBOC3\\BGI");
// Planets and rocket
mars();
moon();
earth();
rocket(80, 550); // let say initial pixel position x = 80, y = 550
// Moving the rocket
// Right now its only moving towards horizontal line, with speed implementation
// Now here I want to implement the angle of projection
//===== to store prev position
int prev_i = 0, prev_j = 0;
//===== increments will be constant for a given angle and speed
const int x_inc = cos(projection_angle) * speed;
const int y_inc = sin(projection_angle) * speed;
//===== i and j will be updated with their respective increments
for (i = 90, j = getmaxy() - 100; i < getmaxx() + 100 && j >= -10; i += x_inc, j -= y_inc) {
// Also I am not sure about this loop's final range, should it go to getmaxx() or some other range
//===== clear the previous position
rocket_clear(prev_i, prev_j); // 550 is hard coded right now, so rocket will move only horizontally
//===== draw rocket at current position
rocket(i, j);
//===== make current position as previous position
prev_i = i;
prev_j = j;
//printf("x_inc = %lf, y_inc = %lf\n", cos(projection_angle) * speed, sin(projection_angle) * speed);
delay(500 / speed);
}
getch();
}
注意:您可以用實際的 Pi 替換3.14
。 參考這個。
確保您以弧度傳遞角度。 從度數轉換: radians=degrees*PI/180
(PI 在 math.h 中定義,應該包含在 graphics.h 中)確保你的變量是double
s。
接下來,您可能希望將 X/Y 坐標捆綁在一個結構中,以便您可以從 function 返回新的 position:
typedef struct {
double x;
double y
} coord_t;
coord_t new_pos(double x, double y, double distance, double angle_deg) {
coord_t result;
double angle_rad = angle_deg * PI / 180;
result.x = x + cos(angle_rad) * distance;
result.y = y + sin(angle_rad) * distance;
return result;
}
或者您可以以弧度為單位處理所有角度,這樣 function 就不必進行額外的計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.