직각삼각형은 한 각이 90°인 삼각형이다.
이 삼각형에서 특정 각도 를 기준으로 세 변을 다음과 같이 부른다.
삼각비는 이 세 변의 길이 비율로 정의된다.
아래 조건을 가정해 캐릭터를 움직이는 간단한 예제를 살펴봅니다.
| 변수 | 값 | 설명 |
|---|---|---|
| 초기 위치 | (0.0, 0.0) | 시작점 |
| 이동 각도 | 30도 | 오른쪽을 0도로 했을 때의 방향 |
| 이동 속도 | 200.0 | 초당 200 유닛 이동 |
| 총 이동 시간 | 1.0초 | 1초 동안 이동 |
| 프레임 속도(FPS) | 60 FPS | |
| 이동 반복 횟수 | 60회 | 매 프레임마다 이동(총 60프레임) |
#include <iostream>
#include <cmath>
#define PI 3.14159265358979323846
struct Vector2 {
float x, y;
void Print() const {
std::cout << "Position: (" << x << ", " << y << ")\n";
}
};
// 삼각함수를 이용한 이동 함수
Vector2 MoveCharacter(Vector2 position, float angleDegrees, float speed, float deltaTime) {
float angleRadians = angleDegrees * (PI / 180.0f); // 도 -> 라디안 변환
float dx = cos(angleRadians) * speed * deltaTime;
float dy = sin(angleRadians) * speed * deltaTime;
return { position.x + dx, position.y + dy };
}
int main() {
Vector2 playerPosition = { 0.0f, 0.0f };
float playerAngle = 30.0f;
float playerSpeed = 200.0f;
float deltaTime = 1.0f / 60.0f;
for (int i = 0; i < 60; ++i) {
playerPosition = MoveCharacter(playerPosition, playerAngle, playerSpeed, deltaTime);
playerPosition.Print();
}
return 0;
}
cos, sin 함수를 사용해 한 프레임마다 이동량(, )을 구한다.#include <iostream>
#include <cmath>
using namespace std;
// 플레이어가 안전 구역 안에 있는지 확인
bool isInSafeZone(double player_x, double player_y,
double zone_center_x, double zone_center_y,
double safe_radius) {
double dx = player_x - zone_center_x;
double dy = player_y - zone_center_y;
double r = sqrt(dx*dx + dy*dy);
return (r <= safe_radius);
}
int main() {
double zone_x = 50, zone_y = 50, safe_radius = 30;
double player1_x = 60, player1_y = 60; // 안전 구역 근처
double player2_x = 90, player2_y = 90; // 훨씬 멀리 있음
cout << (isInSafeZone(player1_x, player1_y, zone_x, zone_y, safe_radius)
? "Player 1 Safe\n" : "Player 1 Not Safe\n");
cout << (isInSafeZone(player2_x, player2_y, zone_x, zone_y, safe_radius)
? "Player 2 Safe\n" : "Player 2 Not Safe\n");
return 0;
}
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
struct Bullet {
double x, y;
};
// 총알 위치를 극좌표계를 이용해 계산
vector<Bullet> generateBullets(int n, double radius) {
vector<Bullet> bullets;
for (int i = 0; i < n; i++) {
double theta_deg = (360.0 / n) * i;
double theta_rad = theta_deg * M_PI / 180.0;
double x = radius * cos(theta_rad);
double y = radius * sin(theta_rad);
bullets.push_back({x, y});
}
return bullets;
}
int main() {
int bullet_count = 8;
double radius = 10.0;
vector<Bullet> bullets = generateBullets(bullet_count, radius);
for (int i = 0; i < bullets.size(); i++) {
cout << "Bullet " << i + 1
<< ": (" << bullets[i].x << ", "
<< bullets[i].y << ")\n";
}
return 0;
}