벡터 계산기 만들기
2) 벡터 계산기 만들기 - 계산 기능 구현
잡동사니123
2023. 6. 19. 01:20
준비해야할것
- Vector2, Vector3 클래스 준비 멤버변수 벡터2는 x,y 벡터3은x,y,z 준비 (함수 설명은 벡터2 기준으로 함)
Length
public double Length()
{
return Math.Sqrt(x * x + y * y);
}
- 벡터의 길이를 구하는 함수
LengthSq
public double LengthSq()
{
return (x * x + y * y);
}
- 벡터 길이에 제곱 한 값
Normalize
public Vector2 Normalize()
{
double len = Length();
if(len>double.Epsilon)
{
x /= len;
y /= len;
}
return this;
}
- 벡터 정규화
- 길이를 구함 -> 길이가 double.Epsilon보다 큰지 구함-> 각 요소들을 길이로 나눔
Perp
public Vector2 Perp()
{
return new Vector2(-y, x);
}
- 수직 벡터를 구할 수 있는 함수
Truncate
public Vector2 Truncate(double max)
{
Vector2 result = this;
if (Length() > max)
{
Normalize();
result *= max;
}
return result;
}
- 최대값을 벡터의 길이로 제한함
- 벡터의 길이가 최대값보다 크다면 -> 정규화 -> 최대값을 곱하여 길이를 최대값으로 제한
GetReverse
public Vector2 GetReverse()
{
return new Vector2(-x,-y);
}
- 반대방향벡터를 구함
Dot
public double Dot(Vector2 v2)
{
return (x + v2.x + y * v2.y);
}
- 내적을 구함
- 각각의 x와 y값을 곱한뒤 다 더함
Sign
public int Sign(Vector2 v2)
{
if (y * v2.x > x * v2.y)
{
return -1;
}
else
{
return 1;
}
}
- 다른벡터 기준으로 시계방향인지 반시계방향인지 구함
- 시계방향은 1 반시계방향을 -1로 표현
Distance
public double Distance(Vector2 v2)
{
double ySeparation = v2.y - y;
double xSeparation = v2.x - x;
return Math.Sqrt(ySeparation * ySeparation + xSeparation * xSeparation);
}
- 벡터간의 거리를 계산함
DistanceSq
public double DistanceSq(Vector2 v2)
{
double ySeparation = v2.y - y;
double xSeparation = v2.x - x;
return (ySeparation * ySeparation + xSeparation * xSeparation);
}
- 벡터간의 거리를 계산한후 거리를 제곱한 값을 구함
Reflect
public Vector2 Reflect(Vector2 v2)
{
Vector2 result = this;
result += 2.0 * Dot(v2) * v2.GetReverse();
return result;
}
- 정규화된 벡터를 반사시킴(벽에 튕겨나오는 공의 경로 계산 등에 쓰임)
+
public static Vector2 operator +(Vector2 v1, Vector2 v2)
{
double x = v1.x + v2.x;
double y = v1.y + v2.y;
return new Vector2(x, y);
}
- 두 벡터의 요소들끼리 더함
-
public static Vector2 operator -(Vector2 v1, Vector2 v2)
{
double x = v1.x - v2.x;
double y = v1.y - v2.y;
return new Vector2(x, y);
}
- 두 벡터의 요소들끼리 뺀다
*
public static Vector2 operator *(Vector2 v1, double n1)
{
double x = v1.x * n1;
double y = v1.y * n1;
return new Vector2(x, y);
}
public static Vector2 operator *(double n1, Vector2 v1)
{
double x = v1.x * n1;
double y = v1.y * n1;
return new Vector2(x, y);
}
- 벡터의 요소에 입력받은 숫자들을 곱함
/
public static Vector2 operator /(Vector2 v1, double n1)
{
double x = v1.x / n1;
double y = v1.y / n1;
return new Vector2(x, y);
}
public static Vector2 operator /(double n1, Vector2 v1)
{
double x = v1.x / n1;
double y = v1.y / n1;
return new Vector2(x, y);
}
- 벡터의 요소에 입력받은 숫자를 나눔
==
public static bool operator ==(Vector2 v1, Vector2 v2)
{
return (v1.x == v2.x) && (v1.y == v2.y);
}
- 벡터값이 서로 같은지 비교하여 x,y 둘다 같으면 true 하나라도 틀리면 false 반환
!=
public static bool operator !=(Vector2 v1, Vector2 v2)
{
return !(v1==v2);
}
- 두 벡터가 다른지 비교