728x90

ECEF(Earth-Centered Earth-Fixed) 또는 지구중심고정좌표계는 지구의 중력 중심을 원점으로 하는 좌표계로, GPS에서 사용되는 좌표체계이다. 








728x90
728x90

국제 횡(橫)메르카토르도법으로서 지구 전체를 원통으로 감싸는 형태의 좌표계로서 적도를 횡축, 자오선을 종축으로 한다. 지리좌표체계는 각 지점의 위치를 경,위도로 나타내는 데 비하여 UTM좌표계는 구역(zone)의 고유번호와 가상적인 준거점으로부터 북과 동으로 각각 떨어진 거리(m)를 나타내는 좌표체계를 말한다. 이것은 1948년 8월 미 육군성(DMA: 현재 NIMA)이 군사적인 목적으로 지도를 제작하면서 고안한 좌표체계이다. 


지리좌표체계가 극지방으로 갈수록 사변형의 모양이 감소되는 데 비하여 UTM(Universal Transeverse Mercator) 좌표는 직사각형 모양 그대로 유지하면서 면적, 거리, 방향, 위치 등을 표현하는 데 편리하다. 

원통에 지구가 접하는 부분을 경도 6도의 폭으로 60개 구역으로 나누어 횡축에 등각투영한다. 

다음은 북위 84도와 남위 80도 사이의 지역을 나누되 각 구역을 0.5도씩 중첩시킴으로써 각 구역의 경계 가까이 있는 지역들이 쉽게 접합되도록 하였다. 

또 좌우로는 180도를 기준으로 서쪽에서 동쪽으로 1~60까지 고유번호를 부여한다. 이때 적도의 남쪽이나 중앙자오선의 서쪽에 위치한 점들에는 '-'값을 부여해야 하는데 이러한 불편을 없애기 위하여 각 구역 내의 모든 점이 '+'값을 가지도록 기준선에 가수를 부여한다. 

이때 동향 가수는 중앙자오선에 500,000m, 북향 가수는 북반구에 0m,남반구에 1,000,000m를 부여한다.


지리좌표계는 경위도의 도, 분, 초로 표현하는 60진법을 사용하여 거리의 환산이 어려운 데 비하여, 이 좌표계는 10진법을 사용하여 거리의 환산을 간편하게 할 수 있다. 또한 좌표상에서 산출한 각이 참값에 근사하고, 거리의 수정량이 방향에 관계없이 동일하다. 이러한 이유로 측량계산, 현지답사는 물론 군사적으로 이용이 대단히 편리한 장점을 갖고 있다. 또한 UTM 좌표계는 서경 177도를 기준으로 동쪽으로 매 6도씩 이동하면서 중앙자오선을 정하고, 그 중앙자오선과 적도의 교점을 원점으로 정하여 가우스-크뤼거투영법을 적용한다.


우리나라에서는 해방 후부터 1974년까지 미군에 의존할 수밖에 없는 상황이었기 때문에 일제가 제작한 1/50,000 지형도를 UTM 투영법으로 수정하여 사용해왔다. 


이 좌표계로 친다면 우리 나라는 (52, S)에 위치 한다.





728x90
728x90

우리가 알고 있는 위도(latitude), 경도(longitude)를 이용한 좌표계가 바로 LLA좌표계로써,

예를 들어 위도, 경도가 (37.541, 126.986)이라고 한다면,

 

x = r sinθ cosφ

y = r sinθ sinφ

z = r cosθ

여기서 r은 반지름.

 

이렇게 계산한다면 대충 서울 정도가 나오게 된다.

LLA 좌표는 UTM과 ECEF 좌표 모두 변환이 가능하다.



728x90
728x90

정반사는 입사벡터와 반사벡터의 크기가 같고, 입사각과 반사각의 크기가 같은 것을 말한다.


Fig.1 을 보면 입사벡터 P 와 법선벡터 n 이 주어졌을때, 반사벡터 R 은 벡터 P 와 크기가 같고, 입사각과 반사각이 같음을 확인할 수 있다. 

여기서는 P 와 n 만으로 반사벡터 R 을 구하는 방법을 알아보자.


우선, 입사 벡터 P 의 역벡터 -P 를 n 의 연장선상에 투영시켜

투영벡터 n(-P·n) 를 구한다.

입사 벡터 P 의 시작 위치를 원점에 위치시키고, 여기에 n(-P·n) 를 더하면, 입사면에 투영된 벡터의 위치를 구할수 있다.

Fig. 3 을 보면, 입사벡터 P 에 n(-P·n) 를 1번 더하면, 입사면에 투영된 위치를 구할 수 있고, 2번 더하면  반사벡터 R 을 구할 수 있음을 알수 있다.

결국, 반사벡터 R 은 R = P +  2n(-P·n)  


출처 : http://blog.naver.com/PostView.nhn?blogId=qnwk111&logNo=80144623306 


728x90

'Math' 카테고리의 다른 글

Math - 동차 좌표계  (0) 2017.04.20
Math - 점과 점 사이의 각도 구하기  (0) 2017.04.19
Math - 점과 점 사이의 거리 구하기  (0) 2017.04.19
Math - Radian과 Degree  (0) 2016.05.19
Math - 피타고라스의 정리  (0) 2016.03.07
728x90
728x90

'좋은 사이트' 카테고리의 다른 글

사이트 - Hooking  (0) 2021.01.19
사이트 - Vulkan 강좌  (0) 2020.10.25
사이트 - wxWidget  (0) 2017.09.04
사이트 - DirectX 강좌  (0) 2016.04.19
사이트 - MS에서 제공하는 무료 서적 사이트  (0) 2016.03.07
728x90

Vector란? 

 - 방향과 크기를 가지는 직선. 기준점이 존재하지 않는다.

 - Point와의 차이점 :

        Point : 원점으로 존재. 위치와 관계 있음.

        Vector : 원점의 존재가 의미 없음. 이동량과 관계 있음.

 

Vector의 크기.

  - Vector의 정규화에 쓰인다.

    벡터의 크기 V = sqrt(power(x,2)+power(y,2)+power(z,2))

 

    기존에 2차원에서는 빗변이 크기가 되어서 크기 = sqrt(밋변제곱+높이제곱)이었다.

    ex)

    V = (1,2,3)

    ||V|| <,여기서 || || 이 표시는 벡터의 크기라는 표시이다.

    ||V|| = 루트(1제곱+2제곱+3제곱).

    ||V|| = 루트(1+4+9).

    ||V|| = 루트(14).

    그러므로 벡터의 크기 ||V||는 루트14가 된다.


Vector의 정규화.(Nomalize)

  - Vector의 크기를 1로 만들어 주는 것을 말한다. (Unit Vector라고도 한다.)

  - 크기는 고려하지 않고, 방향만 알고 싶을 때 사용한다.

 

    1) 축을 정의할 때.

    2) 삼각형을 바라보는 방향만이 필요할 때.

    3) Vector의 크기를 원하는 대로 바꾸고 싶을 때.

  

    ex)

    ^

    V = ( x / ||V||, y / ||V||, z / ||V||)

 

Vector의 내적.(Dot Product)

  - Vector A = (a1, a2, a3)

  - Vector B = (b1, b2, b3)

  - A Dot B = (a1 * b1) + (a2 * b2) + (a3 * b3) (실수 값 하나가 나온다.)

  - theta = Vector A와 Vector B의 사이각.

  - A Dot B = ||A|| * ||B|| * cos(theta)

  - 내적은 어디에 사용되는가?

    1) 두 벡터의 사이 각을 구할 때.

    2) 점과 선 사이의 거리를 구할 때.

    3) 점과 평면 사이의 거리를 구할 때.

    4) 빛을 어느정도 받는지 계산할 때. (Normal과 Light와의 Dot Product) - 램버트 Light

    5) 하나의 Vector를 다른 벡터에 투영 시킬 때.

    6) 물체가 특정 평면에 부딪힌 후의 팅겨오르는 것을 계산하기 위한 반사 Vector를 구할 때.

 

Vector의 외적.(Cross Product)

  - Vector A = (a1, a2, a3)

  - Vector B = (b1, b2, b3)

  - A Cross B = ((a2 * b3 - a3 * b2), (a3 * b1 - a1 * b3), (a1 * b2 - a2 * a1)) (벡터가 나온다.)

  - 외적은 어디에 사용되는가?

    1) 두 벡터에 수직인 벡터를 만들어 낼 때.

    2) 두 벡터로 둘러싸인 평행 사변형의 면적을 구할 때.

    3) 어떤 점이 삼각형에 포함되어 있는가를 계산 할 때.

 

출처 : http://blog.naver.com/neoplog/50046003021

728x90
728x90

피타고라스의 정리.

 - 직각삼각형에서 직각을 낀 두 변의 길이의 제곱의 합은 빗변의 길이의 제곱과 같다.



피타고라스의 증명.

∠A가 직각인 삼각형 ABC에서  b2+c2=a2 임을 증명해보자.

[가정] △ABC에서, ∠A=∠R

[결론] b2+c2=a2

[증명] 아래쪽 그림과 같이 b+c를 한 변으로 하는 정사각형 ADEF를 만들고,

 인 점 G, H를 잡는다.



△ABC, △DGB, △EHG, △FCH

는 모두 합동인 직각삼각형이다. 그러므로


………………………①

∠BCA+∠HCF=∠R이므로

∠HCB=∠R …………………………………………②

①,② 식에서 사각형 CBGH는 한변의 길이가 a인 정사각형이므로

 □ADEF = □CBGH + 4×△ABC

그러므로  (b+c)2 = a2 + 4×(bc/2)

   b2 + 2bc + c2 = a2 + 2bc

따라서 b2+c2=a2


출처 : http://math.kongju.ac.kr/math/lrn/3pldl1.html


728x90

'Math' 카테고리의 다른 글

Math - 동차 좌표계  (0) 2017.04.20
Math - 점과 점 사이의 각도 구하기  (0) 2017.04.19
Math - 점과 점 사이의 거리 구하기  (0) 2017.04.19
Math - Radian과 Degree  (0) 2016.05.19
Math - 정반사 벡터  (0) 2016.03.07
728x90

1. Frame rate란? 

 - 1초에 메인 루프가 몇 번 도는지를 가리켜 프레임 레이트(Frame rate)라고 부른다. 예를 들어 '프레임

    레이트는 60이다'라고 표현하고 더 줄여서 '60프레임이다'라고도 한다. 영어로는 60 Frame per second

    라고 하고 줄여서 fps라고도 한다. 앵간하면 게임에선 60프레임 고정을 목표로 하자.

 

2. 입력 페이스 조절.

 - 여기서 고민해 볼 것은 게임 입력키로 자주 사용하는 GetAsyncKeyState()로 입력을 받아서 물체를 이

   동 시킨다고 치면, 그 게임의 Frame ate에 따라 입력되는 횟수가 틀려질 것이다.

   이것을 해결하기 위한 방법은 기본 적으로 3가지가 있다.

   1) 누른 시간에 비례해서 움직인다.

   2) 이전 프레임에서 눌리지 않았을 때만 반응한다.

   3) 일정 시간 이상 눌려야 반응한다.

  

   1)의 방법은 액션 게임에서는 일반적으로 사용되는 방법으로 한 칸 단위가 아니라 정밀하게 움직이는

   게임에서 사용한다. 예를 들면 1프레임동안 눌렀다면 0.2만큼 이동해라.

 

   2)의 방법은 이전 프레임 상태를 저장해 두고 이번 프레임에서 처음 눌렀을 때만 반응하는 방법이다.

   이 방법 같은 경우에는 이동키에는 사용하기 힘들고, 격투 게임에서 펀치 버튼에서 사용할 수 있겠다.

 

   3)의 방법은 그다지 사용되는 빈도는 높지 않지만 일단은 알아두자. 키를 눌렀을 때 바로 반응하면 곤

   란하거나 잠시 누르고 있을 대 계속 반응한 채로 두고 싶을 때 사용된다.

 

3. Frame rate 계산.

  - 이 계산에도 다양한 방법이 있을 것이다. 여기선 단순하게 하자. 결국 Frame rate는 MainLoop를 1초에

    몇번하는가 이다. 그러면 MainLoop가 1회당 몇초가 걸리는지 생각해서 그 역수를 Frame rate로 하는

    것이다. 하지만 고정된 수로 하는 것은 위험하다. 언제 변수가 생길지 모르니까...

    그래서 MainLoop의 걸리는 시간을 10개 정도 저장을 해서 평균을 내는 것이 좋다.

 

    unsigned PreviousTime[10];

 

    MainLoop()

    {

         unsigned currentTime = time();

         unsigned frameTimeAve = currentTime - PreviousTime[0];

 

         for( int i = 0; i < 10 - 1; ++i)

         {

              PreviousTime[i] = PreviousTime[i + 1];

         }

         PreviousTime[10 - 1] = currentTime;

 

         unsigned frameRate = 1000 * 10 / frameTimeAve;     // 프레임 레이트 계산.

 

         // 여기서 업데이트 및 렌더 처리

    }

 

    10프레임일 때 기록을 저장해 두고 지금 측정한 시간에서 제일 오래된 기록을 빼면 '최근 10 프레임에

    걸린 시간'을 알 수 있다. 다시 10으로 나무면 1프레임당 걸린 시간으로 고칠 수 있고 여기부터는

    Frame rate도 계산 할 수 있다.


4. timeGetTime()을 이용한 fps 구하기.

  - 이 방법은 timeGetTime()을 이용하여 간단하게 fps를 측정하는 코드이다.

    #include <timeapi.h>

    #pragma comment(lib, "Winmm.lib")


    UpdateFPS()

    {

        static DWORD frameCount = 0;                            //프레임 카운트수

        static float timeElapsed = 0.0f;                        //흐른 시간

        static DWORD lastTime = timeGetTime();                  //마지막 시간(temp변수)


        DWORD curTime = timeGetTime();                          //현재 시간

        float timeDelta = (curTime - lastTime)*0.001f;          //timeDelta(1번생성후 흐른 시간) 1초단위로 바꿔준다.


        timeElapsed += timeDelta;


         /////////////////////////////////////////////// 함수 실행!!!!


        frameCount++;

        if (timeElapsed >= 1.0f)                                //흐른시간이 1초이상이면 내가 하고싶은것 처리

        {

            wchar_t pMessage[300] = { 0, };

            float fps = (float)frameCount / timeElapsed;

            swprintf_s(pMessage, sizeof(pMessage), TEXT("[D3D PusthToChannel] FPS: %f \r\n"), fps);     

            OutputDebugStringW(pMessage);

            frameCount = 0;

            timeElapsed = 0.0f;

        }

        lastTime = curTime;

    }

 

5. Frame rate를 고정하자.

  - 위에서 계산한 프레임은 성능이 같은 컴퓨터 끼리는 같은 결과가 나오겠지만 성능이 다른 컴퓨터 끼

    리는 다른 결과가 나오게 된다. 때문에 Frame rate를 고정할 필요가 있다.

    이 고정하는 방법은 대충 2가지의 방법이 있다. 첫 번째는 Frame rate를 일정하게 고정하는 방법이고,

    두 번째는 게임 처리를 Frame rate에 맞춰 변경하는 것이다. 예를 들어 Frame rate가 60일 때에 1 픽셀

    씩 이동하고 Frame rate가 3일 때에 2 픽셀씩 이동하는 방식이다.

 

    1) 프레임 레이트를 고정하는 방법.

      - 프레임 레이트를 고정해서 게임을 제작하는 방법은 고정 프레임 레이트라고 부른다.

        unsigend EndTime = PreviousTime + 16   // 예정 시간. 16은 프레임으로 치면 62.5 정도....

        while( 1)

        {

             unsigned CurrentTime = time() - PreviouseTime;

             if( CurrentTime < 0) CurrentTime += 0x100000000;     // 현재 시간이 음수가 되면 안되기 때문에

             if( CurrentTime >= EndTime)

             {

                   break;

             }

        }

      

        이렇게 하면 이전 프레임 시각에서 16밀리 초 이상 경과하지 않으면 다음으로 넘어가지 않는다. 아

        주 간단히 고정 프레임 레이트를 구현할 수 있지만, 남는 시간을 while문으로 계속 돌리는 것은 좋

        지 않다. 그냥 sleep()으로 재워두자.

 

        while( time() < EndTime())

        {

             sleep( 1);

        }

 

    2) 고정 프레임의 문제점.

      - 현재 빠른 것을 느리게 한다는 가정으로 고정 프레임을 만든 것인데, 느린 것을 빠르게 만드는 방

        법은 없다. 이것이 가장 큰 결점이다. 그래서 프레임 레이트는 가장 느릴 때에 맞춰 정해야만 한다.

        만약 정해진 프레임 레이트에 맞지 않게 된다면 이것은 처리 지연이라고 한다.

 

    3) 프레임 레이트에 맞게 게임 속도를 바꾸는 방법.

      - 프레임 레이트에 맞춰 게임 처리를 변경하는 방법으로 가변 프레임 레이트라고도 한다.

        이 방식의 이점은 크게 두가지로 볼 수 있는데, 첫 번째는 항상 컴퓨터 성능을 극한까지 끌어낼 수

        있다는 것이고 두 번째는 처리 지연이 발생하지 않는다는 것이다. 프로그램이 쉬는 시간이 전혀 없

        으므로 항상 컴퓨터를 최대한으로 사용한다.

       

        하지만 단점도 있다. 프레임 간격이 계속 변한다는 것을 전제로 게임 처리를 작성해야 하므로 코드

        가 복잡해지고, 재현성 문제도 있어서 가변 프레임 레이트 게임에서 같은 상태를 재현하기는 어렵

        다. 때문에 디버그가 상당히 어려워진다.

728x90

+ Recent posts