벡터 계산기 만들기

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);
}
  • 두 벡터가 다른지 비교