어떠한 공간에 속도V를 가진 물체가 n초뒤에 어느 좌표에 있을까

신동원·2021년 9월 19일
0

C

목록 보기
4/10
#include <stdio.h>

int func(int len, int pos, int v, int t)
{
int answer = 0;

int Ax = (v * t + pos) % len;
int Bx = (v * t + pos) / len;
int Cx = Bx % 2;

if (Cx == 1)
{
    answer = len - Ax;
}
else
{
    answer = Ax;
}

return answer;
}


int main() {
int ansx, ansy, ansz; //결과값
int x, y, z; //위치값
int fx, fy, fz; //초기위치
int x_speed, y_speed, z_speed; //속도 
int t = 100; //시간

printf("공간 x, y, z축의 크기를 입력하세요\n");
scanf("%d %d %d", &x, &y, &z);

while (1) {
    printf("초기위치 x, y, z의 위치를 입력하세요\n");
    scanf("%d %d %d", &fx, &fy, &fz);
    if ((fx < x) && (fy < y) && (fz < z)) break;
    printf("초기위치가 공간의 범위 밖에 있습니다.\n");
}

printf("공의 x, y, z축의 속도를 입력하세요\n");
scanf("%d %d %d", &x_speed, &y_speed, &z_speed);

printf("몇 초 뒤의 공의 위치를 확인 하실 건가요?\n");
scanf("%d", &t);
   

ansx = func(x, fx, x_speed, t);
ansy = func(y, fy, y_speed, t);
ansz = func(z, fz, z_speed, t);

printf("x : %d, y : %d, z : %d", ansx, ansy, ansz);
return 0;
}

먼저 Z축을 생각안하고 X,Y축 100,100의 공간의 0,0의 위치에서 3,1의 속도를 가지는 물체가 30초 후에 어디에 있을지 생각해 보았다.

그 결과 30초 뒤에는 X축은 90, Y축은 30에 위치하는 걸 유추할 수 있었다.

그리고 60초 뒤에는 x축은 20, Y축은 60에 위치하였다.

이러한 방식으로 여러가지의 시간을 대입해 본 결과 X,Y축은 각각 다른 축에 영향을 미치지 않고 독립적으로 이동한 다는 걸 알 수 있었다.


int Ax = (v t + pos) % len;
int Bx = (v
t + pos) / len;
int Cx = Bx % 2;
Ax에 공의 속도와 시간을 곱하고 그 값에 초기위치를 더해준 값을 공간의 크기를 나눈 나머지 값을 넣어준다.
공간으로 나눈 나머지값은 공이 몇 번 튕겼는지를 무시하고 순수하게 이동한 값을 알 수 있다.

Bx에 공의 속도와 시간을 곱하고 그 값에 초기위치를 더해준 값을 공간의 크기를 나눈 값을 넣어준다.
공간으로 나누게 되면 공이 몇번 튕겼는지를 알 수 있고 Cx에서 홀수인지 짝수인지 판별하여 공이 어느방향으로 이동하는지 알게 해준다.

Cx에 Bx의 값과 2를 나눈 값을 넣어준다.
Cx는 홀수인지 짝수인지 확인하는 변수로 짝수면 공이 초기위치에서 우측으로 이동하는 것이고 홀수면 초기위치에서 한번 벽에 튕겨 다시 왼쪽으로 이동하는 것이다.


if (Cx == 1)
{
answer = len - Ax;
}
else
{
answer = Ax;
}
따라서 Cx가 홀수이면 공이 적어도 한 번이상 벽에 부딪혀 튕겨 나온 것이고 공이 오른쪽에서 왼쪽으로 이동하는 형태가 된다. 따라서 전체공간의 길이에서 Ax값을 빼주면 공의 위치를 알 수 있다.
Cx가 짝수이면 공이 왼쪽에서 오른쪽으로 가는 형태이기 때문에 Ax값 그 자체가 공의 위치이다.


while (1) {
printf("초기위치 x, y, z의 위치를 입력하세요\n");
scanf("%d %d %d", &fx, &fy, &fz);
if ((fx < x) && (fy < y) && (fz < z)) break;
printf("초기위치가 공간의 범위 밖에 있습니다.\n");
}
공의 초기위치는 공간범위를 벗어나는 곳에 위치할 수 없다는 소스이다. 공간범위 밖의 초기위치를 설정하게 되면 다시 초기위치 값을 받는 소스이다.



결과값이다.
공의 위치가 정상적으로 나오는지 확인하기 위해 공간은 전부 10000으로 주었고, 초기위치도 0,0,0 공의속도도 전부 1로 설정하였다. 시간도 10000초로 주니 결과값이 전부 10000,10000,10000으로 정상적으로 나오는 것을 확인할 수 있다.



공간의 범위 밖에 초기위치를 입력하면 안내메세지가 출력되고 다시 초기위치 값을 받는다.



위와 같이 임의의 공간에 임의의 초기위치, 임의의 속도를 가지는 공이 임의의 시간뒤에 어디에 위치할지 나오는 것을 확인 할 수 있다.

profile
오늘보다 내일 더 나은 사람이 되기 위해 노력하자

0개의 댓글