예전에 ActiveX Control을 이용해서 차트 컨트롤을 개발한 적이 있었습니다. ActiveX control에 올라간 Edit control에 키보드 입력을 통해 좌표를 입력하면 차트가 입력한 좌표에 따라 변화 하는 기능을 추가할때였는데 도통 키보드 메시지가 받아지지 않았습니다. 당근, 문제를 해결하기는 했으나 그 문제에 대해 문서화를 시켜 놓지 않았더니 같은 문제가 최근에 발생했을때 다시 삽질을 해댔지 뭡니까!! 문서화의 중요성 다시 한 번 마음에 새기게 됩니다. ㅡㅡ;;

제가 만든 ActiveX Control의 클래스 다이어그램을 소개하면 아래의 그림과 같습니다. CMyAcitveXView에는 Edit control이 있고 이에 차트 좌표를 입력하고 Enter 또는 Tab 키를 입력하면 좌표값이 차트 Control로 입력되어 차트가 변화하도록 되어있습니다. 하지만 키보드 메세지를 CMyAcitveXView의 CEdit Control은 받지 못합니다.


아래는 이 문제에 대한 Microsoft 고객지원 사이트의 기술문서 링크입니다.

MFC ActiveX Control in IE Doesn't Detect Keystrokes

그럼, 위 기술문서를 통해 이 문제를 해결하는 방법에 대해서 하나씩 알아보도록 하겠습니다.

SYMPTOMS

Accelerator keys, such as ARROW keys, are first received by the message pump of the ActiveX control's container. Even if the control has the focus, it does not receive messages for keystrokes that have special meaning to control containers, such as ARROW and TAB keys. MFC ActiveX controls have a chance to intercept these messages by overriding their PreTranslateMessage function.

However, PreTranslateMessage is not always called for an MFC ActiveX control.



증상

화살표키와 같은 엑셀레이터 키들은 ActiveX control's container의 메시지 펌프로 처음 전달 됩니다. 비록 control이 포커스를 받고 있다고 하더라도 키보드 메시지는 control로 전달되어지지 않습니다. MFC ActiveX control들은 이러한 키보드 메시지를PreTranslateMessage 함수를 오버라이딩 하므로써 키보드 메시지를 가로챌 수 있습니다.

그러나, PreTranslateMessage는 MFC ActiveX control에서는 항상 호출 되지 않습니다.



CAUSE

PreTranslateMessage in an MFC ActiveX control is called by the TranslateAccelerator method of the IOleInPlaceActiveObject interface of the control. Internet Explorer only calls this method for the control that is currently UI-Active. Only one control can be UI-Active at a time.

Internet Explorer does not automatically UI-Activate any controls when a page is first loaded. Internet Explorer waits until the user tabs to an ActiveX control on the page to UI-Activate it. Also, MFC ActiveX controls UI-Activate themselves when they are clicked with the mouse. In an MFC ActiveX control, this is done in COleControl::OnLButtonUp.

If you have a child control inside your COleControl, mouse-click messages on the child control are not sent to the COleControl and MFC does not UI- Activate the ActiveX control, even though the child control has just been given the keyboard focus. Internet Explorer intercepts the keystrokes and does not give the control a chance to filter them in PreTranslateMessage.



원인

MFC ActiveX control의 PreTranslateMessage 함수는 control의 IOleInPlaceActiveObject interface의 TranslateAccelerator method에 의해서 호출 됩니다. Internet Explorer는 오직 현재 활성화 된 control을 위해 이 method를 호출합니다. 한 번에 오직 하나의 control만이 활성화 될 수 있습니다.

Internet Explorer는 웹 페이지가 처음으로 로드되었을 때 어떠한 control들도 자동으로 활성화 시키지 않습니다. Internet Explorer는 사용자가 user tabs(이게 사용자가 탭키를 누르는것을 이야기하는건지 아니면 다른 의미가 있는건지 모르겠네요 ㅡㅡ??) 웹 페이지의 ActiveX control을 활성화 시킬때 까지 대기합니다. 또한, MFC ActiveX controls 마우스 클릭을 통해서도 활성화가 됩니다.
MFC ActiveX control은 COleControl::OnLButtonUp 메시지가 완료되었을때 활성화 됩니다.

만약 당신의 COleControl이 내부에 child control (제가 소개한 클래스 다이어그램에서 CMyActiveXView에 해당합니다.)을 가지고 있고 마우스 이벤트가 child control에서 발생한다면 이 메시지는 COleControl에게 보내지지 않으며 MFC는 child control이 키보드 포커스를 가지고 있다고 하더라도 ActiveX control을 활성화 시키지 않습니다. Internet Explorer가 키보드 메시지를 가로채서 control이 PreTranslateMessage함수가 메시지를 가져올 기회를 주지 않기 때문입니다.



RESOLUTION

Here is a typical PreTranslateMessage. This code forwards ARROW, HOME, and END keys back to the control so that they can be received using a MESSAGE_MAP entry: 

   // trap keys and forward on to the control
   BOOL CMyActiveXCtrl::PreTranslateMessage(MSG* pMsg)
   {
      switch (pMsg->message)
      {
         case WM_KEYDOWN:
         case WM_KEYUP:
            switch (pMsg->wParam)
            {
               case VK_UP:
               case VK_DOWN:
               case VK_LEFT:
               case VK_RIGHT:
               case VK_HOME:
               case VK_END:
                  SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);
                  // Windowless controls won't be able to call SendMessage.
                  // Instead, just respond to the message here.
                  return TRUE;
            }
            break;
      }
      return COleControl::PreTranslateMessage(pMsg);
   }



해결

아래 코드는 일반적인 PreTranslateMessage함수 입니다. 이 코드는 화살표, HOME, 및 END 키들을 control의 MESSAGE_MAP 항목을 사용하여 받아 사용할 수 있도록 전달합니다.

저 같은 경우는 Enter키와 Tab키에서 CEdit control의 값을 얻어와야 하므로 위 MS 기술문서의 코드를 아래와 같이 고쳐서 사용하였습니다.

   // trap keys and forward on to the control
   BOOL CMyActiveXCtrl::PreTranslateMessage(MSG* pMsg)
   {
      switch (pMsg->message)
      {
         case WM_KEYDOWN:
         case WM_KEYUP:
            switch (pMsg->wParam)
            {
               case VK_TAB:
               case VK_RETURN:
                  pView->GetPoint();
                  return TRUE;
            }
            break;
      }
      return COleControl::PreTranslateMessage(pMsg);
   }



If you have a child control within your ActiveX control, you need to UI-Activate the whole control whenever that child control is activated. For example, if you have an edit control inside your ActiveX control, add a handler as follows to your ActiveX control class:

int CMyActiveXCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
    if (!m_bUIActive)
        OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
    return COleControl::OnMouseActivate(pDesktopWnd, nHitTest, message);
}



만약 당신의 ActiveX control이 child control을 가지고 있다면, 모든 control이 활성화 될 때는 언제나 child control도 활성화 될 필요가 있습니다. 예를 들어 만약 당신의 ActiveX control 내부에 edit control이 있다면, 아래 핸들러를 당신의 ActiveX control 클래스에 추가합니다.



Because Internet Explorer may not immediately UI-Activate a control, even if that is the only control on the page, it may be desirable to automatically request a UI-Activation when the control is created. This can be done during the COleControl::OnCreate (WM_CREATE) handler. Windowless controls do not get WM_CREATE or any windows messages; therefore, this code won't work in a windowless control. Also note that this does not guarantee that a control will remain UI-Activated. If there are other controls on a page that request UI-Activation in a similar manner, only one will eventually be UI-Activated and receive keystroke messages as described. And if the user TABs away from an ActiveX Control, Internet Explorer will automatically UI-deactivate the control.
int CMyActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (COleControl::OnCreate(lpCreateStruct) == -1)
        return -1;
    OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
    return 0;
}



Internet Explorer는 웹 페이지에 오직 control 뿐이라고 해도 즉시 control을 활성화 시키지 않기 때문에 control이 생성되자 마자 활성화 시키는 것이 바람직하다고 할 수 있겠습니다. 이 방법은 COleControl::OnCreate (WM_CREATE) handler를 통해서 구현 될 수 있습니다. 윈도우가 없는 control들은 WM_CREATE 또는 어떠한 윈도우 메시지도 받을 수 없기 때문에 윈도우가 없는 control의 경우 아래의 코드는 무의미합니다. 또한 이 코드가 control이 활성화를 유지하도록 보장하지는 않습니다. 만약 다른 control들이 웹 페이지 상에서 같은 방법으로 활성화 되었다면, 오직 하나만 마지막으로 활성화 될 것이고, 키보드 메시지를 받을 수 있을 것입니다. And if the user TABs away from an ActiveX Control, (해석이 안되네요 ㅡㅡ;;) Internet Explorer 자동으로 control을 활성화 시킬 것입니다.

Posted by 모과이IT
,

Command Shortcut
Edit.RemoveRow 관리되는 리소스 편집기::Ctrl+Del
Edit.RemoveRow 설정 디자이너::Ctrl+Del
Edit.EditCell 관리되는 리소스 편집기::F2
Edit.EditCell 설정 디자이너::F2
View.ForwardBrowseContext 전역::Ctrl+Shift+7
Format.AlignBottoms VC 대화 상자 편집기::Ctrl+Shift+아래쪽 화살표
Format.AlignMiddles VC 대화 상자 편집기::F9
Format.AlignLefts VC 대화 상자 편집기::Ctrl+Shift+왼쪽 화살표
Format.AlignRights VC 대화 상자 편집기::Ctrl+Shift+오른쪽 화살표
Format.AlignTops VC 대화 상자 편집기::Ctrl+Shift+위쪽 화살표
Format.AlignCenters VC 대화 상자 편집기::Shift+F9
Edit.Copy 전역::Ctrl+C
Edit.Copy 전역::Ctrl+Ins
Edit.Cut 전역::Ctrl+X
Edit.Cut 전역::Shift+Del
Edit.Delete 전역::Del
Edit.Delete 클래스 다이어그램::Ctrl+Del
Edit.Paste 전역::Ctrl+V
Edit.Paste 전역::Shift+Ins
File.Print 전역::Ctrl+P
Edit.Redo 전역::Ctrl+Y
Edit.Redo 전역::Shift+Alt+백스페이스
Edit.Redo 전역::Ctrl+Shift+Z
Edit.SelectAll 전역::Ctrl+A
View.Toolbox 전역::Ctrl+Alt+X
Edit.Undo 전역::Ctrl+Z
Edit.Undo 전역::Alt+백스페이스
Format.Bold HTML 편집기 디자인 뷰::Ctrl+B
Format.Italic HTML 편집기 디자인 뷰::Ctrl+I
Format.Underline HTML 편집기 디자인 뷰::Ctrl+U
Edit.Find 전역::Ctrl+F
QueryDesigner.SQL 쿼리 디자이너::Ctrl+3
QueryDesigner.SQL 뷰 디자이너::Ctrl+3
QueryDesigner.Diagram 쿼리 디자이너::Ctrl+1
QueryDesigner.Diagram 뷰 디자이너::Ctrl+1
QueryDesigner.Results 쿼리 디자이너::Ctrl+4
QueryDesigner.Results 뷰 디자이너::Ctrl+4
QueryDesigner.Criteria 쿼리 디자이너::Ctrl+2
QueryDesigner.Criteria 뷰 디자이너::Ctrl+2
Edit.Remove 관리되는 리소스 편집기::Del
Debug.StopDebugging 전역::Shift+F5
Debug.BreakAll 전역::Ctrl+Alt+Break
QueryDesigner.ExecuteSQL 쿼리 디자이너::Ctrl+R
QueryDesigner.ExecuteSQL 뷰 디자이너::Ctrl+R
QueryDesigner.GotoRow 쿼리 디자이너::Ctrl+G
QueryDesigner.GotoRow 뷰 디자이너::Ctrl+G
Debug.ScriptExplorer 전역::Ctrl+Alt+N
Debug.Threads 전역::Ctrl+Alt+H
File.NewProject 전역::Ctrl+Shift+N
File.OpenProject 전역::Ctrl+Shift+O
Project.AddNewItem 전역::Ctrl+Shift+A
File.NewFile 전역::Ctrl+N
File.OpenFile 전역::Ctrl+O
File.SaveAll 전역::Ctrl+Shift+S
Edit.Replace 전역::Ctrl+H
Edit.GoTo 전역::Ctrl+G
View.PropertyPages 전역::Shift+F4
View.FullScreen 전역::Shift+Alt+Enter
View.SolutionExplorer 전역::Ctrl+Alt+L
View.PropertiesWindow 전역::F4
View.TaskList 전역::Ctrl+\, Ctrl+T
View.TaskList 전역::Ctrl+\, T
View.Output 전역::Ctrl+Alt+O
View.ObjectBrowser 전역::Ctrl+Alt+J
View.DocumentOutline 전역::Ctrl+Alt+T
Debug.Immediate 전역::Ctrl+Alt+I
Debug.Locals 전역::Ctrl+Alt+V, L
Debug.CallStack 전역::Ctrl+Alt+C
Project.AddExistingItem 전역::Shift+Alt+A
Debug.StepInto 전역::F11
Debug.StepOver 전역::F10
Debug.StepOut 전역::Shift+F11
Debug.RunToCursor 전역::Ctrl+F10
Debug.QuickWatch 전역::Ctrl+Alt+Q
Debug.QuickWatch 전역::Shift+F9
Debug.ToggleBreakpoint 전역::F9
Debug.DeleteAllBreakpoints 전역::Ctrl+Shift+F9
Debug.SetNextStatement 전역::Ctrl+Shift+F10
Debug.ShowNextStatement 전역::Alt+Num *
Edit.FindinFiles 전역::Ctrl+Shift+F
Edit.ReplaceinFiles 전역::Ctrl+Shift+H
Edit.GoToNextLocation 전역::F8
Edit.GoToPrevLocation 전역::Shift+F8
Window.NextTab 전역::Ctrl+PgDn
Window.PreviousTab 전역::Ctrl+PgUp
Window.PreviousTab HTML 편집기 디자인 뷰::Ctrl+PgUp
Window.PreviousTab HTML 편집기 소스 뷰::Ctrl+PgUp
Window.CloseToolWindow 전역::Shift+Esc
Window.ActivateDocumentWindow 전역::Esc
Window.MovetoNavigationBar 전역::Ctrl+F2
Debug.Start 전역::F5
Debug.Restart 전역::Ctrl+Shift+F5
Window.NextPane 전역::Alt+F6
Window.PreviousPane 전역::Shift+Alt+F6
View.ErrorList 전역::Ctrl+\, Ctrl+E
View.ErrorList 전역::Ctrl+\, E
File.SaveSelectedItems 전역::Ctrl+S
View.ViewDesigner HTML 편집기 소스 뷰::Shift+F7
View.ViewCode 클래스 다이어그램::Enter
File.ViewinBrowser 전역::Ctrl+Shift+W
View.EditLabel 전역::F2
Debug.Exceptions 전역::Ctrl+Alt+E
View.ToggleDesigner 전역::F7
Edit.StopSearch 전역::Alt+F3, S
Debug.StartWithoutDebugging 전역::Ctrl+F5
Edit.FindNext 전역::F3
Edit.FindPrevious 전역::Shift+F3
Edit.FindNextSelected 전역::Ctrl+F3
Edit.FindPreviousSelected 전역::Ctrl+Shift+F3
Debug.EnableBreakpoint 전역::Ctrl+F9
Help.F1Help 전역::F1
ClassViewContextMenus.ClassViewProject.Properties 전역::Alt+Enter
Tools.GoToCommandLine 전역::Ctrl+/
View.ClassView 전역::Ctrl+Shift+C
Window.NextSplitPane 전역::F6
Window.PreviousSplitPane 전역::Shift+F6
Window.NextDocumentWindow 전역::Ctrl+F6
Window.PreviousDocumentWindow 전역::Ctrl+Shift+F6
Edit.CycleClipboardRing 전역::Ctrl+Shift+V
Edit.CycleClipboardRing 전역::Ctrl+Shift+Ins
Window.CloseDocumentWindow 전역::Ctrl+F4
View.CommandWindow 전역::Ctrl+Alt+A
Debug.Autos 전역::Ctrl+Alt+V, A
View.NavigateBackward 전역::Ctrl+-
View.NavigateForward 전역::Ctrl+Shift+-
Build.BuildSolution 전역::Ctrl+Shift+B
Build.Cancel 전역::Ctrl+Break
Edit.GoToDefinition 전역::F12
Edit.GoToDeclaration 전역::Ctrl+F12
Project.Override 전역::Ctrl+Alt+Ins
Edit.FindSymbol 전역::Alt+F12
View.FindSymbolResults 전역::Ctrl+Alt+F12
View.ResourceView 전역::Ctrl+Shift+E
Help.WindowHelp 전역::Shift+F1
View.NextView HTML 편집기 디자인 뷰::Ctrl+PgDn
View.NextView HTML 편집기 소스 뷰::Ctrl+PgDn
Tools.AttachtoProcess 전역::Ctrl+Alt+P
View.PopBrowseContext 전역::Ctrl+Shift+8
View.BrowseNext 전역::Ctrl+Shift+1
View.BrowsePrevious 전역::Ctrl+Shift+2
Edit.QuickFindSymbol 전역::Shift+Alt+F12
View.BookmarkWindow 전역::Ctrl+K, Ctrl+W
Tools.CodeSnippetsManager 전역::Ctrl+K, Ctrl+B
Window.NextDocumentWindowNav 전역::Ctrl+Tab
Window.PreviousDocumentWindowNav 전역::Ctrl+Shift+Tab
Edit.FindAllReferences 전역::Shift+F12
Debug.Breakpoints 전역::Ctrl+Alt+B
Debug.Disassembly 전역::Ctrl+Alt+D
Debug.Registers 전역::Ctrl+Alt+G
Debug.Modules 전역::Ctrl+Alt+U
Debug.ApplyCodeChanges 전역::Alt+F10
Debug.Processes 전역::Ctrl+Alt+Z
Debug.BreakatFunction 전역::Ctrl+B
Debug.StepIntoCurrentProcess 전역::Ctrl+Alt+F11
Debug.StepOverCurrentProcess 전역::Ctrl+Alt+F10
Debug.StepOutCurrentProcess 전역::Ctrl+Shift+Alt+F11
DebuggerContextMenus.BreakpointsWindow.Delete 전역::Alt+F9, D
DebuggerContextMenus.BreakpointsWindow.GoToSourceCode 전역::Alt+F9, S
DebuggerContextMenus.BreakpointsWindow.GoToDisassembly 전역::Alt+F9, A
Debug.ToggleDisassembly 전역::Ctrl+F11
Debug.Memory1 전역::Ctrl+Alt+M, 1
Debug.Watch 전역::Ctrl+Alt+W, 1
Debug.Memory2 전역::Ctrl+Alt+M, 2
Debug.Watch2 전역::Ctrl+Alt+W, 2
Debug.Memory3 전역::Ctrl+Alt+M, 3
Debug.Watch3 전역::Ctrl+Alt+W, 3
Debug.Memory4 전역::Ctrl+Alt+M, 4
Debug.Watch4 전역::Ctrl+Alt+W, 4
Edit.DeleteBackwards 텍스트 편집기::Shift+백스페이스
Edit.DeleteBackwards 텍스트 편집기::백스페이스
Edit.BreakLine Windows Forms 디자이너::Enter
Edit.BreakLine 텍스트 편집기::Shift+Enter
Edit.BreakLine 텍스트 편집기::Enter
Edit.BreakLine 보고서 디자이너::Enter
Edit.InsertTab Windows Forms 디자이너::Tab
Edit.InsertTab 텍스트 편집기::Tab
Edit.InsertTab 보고서 디자이너::Tab
Edit.TabLeft Windows Forms 디자이너::Shift+Tab
Edit.TabLeft 텍스트 편집기::Shift+Tab
Edit.TabLeft 보고서 디자이너::Shift+Tab
Edit.CharLeft Windows Forms 디자이너::왼쪽 화살표
Edit.CharLeft 텍스트 편집기::왼쪽 화살표
Edit.CharLeft 보고서 디자이너::왼쪽 화살표
Edit.CharLeftExtend Windows Forms 디자이너::Shift+왼쪽 화살표
Edit.CharLeftExtend 텍스트 편집기::Shift+왼쪽 화살표
Edit.CharLeftExtend 보고서 디자이너::Shift+왼쪽 화살표
Edit.CharRight Windows Forms 디자이너::오른쪽 화살표
Edit.CharRight 텍스트 편집기::오른쪽 화살표
Edit.CharRight 보고서 디자이너::오른쪽 화살표
Edit.CharRightExtend Windows Forms 디자이너::Shift+오른쪽 화살표
Edit.CharRightExtend 텍스트 편집기::Shift+오른쪽 화살표
Edit.CharRightExtend 보고서 디자이너::Shift+오른쪽 화살표
Edit.LineUp Windows Forms 디자이너::위쪽 화살표
Edit.LineUp 텍스트 편집기::위쪽 화살표
Edit.LineUp 보고서 디자이너::위쪽 화살표
Edit.LineUpExtend Windows Forms 디자이너::Shift+아래쪽 화살표
Edit.LineUpExtend 텍스트 편집기::Shift+위쪽 화살표
Edit.LineUpExtend 보고서 디자이너::Shift+위쪽 화살표
Edit.LineDown Windows Forms 디자이너::아래쪽 화살표
Edit.LineDown 텍스트 편집기::아래쪽 화살표
Edit.LineDown 보고서 디자이너::아래쪽 화살표
Edit.LineDownExtend Windows Forms 디자이너::Shift+위쪽 화살표
Edit.LineDownExtend 텍스트 편집기::Shift+아래쪽 화살표
Edit.LineDownExtend 보고서 디자이너::Shift+아래쪽 화살표
Edit.DocumentStart Windows Forms 디자이너::Home
Edit.DocumentStart 텍스트 편집기::Ctrl+Home
Edit.DocumentStartExtend Windows Forms 디자이너::Shift+Home
Edit.DocumentStartExtend 텍스트 편집기::Ctrl+Shift+Home
Edit.DocumentEnd Windows Forms 디자이너::End
Edit.DocumentEnd 텍스트 편집기::Ctrl+End
Edit.DocumentEndExtend Windows Forms 디자이너::Shift+End
Edit.DocumentEndExtend 텍스트 편집기::Ctrl+Shift+End
Edit.LineStart 텍스트 편집기::Home
Edit.LineStartExtend 텍스트 편집기::Shift+Home
Edit.LineEnd 텍스트 편집기::End
Edit.LineEndExtend 텍스트 편집기::Shift+End
Edit.PageUp 텍스트 편집기::PgUp
Edit.PageUpExtend 텍스트 편집기::Shift+PgUp
Edit.PageDown 텍스트 편집기::PgDn
Edit.PageDownExtend 텍스트 편집기::Shift+PgDn
Edit.ViewTop 텍스트 편집기::Ctrl+PgUp
Edit.ViewTopExtend 텍스트 편집기::Ctrl+Shift+PgUp
Edit.ViewBottom 텍스트 편집기::Ctrl+PgDn
Edit.ViewBottomExtend 텍스트 편집기::Ctrl+Shift+PgDn
Edit.ScrollLineUp VC 대화 상자 편집기::Ctrl+위쪽 화살표
Edit.ScrollLineUp 텍스트 편집기::Ctrl+위쪽 화살표
Edit.ScrollLineDown VC 대화 상자 편집기::Ctrl+아래쪽 화살표
Edit.ScrollLineDown 텍스트 편집기::Ctrl+아래쪽 화살표
Edit.ScrollColumnLeft VC 대화 상자 편집기::Ctrl+왼쪽 화살표
Edit.ScrollColumnRight VC 대화 상자 편집기::Ctrl+오른쪽 화살표
Edit.MakeLowercase 텍스트 편집기::Ctrl+U
Edit.MakeUppercase 텍스트 편집기::Ctrl+Shift+U
Edit.SwapAnchor 텍스트 편집기::Ctrl+K, Ctrl+A
Edit.GotoBrace 텍스트 편집기::Ctrl+]
Edit.GotoBraceExtend 텍스트 편집기::Ctrl+Shift+]
Edit.OvertypeMode 텍스트 편집기::Ins
Edit.LineCut 텍스트 편집기::Ctrl+L
Edit.LineDelete 텍스트 편집기::Ctrl+Shift+L
Edit.DeleteHorizontalWhiteSpace 텍스트 편집기::Ctrl+K, Ctrl+\
Edit.LineOpenAbove 텍스트 편집기::Ctrl+Enter
Edit.LineOpenBelow 텍스트 편집기::Ctrl+Shift+Enter
Edit.ClearBookmarks 텍스트 편집기::Ctrl+K, Ctrl+L
Edit.ToggleBookmark 텍스트 편집기::Ctrl+K, Ctrl+K
Edit.NextBookmark 전역::Ctrl+K, Ctrl+N
Edit.PreviousBookmark 전역::Ctrl+K, Ctrl+P
Edit.CharTranspose 텍스트 편집기::Ctrl+T
Edit.WordTranspose 텍스트 편집기::Ctrl+Shift+T
Edit.LineTranspose 텍스트 편집기::Shift+Alt+T
Edit.SelectCurrentWord 텍스트 편집기::Ctrl+W
Edit.WordDeleteToEnd 텍스트 편집기::Ctrl+Del
Edit.WordDeleteToStart 텍스트 편집기::Ctrl+백스페이스
Edit.WordPrevious 텍스트 편집기::Ctrl+왼쪽 화살표
Edit.WordPreviousExtend 텍스트 편집기::Ctrl+Shift+왼쪽 화살표
Edit.WordNext 텍스트 편집기::Ctrl+오른쪽 화살표
Edit.WordNextExtend 텍스트 편집기::Ctrl+Shift+오른쪽 화살표
Edit.SelectionCancel Windows Forms 디자이너::Esc
Edit.SelectionCancel 텍스트 편집기::Esc
Edit.SelectionCancel 보고서 디자이너::Esc
Edit.SelectionCancel 관리되는 리소스 편집기::Esc
Edit.SelectionCancel 설정 디자이너::Esc
Edit.ParameterInfo 텍스트 편집기::Ctrl+Shift+스페이스바
Edit.ViewWhiteSpace 텍스트 편집기::Ctrl+R, Ctrl+W
Edit.CompleteWord 텍스트 편집기::Alt+오른쪽 화살표
Edit.CompleteWord 텍스트 편집기::Ctrl+스페이스바
Edit.ListMembers 텍스트 편집기::Ctrl+J
Edit.FormatSelection 텍스트 편집기::Ctrl+K, Ctrl+F
Edit.ToggleTaskListShortcut 텍스트 편집기::Ctrl+K, Ctrl+H
Edit.QuickInfo 텍스트 편집기::Ctrl+K, Ctrl+I
Edit.CharLeftExtendColumn 텍스트 편집기::Shift+Alt+왼쪽 화살표
Edit.CharRightExtendColumn 텍스트 편집기::Shift+Alt+오른쪽 화살표
Edit.LineUpExtendColumn 텍스트 편집기::Shift+Alt+위쪽 화살표
Edit.LineDownExtendColumn 텍스트 편집기::Shift+Alt+아래쪽 화살표
Edit.ToggleWordWrap 텍스트 편집기::Ctrl+E, Ctrl+W
Edit.IncrementalSearch 텍스트 편집기::Ctrl+I
Edit.ReverseIncrementalSearch 텍스트 편집기::Ctrl+Shift+I
Edit.LineStartExtendColumn 텍스트 편집기::Shift+Alt+Home
Edit.LineEndExtendColumn 텍스트 편집기::Shift+Alt+End
Edit.WordPreviousExtendColumn 텍스트 편집기::Ctrl+Shift+Alt+왼쪽 화살표
Edit.WordNextExtendColumn 텍스트 편집기::Ctrl+Shift+Alt+오른쪽 화살표
Edit.HideSelection 텍스트 편집기::Ctrl+M, Ctrl+H
Edit.ToggleOutliningExpansion 텍스트 편집기::Ctrl+M, Ctrl+M
Edit.ToggleAllOutlining 텍스트 편집기::Ctrl+M, Ctrl+L
Edit.StopOutlining 텍스트 편집기::Ctrl+M, Ctrl+P
Edit.StopHidingCurrent 텍스트 편집기::Ctrl+M, Ctrl+U
Edit.CollapsetoDefinitions 텍스트 편집기::Ctrl+M, Ctrl+O
Edit.CommentSelection 텍스트 편집기::Ctrl+K, Ctrl+C
Edit.UncommentSelection 텍스트 편집기::Ctrl+K, Ctrl+U
Edit.OpenFile 전역::Ctrl+Shift+G
Edit.SelectToLastGoBack 텍스트 편집기::Ctrl+=
Edit.FormatDocument 텍스트 편집기::Ctrl+K, Ctrl+D
Edit.IncreaseFilterLevel 텍스트 편집기::Alt+.
Edit.DecreaseFilterLevel 텍스트 편집기::Alt+,
View.ShowSmartTag 전역::Shift+Alt+F10
View.ShowSmartTag HTML 편집기 디자인 뷰::Shift+Alt+F10
View.ShowSmartTag 전역::Ctrl+.
Edit.CopyParameterTip 텍스트 편집기::Ctrl+Shift+Alt+C
Edit.PasteParameterTip 텍스트 편집기::Ctrl+Shift+Alt+P
View.VisibleBorders HTML 편집기 디자인 뷰::Ctrl+Q
View.Details HTML 편집기 디자인 뷰::Ctrl+Shift+Q
Layout.InsertColumntotheLeft HTML 편집기 디자인 뷰::Ctrl+Alt+왼쪽 화살표
Layout.InsertColumntotheRight HTML 편집기 디자인 뷰::Ctrl+Alt+오른쪽 화살표
Layout.InsertRowAbove HTML 편집기 디자인 뷰::Ctrl+Alt+위쪽 화살표
Layout.InsertRowBelow HTML 편집기 디자인 뷰::Ctrl+Alt+아래쪽 화살표
Format.InsertBookmark HTML 편집기 디자인 뷰::Ctrl+Shift+L
Format.ConverttoHyperlink HTML 편집기 디자인 뷰::Ctrl+L
View.AutoCloseTagOverride HTML 편집기 소스 뷰::Ctrl+Shift+.
Schema.Expand XML 편집기 스키마 뷰::Ctrl+=
Schema.Collapse XML 편집기 스키마 뷰::Ctrl+-
View.EditMaster HTML 편집기 디자인 뷰::Ctrl+M, Ctrl+M
Edit.InsertSnippet 전역::Ctrl+K, Ctrl+X
Edit.CollapseTag 텍스트 편집기::Ctrl+M, Ctrl+T
View.NonVisualControls HTML 편집기 디자인 뷰::Ctrl+Alt+Q
Build.Compile 전역::Ctrl+F7
Project.AddContentPage HTML 편집기 디자인 뷰::Ctrl+M, Ctrl+C
View.ViewMarkup HTML 편집기 디자인 뷰::Shift+F7
NewFolder 전역::Ctrl+K, Ctrl+F
Edit.NextBookmarkInFolder 전역::Ctrl+Shift+K, Ctrl+Shift+N
Edit.PreviousBookmarkInFolder 전역::Ctrl+Shift+K, Ctrl+Shift+P
Format.TestDialog VC 대화 상자 편집기::Ctrl+T
Format.SpaceAcross VC 대화 상자 편집기::Alt+왼쪽 화살표
Format.SpaceAcross VC 대화 상자 편집기::Alt+오른쪽 화살표
Format.SpaceDown VC 대화 상자 편집기::Alt+아래쪽 화살표
Format.SpaceDown VC 대화 상자 편집기::Alt+위쪽 화살표
Format.ToggleGuides VC 대화 상자 편집기::Ctrl+G
Format.SizetoContent VC 대화 상자 편집기::Shift+F7
Format.CenterVertical VC 대화 상자 편집기::Ctrl+F9
Format.CenterHorizontal VC 대화 상자 편집기::Ctrl+Shift+F9
Format.TabOrder VC 대화 상자 편집기::Ctrl+D
Format.ButtonRight VC 대화 상자 편집기::Ctrl+R
Format.ButtonBottom VC 대화 상자 편집기::Ctrl+B
Edit.MoveControlLeft 전역::Ctrl+왼쪽 화살표
Edit.MoveControlLeft VC 대화 상자 편집기::왼쪽 화살표
Edit.MoveControlLeft Windows Forms 디자이너::Ctrl+왼쪽 화살표
Edit.MoveControlLeft 보고서 디자이너::Ctrl+왼쪽 화살표
Edit.MoveControlDown 전역::Ctrl+아래쪽 화살표
Edit.MoveControlDown VC 대화 상자 편집기::아래쪽 화살표
Edit.MoveControlDown Windows Forms 디자이너::Ctrl+아래쪽 화살표
Edit.MoveControlDown 보고서 디자이너::Ctrl+아래쪽 화살표
Edit.MoveControlRight 전역::Ctrl+오른쪽 화살표
Edit.MoveControlRight VC 대화 상자 편집기::오른쪽 화살표
Edit.MoveControlRight Windows Forms 디자이너::Ctrl+오른쪽 화살표
Edit.MoveControlRight 보고서 디자이너::Ctrl+오른쪽 화살표
Edit.MoveControlUp 전역::Ctrl+위쪽 화살표
Edit.MoveControlUp VC 대화 상자 편집기::위쪽 화살표
Edit.MoveControlUp Windows Forms 디자이너::Ctrl+위쪽 화살표
Edit.MoveControlUp 보고서 디자이너::Ctrl+위쪽 화살표
Edit.SizeControlDown 전역::Ctrl+Shift+아래쪽 화살표
Edit.SizeControlDown VC 대화 상자 편집기::Shift+아래쪽 화살표
Edit.SizeControlDown Windows Forms 디자이너::Ctrl+Shift+아래쪽 화살표
Edit.SizeControlDown 보고서 디자이너::Ctrl+Shift+아래쪽 화살표
Edit.SizeControlUp 전역::Ctrl+Shift+위쪽 화살표
Edit.SizeControlUp VC 대화 상자 편집기::Shift+위쪽 화살표
Edit.SizeControlUp Windows Forms 디자이너::Ctrl+Shift+위쪽 화살표
Edit.SizeControlUp 보고서 디자이너::Ctrl+Shift+위쪽 화살표
Edit.SizeControlLeft 전역::Ctrl+Shift+왼쪽 화살표
Edit.SizeControlLeft VC 대화 상자 편집기::Shift+왼쪽 화살표
Edit.SizeControlLeft Windows Forms 디자이너::Ctrl+Shift+왼쪽 화살표
Edit.SizeControlLeft 보고서 디자이너::Ctrl+Shift+왼쪽 화살표
Edit.SizeControlRight 전역::Ctrl+Shift+오른쪽 화살표
Edit.SizeControlRight VC 대화 상자 편집기::Shift+오른쪽 화살표
Edit.SizeControlRight Windows Forms 디자이너::Ctrl+Shift+오른쪽 화살표
Edit.SizeControlRight 보고서 디자이너::Ctrl+Shift+오른쪽 화살표
Edit.NewAccelerator VC 액셀러레이터 키 편집기::Ins
Edit.NextKeyTyped VC 액셀러레이터 키 편집기::Ctrl+W
Image.FlipHorizontal VC 이미지 편집기::Ctrl+H
Image.FlipVertical VC 이미지 편집기::Shift+Alt+H
Image.Rotate90Degrees VC 이미지 편집기::Ctrl+Shift+H
Edit.NewString VC 문자열 편집기::Ins
Format.CheckMnemonics VC 대화 상자 편집기::Ctrl+M
Image.DrawOpaque VC 이미지 편집기::Ctrl+J
Image.NewImageType VC 이미지 편집기::Ins
Image.ShowGrid VC 이미지 편집기::Ctrl+Alt+S
Image.ShowTileGrid VC 이미지 편집기::Ctrl+Shift+Alt+S
Image.Magnify VC 이미지 편집기::Ctrl+Shift+M
Image.RectangleSelectionTool VC 이미지 편집기::Shift+Alt+S
Image.EraseTool VC 이미지 편집기::Ctrl+Shift+I
Image.FillTool VC 이미지 편집기::Ctrl+F
Image.PencilTool VC 이미지 편집기::Ctrl+I
Image.BrushTool VC 이미지 편집기::Ctrl+B
Image.AirbrushTool VC 이미지 편집기::Ctrl+A
Image.LineTool VC 이미지 편집기::Ctrl+L
Image.TextTool VC 이미지 편집기::Ctrl+T
Image.RectangleTool VC 이미지 편집기::Alt+R
Image.OutlinedRectangleTool VC 이미지 편집기::Shift+Alt+R
Image.FilledRectangleTool VC 이미지 편집기::Ctrl+Shift+Alt+R
Image.RoundedRectangleTool VC 이미지 편집기::Alt+W
Image.OutlinedRoundedRectangleTool VC 이미지 편집기::Shift+Alt+W
Image.FilledRoundedRectangleTool VC 이미지 편집기::Ctrl+Shift+Alt+W
Image.EllipseTool VC 이미지 편집기::Alt+P
Image.OutlinedEllipseTool VC 이미지 편집기::Shift+Alt+P
Image.FilledEllipseTool VC 이미지 편집기::Ctrl+Shift+Alt+P
Image.MagnificationTool VC 이미지 편집기::Ctrl+M
Image.LargerBrush VC 이미지 편집기::Ctrl+=
Image.SmallBrush VC 이미지 편집기::Ctrl+.
Image.SmallerBrush VC 이미지 편집기::Ctrl+-
Image.ZoomIn VC 이미지 편집기::Ctrl+위쪽 화살표
Image.ZoomIn VC 이미지 편집기::Ctrl+Shift+.
Image.ZoomOut VC 이미지 편집기::Ctrl+아래쪽 화살표
Image.ZoomOut VC 이미지 편집기::Ctrl+Shift+,
Image.PreviousColor VC 이미지 편집기::Ctrl+왼쪽 화살표
Image.PreviousColor VC 이미지 편집기::Ctrl+[
Image.PreviousRightColor VC 이미지 편집기::Ctrl+Shift+왼쪽 화살표
Image.PreviousRightColor VC 이미지 편집기::Ctrl+Shift+[
Image.NextColor VC 이미지 편집기::Ctrl+오른쪽 화살표
Image.NextColor VC 이미지 편집기::Ctrl+]
Image.NextRightColor VC 이미지 편집기::Ctrl+Shift+오른쪽 화살표
Image.NextRightColor VC 이미지 편집기::Ctrl+Shift+]
Edit.ShowTileGrid 전역::Enter
Edit.MoveControlUpGrid 전역::위쪽 화살표
Edit.MoveControlDownGrid 전역::아래쪽 화살표
Edit.MoveControlLeftGrid 전역::왼쪽 화살표
Edit.MoveControlRightGrid 전역::오른쪽 화살표
Edit.SizeControlRightGrid 전역::Shift+오른쪽 화살표
Edit.SizeControlUpGrid 전역::Shift+위쪽 화살표
Edit.SizeControlLeftGrid 전역::Shift+왼쪽 화살표
Edit.SizeControlDownGrid 전역::Shift+아래쪽 화살표
Edit.SelectNextControl 전역::Tab
Edit.SelectPreviousControl 전역::Shift+Tab
Refactor.Rename 전역::Ctrl+R, Ctrl+R
Refactor.ExtractMethod 전역::Ctrl+R, Ctrl+M
Refactor.EncapsulateField 전역::Ctrl+R, Ctrl+E
Refactor.ExtractInterface 전역::Ctrl+R, Ctrl+I
Refactor.PromoteLocalVariable 전역::Ctrl+R, Ctrl+P
Refactor.RemoveParameters 전역::Ctrl+R, Ctrl+V
Refactor.ReorderParameters 전역::Ctrl+R, Ctrl+O
Edit.GenerateMethodStub 전역::Ctrl+K, Ctrl+M
Edit.SurroundWith 전역::Ctrl+K, Ctrl+S
Window.ShowEzMDIFileList 전역::Ctrl+Alt+아래쪽 화살표
Window.NextToolWindowNav 전역::Alt+F7
Window.PreviousToolWindowNav 전역::Shift+Alt+F7
View.ClassViewGoToSearchCombo 전역::Ctrl+K, Ctrl+V
View.ObjectBrowserGoToSearchCombo 전역::Ctrl+K, Ctrl+R
View.Backward 전역::Alt+왼쪽 화살표
View.Forward 전역::Alt+오른쪽 화살표
View.CodeDefinitionWindow 전역::Ctrl+\, Ctrl+D
View.CodeDefinitionWindow 전역::Ctrl+\, D
View.ServerExplorer 전역::Ctrl+Alt+S
Image.CopyandOutlineSelection VC 이미지 편집기::Ctrl+Shift+U
Image.UseSelectionasBrush VC 이미지 편집기::Ctrl+U
View.NextError 전역::Ctrl+Shift+F12
Help.Nexttopic 웹 브라우저::Alt+아래쪽 화살표
Help.Previoustopic 웹 브라우저::Alt+위쪽 화살표
View.WebBrowser 전역::Ctrl+Alt+R
Help.Contents 전역::Ctrl+Alt+F1
Help.Index 전역::Ctrl+Alt+F2
Help.Search 전역::Ctrl+Alt+F3
Help.HowDoI 전역::Ctrl+F1
Help.SearchResults 전역::Shift+Alt+F3
Data.StepInto 전역::Alt+F5
Data.Execute 전역::Ctrl+Alt+F5
Data.RunSelection 전역::Ctrl+Q
Data.Column 데이터 집합 편집기::Ctrl+L
Data.InsertColumn 데이터 집합 편집기::Ins
DSLDesigner.MoveUp Dsl Designer::Ctrl+위쪽 화살표
DSLDesigner.MoveDown Dsl Designer::Ctrl+아래쪽 화살표
Edit.ExpandCollapseBaseTypeList 클래스 다이어그램::Shift+Alt+B
Edit.NavigateToLollipop 클래스 다이어그램::Shift+Alt+L
ClassDiagram.Collapse 클래스 다이어그램::Num -
ClassDiagram.Expand 클래스 다이어그램::Num +
Edit.RemovefromDiagram 클래스 다이어그램::Del
Autocompleteforward 전역::Ctrl+;
Autocompletebackward 전역::Ctrl+'
MoveToChild Windows Forms 디자이너::Shift+Esc
MoveToChild 보고서 디자이너::Shift+Esc
Tools.RunTemporaryMacro 전역::Ctrl+Shift+P
Tools.RecordTemporaryMacro 전역::Ctrl+Shift+R
View.MacroExplorer 전역::Alt+F8
Tools.MacrosIDE 전역::Alt+F11
SelectRow 보고서 디자이너::Shift+스페이스바
SelectColumn 보고서 디자이너::Ctrl+스페이스바
View.Datasets 보고서 디자이너::Ctrl+Alt+D
Data.ShowDataSources 전역::Shift+Alt+D
QueryDesigner.JoinMode 쿼리 디자이너::Ctrl+Shift+J
QueryDesigner.JoinMode 뷰 디자이너::Ctrl+Shift+J
QueryDesigner.CancelRetrievingData 쿼리 디자이너::Ctrl+T
QueryDesigner.CancelRetrievingData 뷰 디자이너::Ctrl+T
CrystalReports.이전보고서뷰 Crystal Report 편집기::Ctrl+PgUp
CrystalReports.다음보고서뷰 Crystal Report 편집기::Ctrl+PgDn
Resources.Strings 관리되는 리소스 편집기::Ctrl+1
Resources.Images 관리되는 리소스 편집기::Ctrl+2
Resources.Icons 관리되는 리소스 편집기::Ctrl+3
Resources.Audio 관리되는 리소스 편집기::Ctrl+4
Resources.Files 관리되는 리소스 편집기::Ctrl+5
Resources.Other 관리되는 리소스 편집기::Ctrl+6
ViewCode 설정 디자이너::F7
Edit.GoToFindCombo 전역::Ctrl+D
Process 전역::Ctrl+5
Thread 전역::Ctrl+6
StackFrame 전역::Ctrl+7
Posted by 모과이IT
,

1.  벡터 vs 스칼라

 

 우리가 흔히 하는 셈에서 다루는 값은 스칼라입니다. 그냥 스칼라는 그런수죠. 우리가 초,중,고 다니면서 수학시간에 열심히 계산할때 사용한 대부분의 수. 즉 방향이 없는 크기들입니다..

 벡터는 방향과 크기를 모두 함께 가지고 있는 값입니다. 내가 가고자 하는 목적지가 지금 위치로부터 100미터 떨어져 있다와 북쪽으로 100미터 떨어져있다가 스칼라와 백터의 차이점입니다.

 

거리나 속력은 스칼라값을 말하는 단위입니다. 변위나 속도는 벡터값을 말하는 단위이고요.

변위는 거리라는 스칼라값을 벡터로 표현한것이고 속도는 속력이라는 스칼라값을 벡터로 표현한 것입니다.

시속 100km 는 속력이고 동쪽으로 시속 100km 라고 하면 속도가 되는 것이죠.

 

 벡터의 값에는 방향이 있는데 이것을 다루는 방법을 이야기 하자면 1차원에서는 방향이 2개 입니다. 음수나 양수로 방향을 표시할 수 있습니다. 예를 들어서 오른쪽에서 왼쪽으로 스크롤되는 횡스크롤 게임(D&D같은)이 있다고 할때 캐릭터가 오른쪽으로 가면 양수이고 왼쪽으로 가면 음수가 되는 것입니다.

 마찬가지로 위에서 아래로 종스크롤되는 게임(1945 striker 같은)에서는 위로가면 양수 아래로 가면 음수가 됩니다.

 

 실제 수를 넣어서 문제를 보자면 위아래로만 움직일 수 있는 퐁 게임에서 반사판의 중심이 (20,400)에서 (20,50)까지 움직였다면 변위는 얼마일까요?

 위,아래로만 움직일 수 있기 때문에 x좌표의 값은 변화없이 20으로 고정이 됩니다. 그렇다면 y 값을 살펴볼까요. y의 값이 400 에서 50으로 달라졌네요. 따라서 변위는 -350 입니다.

 

 변위를 다룰때는 방향을 고려하는 것이 매우 중요합니다. 스칼라 양인 거리와 벡터량인 변위는 매우 큰 차이가 있기 때문입니다.  변위를 계산할때 고려해야 할 것은 시작점과 끝점의 위치뿐이고 그 사이에 일어나는 일은 그다지 중요하지 않습니다.

 풋볼경기를 예로 들어보면 다음과 같습니다.

[풋볼 선수의 변위]
 
 볼 경기에서 한 선수가 20야드 라인에서 공을 잡고 달리기 시작합니다. 도중에 수비수들을 피해 요리조리 빠져나가며 계속 달려나가다가 50 야드 라인에서 태클을 당했다면 이 선수의 전진 거리로 인정되는건 A라인이 아니라 B 라인이 됩니다. 벡터도 이와 마찬가지입니다. 도중에 지그재그로 가던지 곧바로 가던지 결국 중요한것은 출발점과 도착점 뿐이라는 것이죠.
 
 위의 그림에서 A 값은 스칼라 값이고 B 값은 벡터 값이 되는 것입니다.
=================================================
|      변위
|      ΔX = X2 - X2
================================================= 
 
 자자 그럼 문제 나갑니다.  슈퍼마리오 게임을 하고 있는데 수평위치 200픽셀에서 시작햇습니다. 오른쪽으로 마구마구 이동하다가 250픽셀쯤 왔을때 버섯을 놓친 것을 깨닫고 다시 100픽셀에 있는 버섯을 먹고 왔습니다. 그 후 마리오는 다시 데이지 공주가있는 450 픽셀까지 달려가 공주를 만났다면 이 마리오의 최종 변위는 몇일까요? 또 실제 이동거리는 얼마일까요?
 
 최종변위부터 계산할까요? 시작점이 200픽셀이고 도착점이 450픽셀이니 450 - 200 =  250 간단하죠?
실제 이동거리도 간단합니다. 처음 200픽셀에서 250픽셀까지 갔을때 50픽셀을 이동했고 다시 버섯이 있는 100픽셀까지 이동했으니 150 픽셀을 더 가서 현재까지 200픽셀을 이동했습니다. 그 후에 공주가 있는 450픽셀까지 이동했으니 추가로 350 픽셀을 더 이동했네요. 그래서 실제 이동거리는 550픽셀이 되는 것입니다.
 
 
 
 
 2. 벡터의 기술 방법
 
 앞에서 우리는 1차원 벡터의 방향을 기술할때 양수와 음수만으로 충분하다는 것을 알았습니다.
하지만 2차원과 3차원에서는 이것만으로는 충분하지 않습니다.
 2차원에서 벡터를 기술하는 방법은 2가지가 있습니다. 그것은 바로 극좌표와 데카르트 좌표계입니다. 먼저 극좌표계부터 살펴보겠습니다.
[극좌표로 표현한 벡터 A]
 
극좌표는 벡터가 실제로 어떤 모양인지를 파악하는 가장 쉬운 방법입니다.
===================================================================
|   벡터 A 의 크기를  ||A|| 라 하고, 벡터의 방향을 θ라 할때
|   벡터 A = ||A|| @ θ
===================================================================
 
 
 
데카르트 좌표는 조금 덜 직관적이지만, 벡터를 코딩할때 사용하는 형식입니다.

극좌표와 같이 길이와 방향으로 벡터를 기술하는 대신, 벡터를 수평과 수직 변위로 나타낼 수도 있으며 이것은 데카르트 좌표계의 방식과 매우 유사합니다. 데카르트 좌표를 구성하는 두가지 요소는 수평과 수직성분이며 이렇게 표현한 형식을 i j  형식이라고 합니다.

 

====================================================================

|   데카르트 좌표 (벡터 성분)

|   벡터의 x 축 방향의 단위벡터를  i^ ,  y 축 방향의 단위벡터를 j^ 라고하면,

|   벡터 B = b1 i^  + b2 j^

======================================================================

** 단위벡터를 나타내는 문자가 원래는 i 위에 ^ 이 모자처럼 씌어진 그림입니다만 키보드에서 적절한 문자를 찾을 수 없어서 뒤에다가 썻으니 이점을 숙지하여 다른 책이나 자료를 볼때 혼동하지 마시길바랍니다. 아래 그림을 참고하시기 바랍니다.

 

[데카르트 좌표로 표현된 벡터 B]

 

 

컴퓨터의 화면은 격자 형태로 설정되습니다. 그렇기 때문에 코딩을 할때 데카르트 좌표를 사용합니다.

혹 극좌표를 사용하려고 한다고 해도 결국은 데카르트 좌표로 변환하여 사용해야 합니다. 극좌표에서 데카르트좌표로 변환하는 방법은 아래 그림과 같습니다.

 

[극좌표에서 데카르트 좌표로의 변환]
 
=====================================================
|   극좌표에서 데카르트 좌표로의 변환
|   벡터 A 가 ||A|| @ θ  일때
|   A = b1 i^  +  b2 j^
|   단, b1 = ||A|| cos θ , b2 = ||A|| sin θ
=====================================================
 
 그럼 예문을 하나 보면서 확실히 기억해볼까요?
벡터 A가 변위 벡터이고,  A = 20m @ 30˚ 일때  이 벡터를 데카르트 좌표 형식으로 변환해 보세요.
 
위의 공식을 잘 보세용 먼저 A를 두 요소로 분해하기 위해 사인과 코사인을 사용합니다.
 
b1 =   || A || cos θ    =     20 cos 30˚   =  20(0.8660)  =  17.32
b2 =   || A || sin θ    =    20 sin 30˚   =   20(0.5)   =   10
 
그래서 A = 17.32 i^  +  10 j^ 입니다.
 
 
 반대로 데카르트 좌표를 극좌표로 변환도 가능합니다.
========================================================
|   벡터 B 가   b1 i^ + b2 j^ 일 때,
||B|| = √(b1)² + (b2)² ,  θ = tan-1 (b2 / b1)     <--- tan-1 이 아크탄젠트라는거 알고 계시죠? ^^;;
========================================================
 
예제를 하나 살펴볼께요.
벡터 3i^ + 4j^ 를 극좌표로 변화하여 보세요.
 
먼저 B 의 크기를 계산합니다
||B|| = √(b1)² + (b2)²  =  √ 3² + 4²  =  √ 9 +16 = √25 = 5
 
B의 크기를 구한 다음에는 방향을 계산합니다.
θ = tan-1 ( b2 / b1 ) = tan-1 (4/3) = 53.1˚ (근사값입니다.)
 
따라서, 극좌표로는 B = 5 @ 53.1˚ 입니다.
 
 데카르트 좌표를 2차원에서 3차원으로 확장 할 수도 있습니다. 2차원에는 없는 z 축을 추가해주기만 하면 됩니다. 간단하죠? 공식은 다음과 같습니다.
 
====================================================================================
|   3차원 데카르트 좌표 ( 벡터 성분 )
|   벡터의 x 축 방향의 단위벡터를 i^  , y축 방향의 단위벡터를 j^  ,  z 축 방향의 단위벡터를  k^ 라고 하면,
|   벡터 B = b1 i^ + b2 j^ + b3 k^
=====================================================================================
 
 데카르트 좌표 형식의 벡터는 i, j 형식 대신 종종 행렬의 한 열이나 한 행으로 표기 되기도 합니다.
                                                                                    5
예를 들어보면 2차원 벡터 A = 5 i^  +  6 j^  는  [5,6]  또는  [  6  ] 으로 표기할 수 있습니다. 
                                                                                            7
마찬가지로 3차원 벡터 B = 7 i^  +  8 j^  +  9 k^ 는 [ 7, 8 ,9 ] 또는 [ 8 ] 라고 표기할 수 있습니다.
                                                                                            9
 
 
 
 
3 벡터의 합과 차
 
   벡터량을 시각적으로 구성할 때는, 각 벡터에 화살표를 사용하는 것이 일반적입니다. 화살의 길이는 벡터의 크기를 나타내고,  화살표의 끝이 가리키는 방향이 벡터의 방향을 나타냅니다. 화살은 비례에 맞도록 그려야 하기 때문에 모든 벡터가 같은 비례를 가지도록 그리는 것이 중요합니다.  아래의 그림처럼 크기가 5m 인 벡터는 크기가 10m 인  벡터의 절반에 해당하는 길이를 가지게 됩니다. 

[화살 표로 표현한 두 벡터]
 
 
벡터를 화살표로 표시할 때,  화살표의 촉 부분을 끝점이라고 하고 그 반대쪽을 시작점이라고 부릅니다.
벡터는 어느 한점에 고정된것이 아니기 때문에 화살표의 길이와 방향만 같다면 어디든지 이동이 가능합니다. 아래의 그림처럼 끝점이 같은 두 벡터 A 와 B에서 벡터 B의 끝점을 벡터 A의 시작점으로 옮기는 것도 가능합니다.

[벡터 A의 끝점과 벡터 B의 시작점을 일치하록 옮긴 벡터의 그림]

 

 

  두 벡터의 시작점과 끝점을 일치하도록 만들었다면, 움직이지 않은 벡터의 시작점과 움직인 벡터의 끝점을 연결하여 새로운 벡터를 그리면 이 새 벡터가 바로 두 벡터의 합입니다.


[ 벡터 A 와  벡터 B 의 합 ]
 
이렇게 벡터의 합을 구할때  둘중 어떤 벡터를 옮기더라도 새롭게 만들어지는 합의 벡터는 언제나 같습니다.
즉 벡터의 합에는 교환법칙이 성립한다는 이야기가 되는 것이죠.

[ A + B  =  B + A ]
 
 
=============================================
|   벡터 합의 교환법칙
|   임의의 벡터 A, B 에 대하여,
|   A + B  =  B + A
=============================================
 
 위의 그림에서 각각의 벡터 A 가 5m 라고 가정하고  벡터 B가 6m 라고 가정할때 A+B 의 벡터의 길이는 어떤가요? A=5 이고 B=6 이니 A+B =11 이라고 생각하기 쉽지만 그림을 잘 보시면 새롭게 만들어진 붉은 벡터가 기존의 두개의 검은 벡터를 더한것보다 짧게 보이죠? 이 것은 벡터의 방향이 고려되었기 때운입니다.
 
결국 방향이 같지 않다면  || A+B || ≠ ||A|| + ||B||   라는 말이 됩니다.
 
그래서 극 좌표로 표현된 벡터는 같은 방향이 아닌이상 항상 데카르트 좌표로 변환하여 더해야 합니다.
두 벡터가 데카르트 좌표로 표현되었다면, 같은 성분의 벡터끼리 더하기만 하면 됩니다.
 다시말해서 두개의 i^ 와 두개의 j^를 더하는 것이죠.
 
=================================================================
두 벡터의 합 계산
두 벡터 A = a1 i^ + a2 j ^  ,    B = b1 i^ + b2 j^ 에 대하여,
A + B = ( a1 + b1 ) i^  +  (a2 + b2) j^
================================================================= 
 역시 예제를 살펴보면서 확실히 이해해 봅시다.
두 벡터 C = 8i^ + 3j^ ,   D = 5i^ + 12j^ 에 대하여, C+D를 구하세요.
 
 먼저 이 두 벡터를 그린후에 D의 시작점을 C의 끝점으로 옮깁니다. 거듭 강조하지만 벡터를 옮기는 과정에서 길이와 방향이 변하지 않도록 주의해 주세요.
 C 의 시작점과 D의 끝점을 이어서 새로운 벡터 C + D 를 그려줍니다. 그림은 아래와 같습니다.

 [ 벡터 C + D ]
 
C + D 를 계산하는 방법은  x축 방향으로의 총 이동량과  y축 방향으로의 총 이동량을 계산하는 것입니다.  즉 두개의 i^와 두개의 j^ 를 각각 성분별로 더하는 것이죠.  이 경우에는, 다음과 같이 계산할 수 있습니다.
 
C + D = (8+5) i^ + (3+12) j^  =  13 i^ + 15 j^
 
 벡터의 합을 구하는 이같은 방법은 3차원에서도 그대로 적용됩니다. 마찬가지로 3차원에서의 벡터의 합을 계산하려면 벡터는 반드시 데카르트 좌표 형식이어야 합니다.
 
=============================================================================
|  3차원 벡터의 합 계산
두 벡터 A = a1 i^ + a2 j^ + a3 k^,    B = b1 i^ + b2 j^ + b3 k^ 에 대하여,
A + B = (a1+b1) i^ + (a2+b2) j^ + (a3+b3) k^
=============================================================================
 
 지금까지 보아온 벡터의 합과 같은 방법으로 두 벡터의 차도 구할 수 있습니다. 각 성분의 합을 구한것처럼 각 성분의 차를 구하면 됩니다. 2차원과 3차원에서의 벡터의 차 공식 나갑니다!!!!!!!!]
 
=================================================================
두 벡터 사이의 차 계산
두 벡터 A = a1 i^ + a2 j ^  ,    B = b1 i^ + b2 j^ 에 대하여,
A - B = ( a1 - b1 ) i^  +  (a2 - b2) j^
================================================================= 
=============================================================================
|  3차원 벡터의 차 계산
두 벡터 A = a1 i^ + a2 j^ + a3 k^,    B = b1 i^ + b2 j^ + b3 k^ 에 대하여,
A - B = (a1-b1) i^ + (a2-b2) j^ + (a3-b3) k^
=============================================================================
 
 
 
4. 벡터의 스칼라 곱
 
 우리들은 지금까지 공부하면서 수많은 종류의 곱셈을 해왔습니다. 양수끼리의 곱셈, 음수와 양수의 곱셈, 정수와 소수와 곱셈 등등등.......  이들 곱셈은 모두 스칼라값과 스칼라값 사이의 곱셈이었습니다.  이제 위에서 배운 백터를 써먹을 때가 됬네요.  바로 벡터와 스칼라의 곱셈을 할 차례입니다!!!!
 벡터에 스칼라를 곱한다는 것은 벡터의 크기를 늘리거나 줄이는 결과를 가져옵니다. 곱하는 스칼라가 1보다 크다면 벡터는 커지고, 스칼라가 1보다 작다면 벡터의 크기는 작아집니다.
 
============================================================================
|   극좌표 형식 벡터의 스칼라 곱
|   임의의 벡터 A = c ||A|| @ θ 에 대하여,
|   cA = c ||A|| @ θ
============================================================================
 
 예제를 하나 살펴볼까요?
 벡터 A = 3ft @ 22˚ 일때 5A 를 구하세요.
 
위의 공식에 바로 대입해 볼께요.
5A = 5(3ft) @ 22˚ = 15ft @ 22˚
 
벡터가 극좌표의 형식이 아닌 데카르트좌표 형식으로 되어 있어도 극좌표로 변환하지 않고 스칼라 곱을 구할 수 있는 방법이 있습니다.  각 성분별로 스칼라를 곱하기만 하면 됩니다. 공식은 아래와 같습니다.
 
=============================================================================
데카르트 형식 벡터의 스칼라 곱
임의의 스칼라 c와 임의의 벡터 A = a1 i^ + a2 j^ 에 대하여,
|  cA = ca1 i^ + ca2 j^
=============================================================================
 
예제 고고싱~~~!!!
벡터 A = 12 i^ + 4 j^ 일때, 1/2A 를 구하세요.
 
바로 공식에 대입합니다.
1/2A = 1/2(12 i^) + 1/2(4 j^) = 6 i^ + 2 j^
 
 
 프로그래밍에서는 정규화(normalization)라는 용어를 종종 쓰이곤 합니다. 이 용어는 벡터의 크기를 1로 맞추는 것을 뜻합니다. 벡터의 정규화는 벡터의 크기보다는 벡터의 방향만을 필요로 할 때 이용됩니다. B = i^ + j^ 에서 i^는 x 축의 양의 방향을,  j^ 는 y축의 양의 방향을 가리키는 크기가 1인 벡터입니다.
 
 벡터의 정규화는 벡터가 극좌표 형식일때는 매우 간단합니다. 단지 벡터의 크기를 1로 바꾸고 방향을 변경하지 않으면 됩니다. 예를 들어 3m @ 15˚ 의 벡터가 있다면 1m @ 15˚ 가 되는 것이죠. 너무 간단하죠? ^^;
 
 그렇지만 프로그래밍에서는 데카르트좌표로 표현되는 경우가 많습니다. 이런 경우에는 벡터의 크기를 계산하여 각 성분을 크기로 나누면 됩니다.
 
==============================================================================
2차원 벡터의 정규화
임의의 벡터 A = [a1 a2] 에 대하여
A^  = ( 1 / ||A|| ) A = [ a1 / ||A||    a2 / ||A|| ]
==============================================================================
 
==============================================================================
3차원 벡터의 정규화
임의의 벡터 A = [a1  a2  a3 ] 에 대하여,
A^ = ( 1 / ||A|| ) A = [ a1 / ||A||    a2 / ||A||    a3 / ||A|| ]
============================================================================== 
** 정규화된 벡터 표시인 A^ 역시 위의 i^, j^  와 마찬가지고 기호가 문자 위에 모자처럼 씌어야하는 것임을 알려드립니다.
 
 예제를 하나 볼까용?
 벡터 A = [5  0  -12] 를 정규하 하세요.
 
 가장먼저 해야 할 일은 A의 크기를 구하는 것입니다.
 ||A|| = √ 5² + 0² + (-12)²  =  √ 25 + 0 + 144 = √ 169 = 13
 
이제 크기를 알았으니 벡터의 각 성분을 크기로 나눕니다.
A^ = [ a1 / ||A||    a2 / ||A||   a3 / ||A|| ]  =  [ 5/13  0/13  -12/13 ]
 
벡터를 정규화 한 후에 답이 맞는지 검산하려면 ||A^|| 를 구해보면 됩니다. 이 결과는 항상 1이 나와야 합니다.
 
 
 
5. 벡터의 내적
 
 두 벡터의 내적은 그 결과가 항상 스칼라 값이 나옵니다. 그래서 다른 이름으로 스칼라적 이라고 부르기도 합니다. 
 
======================================================================
2차원 벡터의 내적
임의의 2차원 벡터 A = [ a1  a2 ] ,  B = [ b1  b2 ] 에 대하여,
A●B = a1 b1 + a2 b2
======================================================================
 
========================================================================
3차원 벡터의 내적
임의의 3차원 벡터 A = [ a1  a2  a3 ],  B = [ b1  b2  b3 ] 에 대하여,
A●B = a1 b1 + a2 b2 + a3 b3
========================================================================
 
벡터의 내적은 수 많은 정보를 제공합니다. 그 중 가장 먼저 살펴볼 부분이 바로 벡터의 내적을 통해 두 벡터 사이의 각을 구할 수 있다는 것입니다. 만일 두 벡터의 내적의 값이 0이다면 두 벡터는 서로 직교한다는 것을 알 수 있습니다. 그리고 두 벡터의 내적의 값이 0 보다 작다면 두 벡터 사이의 각은 90도 보다 큰것이고 0보다 크다면 두 벡터 사이의 각은 90도 보다 작게 되는 것입니다.
 
=========================================================================
| 내적의 부호
| 두 벡터 A 와  B 사이의 각을 θ 라고 할 때,
| A●B < 0 이면 , θ > 90˚
| A●B = 0 이면 , 서로 직교
| A●B > 0 이면 , θ < 90˚
=========================================================================
 
 게임상에서 카메라의 위치가 (1,4)이고, 벡터 C = [ 5  3 ] 가 이 카메라의 방향을 나타내고 있습니다. 이 때 어떤 물체의 위치가 (7,2)이고 이 카메라의 시야가 90˚라면 이 물체는 카메라의 시야에 들어올까요?
 

[ 카메라의 시야 ]
 
먼저 위의 그림과 같이 카메라의 위치에서 물체의 위치를 가리키는 벡터를 구해야 합니다. 이 벡터를 D = [(7-1)  (2-4)] = [ 6  -2 ] 라고 합니다. 이제 벡터 C 와 벡터 D를 내적합니다.
 
 C●D = 5(6) + 3(-2) = 30 - 6 = 24
 
두 내적의 결과가 양수이므로 두 벡터 사이의 각 θ 는 90˚ 보다 작음을 알 수 있습니다. 카메라의 시야가 90˚이므로 이 물체는 카메라의 시야에 들어옴을 알 수 있습니다.
 
 간단한 계산만으로 두 벡터 사이의 각이 90˚ 에 대하여 큰지 작은지, 혹은 직교하는 지를 알 수 있었습니다. 만일 두 벡터 사이의 정확한 각을 구할 때에도 내적을 통해 알 수 있습니다.
 
===============================================================
|   두 벡터 사이의 각
|   임의의 두 벡터 A, B 사이의 각을 θ 라 하면,
|   A●B = ||A|| ||B|| cos θ
===============================================================
 
 예제를 볼께요.
 캐릭터가 벡터 C = [5  2  -3 ]가 가리키는 방향으로 이동중이었습니다. 그런데 플레이어가 새로운 목적지를 설정해 주어서 벡터 D = [8  1  -4 ]가 가리키는 방향으로 이동하게 되었습니다.  이 캐릭터는 얼마의 각을 꺽어야 새로운 경로로 이동 할 수 있을까요?
 
 위의 공식에 대입하려면 먼저 두 벡터의 내적을 구해야 합니다.
 C●D = 5(8) + 2(1) -3(-4) = 40 + 2 + 12 = 54
 
 이제 두 벡터의 크기를 각각 구해줍니다.
 ||C|| = √5² + 2² + (-3)² = √25 + 4 + 9 = √38
 ||D|| = √8² +1² + (-4)² = √64 + 1 + 16 = √81
 
이제 각각의 결과를 공식에 대입합니다.
C●D = ||C|| ||D|| cos θ
54 = (√38)(√81) cos θ
54 / (√38)(√81) = cos θ
54 / ( 6.16 * 9 ) = 54 / 55.44 = cos θ
θ = 13.08˚  <---근사값입니다.
 
따라서 이 캐릭터는 13.08˚ 꺽어서 움직이면 됩니다.
 
 
 
6. 벡터의 외적
 
 내적은 벡터를 곱하는 방법에 해당합니다. 이번에는 외적을 다뤄볼 차례 입니다.  내적과 외적의 가장 큰 차이점이라면 결과값의 형태이겠네요.  내적은 결과값이 스칼라이고 외적의 결과는 벡터입니다.
 
============================================================
외 적
임의의 두 벡터 A = [a1 a2 a3],  B = [b1 b2 b3]에 대하여,
A x B = [(a2b3 - a3b2) (a3b1 - a1b3) (a1b2 - a2b1)]
============================================================
 
예제를 하나 볼께요
 두 벡터 A = [ 5  -6  0 ],  B = [1  2  3 ]의 외적을 구하세요.
 
외적의 결과는 또 다른 벡터가 나오므로, 위의 공식을 사용하여 각 성분을 계산하면 됩니다.
A x B = [(a2b3 - a3b2)  (a3b1 - a1b3)  (a1b2 - a2b1)]
         = [(-6(3) - 0(2))   (0(1) - 5(3))   (5(2) - -6(1)) ]
         = [ (-18-0)  (0-15)  (10+6) ]
         = [-18  -15  16 ]
 
 
외적의 가장 중요한 성질은 바로 외적의 결과로 만들어진 벡터가 원래 두 벡터와 모두 직교하는 벡터라는 것입니다. 이러한 이유 때문에 외적은 3차원 벡터에 대해서만 정의 됩니다.
 
================================================================
직교 벡터
A x B 는 두 벡터  A, B 에 모두 수직
================================================================

[ 직교 벡터 ]
 
벡터 A 와 B 를 포함하는 평면에는 수직인 두개의 방향이 있습니다. 바로 위쪽과 아래쪽이죠. 외적의 결과 주어지는 벡터를 결정하는데 오른손 법칙을 쓸 수 있습니다. 손가락을 벡터 A와 B가 교차하는 부분에 두고 손가락을 벡터 A와 같은 방향으로 둡니다.  그런 후에 손가락이 벡터 B를 향하도록 구부리면,  이때 엄지가 향하는 방향이 AxB 의 방향입니다. 반대로 A와 B의 순서를 바꾸어 시도해보면 BxA는 방향이 정반대라는 것을 알 수 있습니다. 그래서 외적은 교환법칙이 성립하지 않습니다.
 
=====================================================================
외적은 교환법칙이 성립하지 않음
A x B ≠ B x A
단, 임의의 3차원 벡터 A , B에 대해서 A x B = -(B x A)
=====================================================================
 
 외적은 결과가 원래의 두 벡터와 수직인 세번째 벡터를 만든다는 독특한 성질 덕뿐에 표면 법선(surface normal)을 계산하는데 사용할 수 있습니다. 임의의 두 3차원 벡터는 하나의 면을 정의합니다. 표면 법선은 주어진 면에 수직인 길이가 1인 벡터를 말합니다.
 
============================================================
표면 법선
임의의 두 3차원 벡터 A, B에 대하여,
표면 법선 = (A x^ B) = AxB / ||AxB||
=============================================================
**위의 공식에서 x^ 또한 위의 벡터의 부호처럼 ^ 이 x 위에 모자처럼 씌어져야 합니다
 
역시 예제를 살펴보면 실력을 다져 볼까요?
두 벡터 A = [5  -2  0 ], B = [1  2  3 ]으로 정의되는 면이 있을때, 이 면과 충돌한 물체의 운동을 결정하는데 사용할 수 있도록 표면 법선을 구하십시오.
 
외적의 결과는 주어진 두 벡터와 직교하는 새로운 벡터이죠? 먼저 외적을 합니다.
A x B = [ (a2b3 - a3b2)  (a3b1 - a1b3)  (a1b2 - a2b1) ]
          = [ (-2(3) - 0(2))   (0(1) - 5(3))   (5(2) - -2(1)) ]
          = [ (-6 - 0)   (0 - 15)   (10 + 2) ]
          = [ -6  -15  12 ]
 
외적을 구했으니 이제 외적의 크기를 구합니다.
||A x B|| = √(-6)² + (-15)² + (12)²
             = √36 + 225 + 144
             = √405
             = 20.125 
 
이제 공식에 대입하면 됩니다.
[ -6/20.125   -15/20.125   12/20.125 ] = [0.298   0.745   0.596 ]
 
 
이미 위에서 두 벡터 사이의 각을 내적을 사용하여 구하는 법을 배웠습니다. 각을 구하는 데에는 내적이 더 빠릅니다만 이미 외적의 값을 알고 있다면 외적을 사용하여 각을 구하는 법을 사용하는것이 좋습니다.
 
=========================================================================
|   두 벡터 사이의 각(외적)
|   임의의 두 3차원 벡터 A, B에 대하여
|   ||AxB|| = ||A|| ||B|| sin θ
=========================================================================
 
자 예제 나갑니다. 단 이번에는 풀이가 없고 답만 알려드릴께요. 한번 직접 풀어보시고 답이랑 맞는지 맞춰보세요 ㅋㅋㅋ
 
<문제> 두 벡터 A = [5  -2  0],  B = [1  2  3] 사이의 각을 구하세요.
<답> 약 87.2˚ 

'모과이 > 수학공부' 카테고리의 다른 글

벡터의 내적  (0) 2013.11.30
Posted by 모과이IT
,