문제

나는 vector2 및 XNA와 함께 작업 해 왔으며, 제로 벡터에서 Normalize () 멤버 함수를 호출하면 {nan, nan}의 벡터로 정규화된다는 것을 알게되었습니다. 이것은 모두 좋고 좋지만, 제 경우에는 벡터로 남겨 두는 것을 선호합니다.

이 코드를 내 프로젝트에 추가하면 귀여운 확장 방법이 활성화되었습니다.

using ExtensionMethods;

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static Vector2 NormalizeOrZero(this Vector2 v2)
        {
            if (v2 != Vector2.Zero)
                v2.Normalize();
            return v2;
        }
    }
}

불행히도이 방법 보고 이 확장 방법을 호출하는 데 사용하는 벡터를 단순히 정규화하기보다는 정규화 된 벡터입니다. 대신 행동하고 싶습니다 vector2instance.Normanize ()가 수행합니다.

이 공허하게 만드는 것 외에도 'v2'가 수정되도록 어떻게 조정합니까? (본질적으로, 나는 '이'객체에 액세스해야하거나 참조로 'v2'를 통과하려면 'v2'가 필요합니다.)

편집하다:

그리고 네, 나는 이것을 시도했다 :

    public static void NormalizeOrZero(this Vector2 v2)
    {
        if (v2 != Vector2.Zero)
            v2.Normalize();
    }

작동하지 않으며 V2는 Normalizeorzero의 범위에서 변수 일뿐입니다.

도움이 되었습니까?

해결책

벡터 2이기 때문에 작동하지 않습니다 실제로 구조물입니다. 즉, 값으로 전달되고 발신자의 사본을 수정할 수 없습니다. 당신이 할 수있는 최선은 lomaxxx가 지정한 해결 방법이라고 생각합니다.

이것은 일반적으로 구조를 사용하지 않는 이유를 보여줍니다. 보다 이 질문 자세한 내용은. Vector2는 스트루크가 불변이어야한다는 지침을 위반하지만 XNA의 맥락에서 그렇게하는 것이 합리적 일 것입니다.

다른 팁

글쎄, 당신이 정말로 그냥 사망 이렇게하려면 다음과 같은 일을 할 수 있습니다.

public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2)
{
    if (v2 != Vector2.Zero)
        v2.Normalize();
}

당신은 이것을 이런 식으로 부를 것입니다 :

v2.NormalizeOrZero(ref v2);

그것은 강력하지만, 가치가있는 것에 대해 효과가있을 것입니다. 그러나 그 시점에서 당신은 처음에 정적 방법을 호출 할 수도 있습니다.

두 번째 코드 샘플이 작동하지 않는 이유는 확실하지 않지만 첫 번째 코드가 원하는 것을 수행하면 간단히 진행할 수 있습니다.

Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();

둘 다 필요합니다 ref 그리고 this 논쟁의 수정자는 작동하지 않을 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top