게임을 만들다 보면, 특히 물리 관련된 기능을 구현하기 위해서, 다각형의 무게중심을 알아야 하는 경우가 생기기 마련이다.
나 같은 경우, 강체역학을 그대로 전부 적용하기 보다는 얼추 비슷하게? 구현하고 있다. 강체역학을 그대로 전부 적용하면 코드도 복잡하고, 성능상에도 좋지 않다고 판단해서이다. 물론 그렇게 해도 되는 게임이기에 가능한 얘기다.
다각형의 무게 중심을 구하기 위해서는 우선 다각형의 넓이를 알아야 한다. 아래는 다각형 넓이 공식이다.
이 넓이를 이용해 아래와 같이 무게 중심을 구할 수 있다.
이 공식을 바탕으로 코드를 작성 해 보자. 우선 다각형을 정의한 클래스부터 살펴보자.
public class jdPolygon
{
public List<jdVector2> m_points = new List<jdVector2>();
public jdVector2 m_center = new jdVector2();
public jdPolygon()
{
}
public jdVector2 Center
{
get{
return m_center;
}
set{
m_center = value;
}
}
public List<jdVector2> Points
{
get{
return m_points;
}
}
....
}
jdVector2는 그냥 x,y값을 가지고 있는 좌표 클래스이다.
m_points(Points)에서 다각형을 이루는 좌표를 리스트로 저장하고 있다.
m_center(Center)는 다각형의 무게중심을 저장한다.
위 수학 공식을 이용해 무게중심을 구해보자.
public void CalculateCenter()
{
Center = jdVector2.ZERO;
float area = 0;
int i, next_i;
jdVector2 first_point;
jdVector2 second_point;
float factor = 0;
for (i = 0; i < Points.Count; i++)
{
next_i = (i + 1) % Points.Count;
first_point = Points[i];
second_point = Points[next_i];
factor = ((first_point.x * second_point.y) - (second_point.x * first_point.y));
area += factor;
Center += new jdVector2((first_point.x + second_point.x) * factor,
(first_point.y + second_point.y) * factor);
}
area /= 2.0f;
area *= 6.0f;
factor = (1.0f / area);
Center = new jdVector2(Center.x * factor, Center.y * factor);
}
CalculateCenter는 말 그대로 위의 정점 리스트를 이용해 무게중심을 구하는 함수이다.
'게임을 만들자 > 게임 서버(C#)' 카테고리의 다른 글
c# 각도, 라디안, 벡터 간 변환 (0) | 2020.10.24 |
---|---|
c#, 점 - 선분 간의 거리 구하기 (0) | 2020.10.13 |
c# ibatis Mapper에서 <,>,<=,>= 비교연산자 사용 (0) | 2020.04.08 |
c# 다각형 충돌체크 (0) | 2020.02.21 |
Mysql, Select결과를 Update 문에 반영하기 (1) | 2020.02.05 |