Point와 Vector 객체가 필요합니까? 아니면 Vector 객체를 사용하여 Point를 나타내는 것이 좋습니다?


18

친구와 함께 개발하고있는 엔진의 구성 요소 (학습 목적)를 구성하면서이 의심에 도달했습니다.

처음에는 다음과 같이 Point 생성자가있었습니다.

var Point = function( x, y ) {
    this.x = x;
    this.y = y;
};

그러나 우리는 벡터 수학을 추가하기 시작했고 이름을 Vector2d로 바꾸기로 결정했습니다.

그러나 현재 일부 방법은 다음과 같이 약간 혼란 스럽습니다 (적어도 내 생각에는).

//before the renaming of Point to Vector2, the parameters were startingPoint and endingPoint
Geometry.Line = function( startingVector, endingVector ) {
    //...
};

Point 객체에 대해 특정 생성자를 만들어야합니까, 아니면 점을 벡터로 정의하는 데 문제가 없습니까?

나는 벡터가 크기와 방향을 가지고 있다는 것을 알고 있지만 많은 사람들이 벡터를 사용하여 객체의 위치를 ​​나타내는 것을 볼 수 있습니다.


1
위치는 (0,0 {, 0})의 벡터이므로 벡터를 사용하는 것이 좋습니다.

답변:


8

정의를 병합하고 점을 벡터로 처리하는 데 문제가있을 가능성은 거의 없지만 일부 API에는 (예 : 다각형의 꼭짓점을 나타내는 등) 사용해야하는 'Point'클래스가 있으므로 약간주의해야합니다. 당신은 자신의 클래스를 앞뒤로 이식 할 수 있기를 원할 것입니다.

그러나 내가 일은 코드에서 동등하게 취급하는 것입니다. 벡터와 포인트를 상호 교환하여 사용하는 경우 Line () 함수 선언이 'startingVector'및 'endingVector'에 대해 이야기해야 할 이유가 없습니다. 다시 돌아가는 것이 좋습니다.

Geometry.Line = function( Vector startingPoint, Vector endingPoint ) {
    //...
};

점은 Vector 클래스를 사용하여 이러한 매개 변수가 나타내는 것입니다.


한 단계 더 나아가 typedef Vector Point포인트를 정의하는 헤더 어딘가에 있습니다. 그렇게 보이는 것처럼 느껴지고 Point, 왜 그것을 호출 할 때 머리를 긁지 않고 아무도 왜 전화를 받았는지 Vector내부 측면에서는 단 하나의 코드베이스입니다.
tpg2114

4

Vector 객체 만 사용하십시오. 이것이 과거에 잘못 사용되었다고 생각 되더라도 사람들이 기대하는 것입니다. 또한 벡터를 점으로 사용하는 것이 반드시 틀린 것은 아닙니다. 두 데이터 구조 모두 동일한 프리미티브 유형을 필요로하기 때문에 논의 외부에서 수행하기 어려울 것입니다. 유일한 차이점은 멤버 함수이며, 두 클래스 사이에 충돌하는 방법이 많지 않기 때문에 같은 클래스에 넣는 것이 쉽습니다.

배우기 때문에 사람들이 기대하는 것을하는 것이 종종 일을하는 가장 좋은 방법이라는 것을 배우는 것이 좋습니다 (제공되는 것과 같은 사소한 선택).


멤버 함수 만이 점과 벡터의 유일한 차이점은 아닙니다. 그래서입니다 w중요한 요소.
kevintodisco

3

점은 공간의 위치입니다. 좌표계가 있으면 해당 점을 원점과의 거리 및 방향 (벡터)으로 설명 할 수 있습니다. 따라서 벡터를 사용하여 선의 시작점과 끝점을 설명하는 것이 합리적입니다.

모든 점을 벡터로 표현할 수 있지만 벡터는 점이 아닙니다. 속도, 법선 등과 같은 대부분의 벡터는 위치 감각이 없습니다.

바람을 생각하면 방향과 힘에 대해 이야기 할 수 있지만 위치 나 위치에 대해서는 이야기 할 수 없습니다. 이것은 공간의 점을 설명하는 데 사용되지 않는 벡터를 생각하는 방법입니다.


2

점을 정의하려면 벡터가 하나만 필요합니다. 선을 정의하려면 두 개가 필요합니다. 일반적으로 선에있는 두 개의 점 또는 선에있는 점을 나타내는 하나의 벡터와 선의 방향을 나타내는 다른 벡터가 있습니다.

점은 벡터가 좌표와 같은 방향이고 크기가 0,0의 거리와 같은 벡터이기 때문에 점을 벡터로 정의하는 데 아무런 문제가 없습니다.

따라서 Point는 "Vector2d"를 나타내는 두 개의 별도 클래스가 필요하지 않습니다. Point는 아마도 드로잉 또는 처리와 직접 관련된 다른 멤버 함수를 가진 Vector2d의 하위 클래스 일 수 있지만 Vector2d는 다음과 같은 엄격한 벡터 수학 함수 만 수행 할 수 있습니다. 도트 제품.


2

그렇습니다 . 벡터 구성 요소가이면 단일 Vector클래스를 사용하여 점과 벡터를 모두 정의 해도 됩니다.w0

점과 벡터 의 주요 차이점은 점은 원점에서 오프셋 된 공간의 물리적 위치를 나타내고 벡터는 방향을 나타냅니다 . 점은 번역 될 수 있지만 벡터 변환 할 수 없습니다 . w2- 또는 3 차원의 컴포넌트 Vector클래스 포획 효과에 변환 행렬의 평행 성분을 허용하는 것이다. 경우 w이며 1, 다음 번역 및 회전이 적용됩니다; 인 경우 0회전 만 적용됩니다.

w벡터 세트 의 구성 요소 0가 없으면 다시 물릴 수 있습니다. 추적하기 어려운 버그로 이어집니다. 안전을 위해, 당신은 할 수 Point로부터 상속 클래스를 Vector명시 적으로 클래스가 설정 w1어디에, Vector클래스 기본값 w으로 0.


2
많은 벡터 클래스는 w 구성 요소를 명시 적으로 사용하지 않습니다. 상당히 많은 사람들이 그것을 암시 적 요소로 취급하거나 그것을 구현하는 'ProjectiveVector'클래스에 상당하는 것을 갖지만, 많은 엔진 코드 (기본적으로 렌더링 외부의 모든 것)는 aw 구성 요소를 운반하는 '클래식'3 벡터를 사용합니다. 전적으로 불필요한 것입니다. 이것은 벡터 또는 점 의 필수 부분이 아닌 구현 세부 사항 입니다.
Steven Stadnicki

@StevenStadnicki 사실이지만 클래스가 점과 벡터를 모두 나타내려면 w구성 요소가 있어야합니다. 그렇지 않으면 객체 사용 방법을 결정할 방법이 없습니다.
kevintodisco

1
@ktodisco 사용 방법을 결정하는 방법은 사용되는 컨텍스트를 보는 것입니다.
JCM

1
주석을 편집 할 시간이 부족합니다. (. 클래스를 사용하는 엔진의 일부가 사용될 컨텍스트를 정의하면 작동합니다.
kevintodisco

2

점과 벡터는 같은 것으로 생각할 수 있습니다. 당신에게 이치에 맞다면, 이런 식으로 위치를 나타내는 벡터에 대해 생각할 수 있고, Vector2클래스 를 사용했던 모든 곳 에서 클래스 를 사용하는 것이 논리적 Point입니다.

수학에서 벡터는 때때로 위치를 나타내는 데 사용됩니다. 이러한 의미에서 사용되는 벡터는 원점을 기준으로 일부 엔티티가있는 위치를 나타냅니다. 예를 들어, 당신이 '업을하고 있고 플레이어의 배가 경기장에서 어디에 있는지 추적하고 싶다고 가정 해 봅시다. 플레이 영역의 왼쪽 하단 코너를 (0, 0)으로 취급하면 다음과 같이 플레이어의 위치를 ​​나타낼 수 있습니다 Vector.

   * Player (3,3)
  /
 /
. (0,0)

이 경우 벡터가 의미하는 것은 선박이 오른쪽에서 3 단위, 원점보다 3 단위 높다는 것입니다. (플레이어 속도에 벡터를 사용할 수도 있습니다.이 경우 플레이어는 매 초마다 또는 프레임 당 3 단위 씩 오른쪽으로 3 단위 씩 이동합니다. 위치와 속도는 모두 같은 벡터 클래스로 표시되지만 벡터는 플레이어의 스크립트에서 다르게 처리됩니다.)

선 예제를 사용하기 위해 위치 벡터는 시작 "점"과 끝 "점"이 원점을 기준으로 위치를 나타냅니다. 원점이 경기장의 중심이라면 다음과 같은 선을 결정할 수 있습니다.

             * (8, 2)
             |
     . (0,0) |
             |
             * (8, -2)

따라서 선의 한쪽 끝은 경기장 중앙 오른쪽에서 8 대, 위쪽으로 2 대이고, 다른 쪽 끝은 오른쪽으로 8 대, 아래로 2 대입니다.

명확히하기 위해 Vector클래스 대신 클래스 를 사용해야한다고 말하는 것은 아닙니다 Point. 이것은 이러한 상황에 대해 생각하는 한 가지 방법 일뿐입니다.


공간의 다른 점에 대한 오프셋 인 벡터는 여전히 상대 좌표의 점으로 생각해야합니다. 게임 엔진에 관한 한 벡터라고 부르는 것은 잘못입니다.
kevintodisco

0

구현에 따라 다릅니다. 프로토 타입 대신 Vector2d에 메소드가 있어야하는 경우 게임에 필요한 포인트의 양을 고려할 때 비용이 발생합니다. JavaScript가 작동하는 방식입니다. 이 상황에서 불필요한 함수가 모두없는 Point2d 클래스를 만드는 것이 좋습니다.


메소드가 프로토 타입에 추가되므로 문제가되지 않습니다.
JCM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.