/******************************************************************************* ★ 설명 oObj에 해당하는 좌표계가 Screen좌표계인지를 체크한다. ★ parameter 1. oObj : 체크할 Object(예 : mainframe, this.getOwnerFrame(), this, button,...) ★ return - oObj가 Screenr기준 좌표계인 경우 = true - oObj가 Screenr기준 좌표계가 아닌경우 = false - oObj가 null인 경우 = false ******************************************************************************/
function IsObjScreenPos(oObj)
{
var sType;
if( fn_IsNull(oObj) ) return false;
sType = GetObjType(oObj);
if( fn_IsNull(sType) ) return false;
if( sType.toLowerCase() == "mainframe" )
return true;
if( sType.toLowerCase() == "childframe" )
{
if( IsObjPopup(oObj.name) == true )
return true;
}
return false;
}
/******************************************************************************* ★ 설명 oObj에 해당하는 Object가 Position을 갖지 않는 Object인지 판단한다. 즉, oObj가 invisible Object인지 판단한다. ★ parameter 1. oObj : 체크할 Object(예 : application, mainframe, this.getOwnerFrame(), this, button,...) ★ return - oObj가 position property가 없는 경우 = true - oObj가 position property가 있는 경우 = false - oObj가 null인 경우 = false ******************************************************************************/
function IsObjNoPos(oObj)
{
var sType;
if( fn_IsNull(oObj) ) return false;
sType = GetObjType(oObj);
if( fn_IsNull(sType) ) return false;
if( fn_IsNull(oObj.position) )
return true;
return false;
}
/******************************************************************************* ★ 설명 system의 cursorx, cursory를 해당 Object의 영역좌표에 맞는 값으로 변경한다. ★ parameter 1. oObj : Object (예 : mainframe, this.getOwnerFrame(), this, button,...) ★ return - 성공 = oObj좌표계에 해당하는 Cursor position 문자열 ( 예 : "20 20" ) - 실패 = "" ★ 주의사항 단, event에서 얻어지는 cursor좌표는 아니다. ******************************************************************************/
function GetObjCursorPos(oObj)
{
var sObjPos;
var cursorx, cursory;
var sCursorPos;
if( fn_IsNull(oObj) ) return "";
if( IsObjNoPos(oObj) ) return "";
cursorx = system.cursorx;
cursory = system.cursory;
if( IsObjScreenPos(oObj) == true )
sCursorPos = cursorx + " " + cursory;
else
sCursorPos = (system.screenToClientX(oObj, cursorx)+oObj.position.left) + " " + (system.screenToClientY(oObj, cursory)+oObj.position.top);
return sCursorPos;
}
/******************************************************************************* ★ 설명 Position문자열을 Rect Object로 바꾼다. ★ parameter 1. sPos : Position 문자열 (예 : "10 10 50 50" 또는 "10 10") ★ return 1. 성공 = Rect Object (※ 단, sPos = "10 10" ==> 2개인 경우 Rect.right = Rect.left, Rect.bottom = Rect.top, Rect.width = 0, Rect.height = 0) 2. 실패 = null ★ 주의사항 1. Rect Object는 좌표를 처리하는 XPlatform 내부 Object로서 메뉴얼에는 존재치 않는다. Rect Object의 멤버는 left, top, right, bottom, width, height가 있다. (예 : rect가 Rect Object라면 rect.left, rect.top으로 사용하면 된다.) 2. Rect Object내에서의 좌표 처리 방법 ( 1) right ==> width순으로 처리하면 right는 재계산된다. width ==> right순으로 처리하면 right는 재계산 되지 않는다. 2) width처리를 하지 않고 right만 처리하면 width는 자동계산 된다. right처리를 하지 않고 width만 처리하면 right는 자동계산 된다. 3) 위 1), 2)는 left를 먼저 지정했을 경우에 한하여 처리된다. 또한, top, bottom에 대해서도 동일하게 처리된다. ******************************************************************************/
function Str2Rect(sPos)
{
var oRect = new Rect();
var i;
var aPos, no;
if( fn_IsNull(sPos) ) return null;
aPos = sPos.toString().split(" ");;
if( aPos.length == 0 )
return null;
no = 0;
for( i = 0 ; i < aPos.length ; i++ )
{
if( IsNum(aPos[i]) == true )
{
if( no == 0 ) oRect.left = Math.round(parseFloat(aPos[i]),1);
if( no == 1 ) oRect.top = Math.round(parseFloat(aPos[i]),1);
if( no == 2 ) oRect.right = Math.round(parseFloat(aPos[i]),1);
if( no == 3 ) oRect.bottom = Math.round(parseFloat(aPos[i]),1);
if( no == 4 ) oRect.width = Math.round(parseFloat(aPos[i]),1);
if( no == 5 ) oRect.height = Math.round(parseFloat(aPos[i]),1);
no++;
}
}
if( no != 2 && no != 4 && no != 6 )
return null;
if( no == 2 )
{
oRect.right = oRect.left;
oRect.bottom = oRect.top;
oRect.width = 0;
oRect.height = 0;
}
return oRect;
}
/******************************************************************************* ★ 설명 Rect Object를 Position문자열로 바꾼다. ★ parameter 1. oRect : Rect Object(예 : Rect.left = 10, ... ) ★ return 1. 성공 = Position문자열 ( 예 : "10 20 30 40" ) (※ 단, Rect.right = Rect.left, Rect.right = Rect.left, Rect.width = 0, Rect.height = 0 인경우는 return = "10 10") 2. 실패 = "" *****************************************************************************/
function Rect2Str(oRect)
{
if( fn_IsNull(oRect) ) return "";
if( IsPoint(oRect) == true )
return oRect.left + " " + oRect.top;
else
return oRect.left + " " + oRect.top + " " + oRect.right + " " + oRect.bottom;
}
/******************************************************************************* ★ 설명 Rect Object의 내용이 Point(left, top만 유효한 경우)인지 판단한다. ★ parameter 1. oRect : Rect Object(예 : Rect.left = 10, ... ) ★ return 1. 성공 = true (Point인 경우) 2. 실패 = false ( oRect가 null이거나 Point가 아닌 경우) *****************************************************************************/
function IsPoint(oRect)
{
if( fn_IsNull(oRect) ) return false;
if( (oRect.left == oRect.right && oRect.top == oRect.bottom) ||
(oRect.width == 0 && oRect.height == 0 ) ||
( (oRect.left != 0 && oRect.right == 0) && (oRect.top != 0 && oRect.bottom == 0) ) )
return true;
else
return false;
}
/******************************************************************************* ★ 설명 sAreaPos의 Center위치에 맞는 sObjPos의 position을 구한다. ★ parameter 1. sAreaPos : 영역에 해당하는 Position 문자열 (예 : "10 10 50 50", this.position,...) 2. sObjPos : Center에 위치할 대상 Object의 Position (옵션 : Default="" ==> Object의 Width=0, Height=0인 경우에 해당함) (예 : "", "10 10 30 30", this.position,...) ★ return - 성공 = sAreaPos의 좌표계에 해당하는 Center position 문자열 ( 예 : sObjPos=""인 경우 ==> "30 30", sObjPos="10 10 20 20"인 경우 ==> "20 20 40 40" ) - 실패 = "" ******************************************************************************/
function GetCenterPos(sAreaPos, sObjPos)
{
var vAreaPos;
var vObjPos = new Rect();
var vCenterPos = new Rect();
if( fn_IsNull(sAreaPos) ) return "";
vAreaPos = Str2Rect(sAreaPos);
if( fn_IsNull(vAreaPos) ) return "";
if( fn_IsNull(sObjPos) )
{
vObjPos.left = vObjPos.right = 0;
vObjPos.top = vObjPos.bottom = 0;
vObjPos.width = 0;
vObjPos.height = 0;
}
else
{
vObjPos = Str2Rect(sObjPos);
if( fn_IsNull(vObjPos) ) return "";
}
if( IsPoint(vObjPos) == true )
{
vCenterPos.left = vAreaPos.left + Math.round(vAreaPos.width/2,1);
vCenterPos.top = vAreaPos.top + Math.round(vAreaPos.height/2,1);
}
else
{
vCenterPos.left = vAreaPos.left + Math.round(vAreaPos.width/2,1) - Math.round(vObjPos.width/2,1);
vCenterPos.top = vAreaPos.top + Math.round(vAreaPos.height/2,1) - Math.round(vObjPos.height/2,1);
vCenterPos.right = vCenterPos.left + vObjPos.width;
vCenterPos.bottom = vCenterPos.top + vObjPos.height;
}
return Rect2Str(vCenterPos);
}
/******************************************************************************* ★ 설명 nLeft, nTop좌표로 sPosition의 Width에 대해 n Offset Width만큼, sPosition의 Height에 대해 n Offset Height만큼 이동한 좌표 Position문자열을 획득한다. ★ parameter 1. sPosition : position 문자열 (예 : "absolute 10 10 20 20" = object.position ) 단, "absolute"는 생략 가능하다. 2. nLeft : 이동할 Left 값 ( 예 : 10 또는 -10 ) 3. nTop : 이동할 Top 값 ( 예 : 10 또는 -10 ) 4. nOffsetWidth : 이동할 Offset Width값 ( 예 : 10 또는 -10 ) (옵션 : Default = 0, 즉 이동하지 않는다) 5. nOffsetHeight : 이동할 Offset Height값 ( 예 : 10 또는 -10 ) (옵션 : Default = 0, 즉 이동하지 않는다) ★ return - 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" ) 단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면 이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다. ( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" ) - 실패 = "" ★ 목적 XPlatform은 Width, Height가 아닌 Right, Bottom을 적용하기 때문에 헷갈리는 면이 있다. 또한, object를 이동시키는 함수는 있지만 이동될 좌표만 구하는 함수가 없기 때문에 이 함수를 만들었다. ******************************************************************************/
function GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight)
{
var sType;
var vPosition;
var vRetPosition = new Rect();
if( fn_IsNull(sPosition) || fn_IsNull(nLeft) || fn_IsNull(nTop) ) return "";
if( fn_IsNull(nOffsetWidth) )
nOffsetWidth = 0;
if( fn_IsNull(nOffsetHeight) )
nOffsetHeight = 0;
vPosition = Str2Rect(sPosition);
if( fn_IsNull(vPosition) ) return "";
vRetPosition.left = nLeft;
vRetPosition.top = nTop;
if( IsPoint(vPosition) == true )
{
if( nOffsetWidth == 0 && nOffsetHeight == 0 )
return Rect2Str(vRetPosition);
else
{
vPosition.width = 0;
vPosition.height = 0;
}
}
vRetPosition.right = vRetPosition.left + (vPosition.width + nOffsetWidth);
vRetPosition.bottom = vRetPosition.top + (vPosition.height + nOffsetHeight);
return Rect2Str(vRetPosition);
}
/******************************************************************************* ★ 설명 sPosition대비 Left좌표에 대해 nOffsetLeft만큼, Top좌표에 대해 nOffsetTop만큼, Width에 대해 n Offset Width만큼, Height에 대해 n Offset Height만큼 이동한 좌표 Position문자열을 획득한다. ★ parameter 1. sPosition : position 문자열 (예 : "absolute 10 10 20 20" = object.position ) 단, "absolute"는 생략 가능하다. 2. nOffsetLeft : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 ) 3. nOffsetTop : sPosition대비 이동할 Left Offset값 ( 예 : 10 또는 -10 ) 4. nOffsetWidth : sPosition대비 이동할 Width Offset 값 ( 예 : 10 또는 -10 ) (옵션 : Default = 0, 즉 이동하지 않는다) 5. nOffsetHeight : sPosition대비 이동할 Height Offset 값 ( 예 : 10 또는 -10 ) (옵션 : Default = 0, 즉 이동하지 않는다) ★ return - 성공 = 이동될 Position문자열 ( 예 : "absolute 20 20 30 30" 또는 "absolute 0 0 10 10" ) 단, sPosition이 2개만 지정된 경우 offsetWidth, nOffsetHeight에 어떤값을 지정하면 이 경우는 Widht=0, Height=0와 동일하므로 4개로 바꾸어 Return한다. ( 예 : GetMovePos("10 10", 20, 20) = "20 20 20 20" ) - 실패 = "" ******************************************************************************/
function GetMoveToPos(sPosition, nOffsetLeft, nOffsetTop, nOffsetWidth, nOffsetHeight)
{
var nLeft, nTop;
var vPosition;
if( fn_IsNull(sPosition) || fn_IsNull(nOffsetLeft) || fn_IsNull(nOffsetTop) ) return "";
if( fn_IsNull(nOffsetWidth) )
nOffsetWidth = 0;
if( fn_IsNull(nOffsetHeight) )
nOffsetHeight = 0;
vPosition = Str2Rect(sPosition);
if( fn_IsNull(vPosition) ) return "";
nLeft = vPosition.left + nOffsetLeft;
nTop = vPosition.top + nOffsetTop;
return GetMovePos(sPosition, nLeft, nTop, nOffsetWidth, nOffsetHeight);
}
/******************************************************************************* ★ 설명 oObj에 해당하는 Object의 border width를 구하는 함수이다. ★ parameter 1. oObj : Object (예 : mainframe, this.getOwnerFrame(), this, button,...) ★ return - 성공 = oObj의 Border Width - 실패 = -1 ★ 목적 현재 XPlatform(2009.12.10.1)에서 border가 지정되지 않고 style로 적용되어 있으면 border를 구하지 못하므로 만들었다. ******************************************************************************/
function GetObjBorderWidth(oObj)
{
if( fn_IsNull(oObj) ) return -1;
if( IsObjNoPos(oObj) ) return -1;
if( fn_IsNull(oObj.style.border.width) || fn_IsNull(oObj.style.border.width) )
{
var sType;
sType = GetObjType(oObj);
if( IsObjScreenPos(oObj) == true )
return 0-system.screenToClientX(oObj, oObj.position.left);
else
{
if( GetObjType(oObj.parent).toLowerCase() == "form" )
return 0;
else
return system.clientToScreenX(oObj, 0) - system.clientToScreenX(oObj, oObj.position.left);
}
}
else
return oObj.style.border.width;
}
/******************************************************************************* ★ 설명 oFromObj 좌표계의 sFromObjPos에 해당하는 Position을 oToObj 좌표계에 해당하는 Position으로 바꾼다. ★ parameter 1. sFromPos : 변경하고자 하는 oFromAreaObj좌표계 내에서의 Position (예 : "10 10" 또는 "10 10 20 20", Button.position, ...) 2. oFromAreaObj : 변경할 좌표계 Object, 단, Screen의 경우는 "screen"을 넣으면 된다. (예 : "screen", mainframe, this,...) 3. oToAreaObj : 변경할 좌표계 Object 단, Screen의 경우는 "screen"을 넣으면 된다. (예 : "screen", mainframe, this,...) ★ return - 성공 = oToObj 좌표계로 변경된 position 문자열 - 실패 = "" ★ 목적 ScreenToClient, ClientToScreen 밖에 없고 A Object에서 B Object좌표계로 한번에 변경하는 함수가 없어서 만들었음 ★ BUG oFromAreaObj = form, oToAreaObj = "screen"인 경우 잘 안됨(???(모름)) ******************************************************************************/
function GetObjConvPos(sFromPos, oFromAreaObj, oToAreaObj)
{
var vFromPos;
var vRetPos = new Rect();
if( fn_IsNull(sFromPos) || fn_IsNull(oFromAreaObj) || fn_IsNull(oToAreaObj) ) return "";
if( IsObjNoPos(oFromAreaObj) ) return "";
if( IsObjNoPos(oToAreaObj) ) return "";
if( oFromAreaObj == oToAreaObj )
return sFromPos;
vFromPos = Str2Rect(sFromPos);
if( fn_IsNull(vFromPos) ) return "";
if( oFromAreaObj.toString().toLowerCase() == "screen" )
{
vRetPos.left = system.screenToClientX( oToAreaObj, vFromPos.left );
vRetPos.top = system.screenToClientY( oToAreaObj, vFromPos.top );
}
else if( oToAreaObj.toString().toLowerCase() == "screen" )
{
vRetPos.left = system.clientToScreenX( oFromAreaObj, vFromPos.left );
vRetPos.top = system.clientToScreenY( oFromAreaObj, vFromPos.top );
}
else
{
vRetPos.left = system.clientToScreenX( oFromAreaObj, vFromPos.left );
vRetPos.top = system.clientToScreenY( oFromAreaObj, vFromPos.top );
vRetPos.left = system.screenToClientX( oToAreaObj, vRetPos.left );
vRetPos.top = system.screenToClientY( oToAreaObj, vRetPos.top );
}
if( IsPoint(vFromPos) == false )
{
vRetPos.right = vRetPos.left + vFromPos.width;
vRetPos.bottom = vRetPos.top + vFromPos.height;
}
return Rect2Str(vRetPos);
}
/******************************************************************************* ★ 설명 sAreaPos좌표계 내에서 주어진 Align 조건에 따라 sObjPos의 좌표를 재 계산한다. ★ parameter 1. sAreaPos : Object가 움직일 좌표영역에 해당하는 Position 문자열 ( 예 : "10 10 100 100" ) 2. sObjPos : Align될 Object의 현재 Position문자열 ( 예 : "50 50 60 60" ) 3. sAxisPos : 기준이 되는 X,Y축 Position문자열 ( 옵션 : Default=""==>sAreaPos의 center ) ( 예 : "60 60" ) 4. sOffsetPos : sAxisPos로부터의 Offset Position문자열 ( 옵션 : Default="0 0" ) ( 예 : "10 10" 또는 "-10 -10" ) 5. nAlign : sAxisPos를 기준으로 한 정렬형태 ( 옵션 : Default=0 ) 0 = 중앙정렬, 1 = 1사분면, 2 = 2사분면, 3 = 3사분면, 4 = 4사분면 6. bAuto : nAlign을 기준으로 sObjPos의 Width, Height가 들어갈 수 있는 사분면을 자동으로 찾아 정렬한다.( 옵션 : Default=true ) true = 자동정렬, false = 자동정렬 하지 않음 7. bBigResize : Object의 width, height가 해당 4분면의 영역보다 크면 4분면에 맞추어 Object의 width, height를 줄여서 조정한다. 즉, obj > Area이면 obj를 Area의 사분면에 맞춰 줄인다. ( 옵션 : Default = false ) true = Size 조정, false = Size 조정하지 않음 8. bSmallResize : Object의 width, height가 해당 4분면의 영역보다 작으면 4분면에 맞추어 Object의 width, height를 늘려서 조정한다. 즉, obj < Area이면 obj를 Area의 사분면에 맞춰 늘인다. ( 옵션 : Default = false ) true = Size 조정, false = Size 조정하지 않음 ★ return - 성공 = 주어진 조건에 맞는 정렬된 Object의 Position문자열 - 실패 = "" ★ 주의사항 1. bAuto와 (bBigResize, bSmallResize)는 동시에 true일 수 없다. bAuto가 true이면 bBigResize, bSmallResize는 false로 처리된다. 2. (sAxisPos+sOffsetPos)가 sAreaPos의 범위를 벗어나면 null이 return된다. 단, sObjPos의 최종 Align된 Position은 sAreaPos의 범위를 벗어날 수도 있다. 2. 모든 Position은 sAreaPos의 좌표계에 맞도록 전달되어야 한다. 따라서, 머리가 아프다면 모든 좌표를 screen좌표로 처리한다면 좀 더 쉬워지겠지... ******************************************************************************/
function GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos, nAlign, bAuto, bBigResize, bSmallResize )
{
var vAreaPos;
var vAxisPos = new Rect();
var vObjPos;
var vOffsetPos;
var vAlignPos = new Rect();
if( fn_IsNull(sAreaPos) || fn_IsNull(sObjPos) ) return "";
if( fn_IsNull(sAxisPos) )
sAxisPos = "";
if( fn_IsNull(sOffsetPos) )
sOffsetPos = "0 0";
if( fn_IsNull(nAlign) )
nAlign = 0;
if( fn_IsNull(bAuto) )
bAuto = false;
if( fn_IsNull(bBigResize) )
bBigResize = false;
if( fn_IsNull(bSmallResize) )
bSmallResize = false;
vAreaPos = Str2Rect(sAreaPos);
if( fn_IsNull(vAreaPos) ) return "";
vObjPos = Str2Rect(sObjPos);
if( fn_IsNull(vObjPos) ) return "";
if( sAxisPos != "" )
{
vAxisPos = Str2Rect(sAxisPos);
if( fn_IsNull(vAxisPos) ) return null;
}
else
{
vAxisPos.left = vAreaPos.left + Math.round(vAreaPos.width/2,1);
vAxisPos.top = vAreaPos.top + Math.round(vAreaPos.height/2,1);
}
vOffsetPos = Str2Rect(sOffsetPos);
if( fn_IsNull(vOffsetPos) ) return "";
if( bAuto == true )
{
bBigResize = false;
bSmallResize = false;
}
// Axis를 Offset만큼 보정
vAxisPos.left += vOffsetPos.left;
vAxisPos.top += vOffsetPos.top;
// Axis가 Area의 범위를 벗어나면 return null
if( vAxisPos.left < vAreaPos.left )
return "";
if( vAxisPos.left > vAreaPos.right )
return "";
if( vAxisPos.top < vAreaPos.top )
return "";
if( vAxisPos.top > vAreaPos.bottom )
return "";
// Center에 위치
if( nAlign == 0 )
{
vAlignPos.left = vAxisPos.left - Math.round(vObjPos.width/2,1);
vAlignPos.top = vAxisPos.top - Math.round(vObjPos.height/2,1);
}
// 1사분면에 위치
else if( nAlign == 1 )
{
vAlignPos.left = vAxisPos.left;
vAlignPos.top = vAxisPos.top - vObjPos.height;
}
// 2사분면에 위치
else if( nAlign == 2 )
{
vAlignPos.left = vAxisPos.left - vObjPos.width;
vAlignPos.top = vAxisPos.top - vObjPos.height;
}
// 3사분면에 위치
else if( nAlign == 3 )
{
vAlignPos.left = vAxisPos.left - vObjPos.width;
vAlignPos.top = vAxisPos.top;
}
// 4사분면에 위치
else if( nAlign == 4 )
{
vAlignPos.left = vAxisPos.left;
vAlignPos.top = vAxisPos.top;
}
vAlignPos.right = vAlignPos.left + vObjPos.width;
vAlignPos.bottom = vAlignPos.top + vObjPos.height;
// Auto처리
if( bAuto == true )
{
var i;
var aAlignPosAuto, sAlignPosAuto, nCurAlign;
if( nAlign != 0 )
{
for( i = 0 ; i <= 4 ; i++ )
{
nCurAlign = (nAlign+i)%5;
if( nCurAlign == 0 )
continue;
sAlignPosAuto = GetAlignPos( sAreaPos, sObjPos, sAxisPos, sOffsetPos,
nCurAlign, false, false, false );
vAlignPosAuto = Str2Rect(sAlignPosAuto);
if( (vAlignPosAuto.left >= vAreaPos.left) &&
(vAlignPosAuto.right <= vAreaPos.right) &&
(vAlignPosAuto.top >= vAreaPos.top) &&
(vAlignPosAuto.bottom <= vAreaPos.bottom) )
{
vAlignPos = vAlignPosAuto;
break;
}
}
}
}
// Resize처리
if( bBigResize == true || bSmallResize == true )
{
if( nAlign == 1 )
{
if( bBigResize == true )
{
if( vAlignPos.right > vAreaPos.right ) vAlignPos.right = vAreaPos.right;
if( vAlignPos.top < vAreaPos.top ) vAlignPos.top = vAreaPos.top;
}
if( bSmallResize == true )
{
if( vAlignPos.right < vAreaPos.right ) vAlignPos.right = vAreaPos.right;
if( vAlignPos.top > vAreaPos.top ) vAlignPos.top = vAreaPos.top;
}
}
if( nAlign == 2 )
{
if( bBigResize == true )
{
if( vAlignPos.left < vAreaPos.left ) vAlignPos.left = vAreaPos.left;
if( vAlignPos.top < vAreaPos.top ) vAlignPos.top = vAreaPos.top;
}
if( bSmallResize == true )
{
if( vAlignPos.left > vAreaPos.left ) vAlignPos.left = vAreaPos.left;
if( vAlignPos.top > vAreaPos.top ) vAlignPos.top = vAreaPos.top;
}
}
if( nAlign == 3 )
{
if( bBigResize == true )
{
if( vAlignPos.left < vAreaPos.left ) vAlignPos.left = vAreaPos.left;
if( vAlignPos.bottom > vAreaPos.bottom ) vAlignPos.bottom = vAreaPos.bottom;
}
if( bSmallResize == true )
{
if( vAlignPos.left > vAreaPos.left ) vAlignPos.left = vAreaPos.left;
if( vAlignPos.bottom < vAreaPos.bottom ) vAlignPos.bottom = vAreaPos.bottom;
}
}
if( nAlign == 4 )
{
if( bBigResize == true )
{
if( vAlignPos.right > vAreaPos.right ) vAlignPos.right = vAreaPos.right;
if( vAlignPos.bottom > vAreaPos.bottom ) vAlignPos.bottom = vAreaPos.bottom;
}
if( bSmallResize == true )
{
if( vAlignPos.right < vAreaPos.right ) vAlignPos.right = vAreaPos.right;
if( vAlignPos.bottom < vAreaPos.bottom ) vAlignPos.bottom = vAreaPos.bottom;
}
}
// Axis를 중심으로 작은 쪽에 맞추어 Resizing한다.
if( nAlign == 0 )
{
var nSmallWidth, nSmallHeight;
nSmallWidth = Math.min(vAxisPos.left - vAreaPos.left, vAreaPos.right - vAxisPos.left);
nSmallHeight = Math.min(vAxisPos.top - vAreaPos.top, vAreaPos.bottom - vAxisPos.top);
var bWFlag=false, bHFlag=false;
if( bSmallResize == true )
{
if( Math.round(vObjPos.width/2,1) < nSmallWidth )
bWFlag = true;
if( Math.round(vObjPos.height/2,1) < nSmallHeight )
bHFlag = true;
}
if( bBigResize == true )
{
if( Math.round(vObjPos.width/2,1) > nSmallWidth )
bWFlag = true;
if( Math.round(vObjPos.height/2,1) > nSmallHeight )
bHFlag = true;
}
if( bWFlag == true )
{
vAlignPos.left = vAxisPos.left - nSmallWidth;
vAlignPos.right = vAxisPos.left + nSmallWidth;
}
if( bHFlag == true )
{
vAlignPos.top = vAxisPos.top - nSmallHeight;
vAlignPos.bottom = vAxisPos.top + nSmallHeight;
}
}
}
vAlignPos.width = vAlignPos.right - vAlignPos.left;
vAlignPos.height = vAlignPos.bottom - vAlignPos.top;
return Rect2Str(vAlignPos);
}
/******************************************************************************* ★ 설명 nX, nY좌표를 nCx, nCy를 중심으로 nAngle만큼 회전한 좌표를 구한다. ★ parameter 1. nX : 회전할 X좌표 2. nY : 회전할 Y좌표 3. nCx : 회전 중심 X좌표 4. nCy : 회전 중심 Y좌표 5. nAngle : 회전 각(※ radian, 숫자값이 아니다.)(예:Math.PI, Math.PI/2,...) ★ return 1. 성공 = Rect Object( 단, Rect.left = 회전된 X좌표, Rect.top = 화전된 Y좌표 ) 2. 실패 = null ******************************************************************************/
function RotatePoint(nX, nY, nCx, nCy, nAngle)
{
var vPoint = new Rect();
if( fn_IsNull(nX) || fn_IsNull(nY) || fn_IsNull(nCx) || fn_IsNull(nCy) || fn_IsNull(nAngle) )
return null;
nY = -1*nY;
nCy = -1*nCy;
vPoint.left = nCx + Math.round(Math.cos(nAngle)*(nX-nCx) - Math.sin(nAngle)*(nY-nCy),1);
vPoint.top = nCy + Math.round(Math.sin(nAngle)*(nX-nCx) + Math.cos(nAngle)*(nY-nCy),1);
vPoint.top = -1*vPoint.top;
return vPoint;
}
/******************************************************************************* ★ 설명 A직선(Start ~ End)과 B직선(Start ~ End)의 교차점을 구한다. ★ parameter 1. nA_StartX : A직선의 Start X값 2. nA_StartY : A직선의 Start Y값 3. nA_EndX : A직선의 End X값 4. nA_EndY : A직선의 End Y값 5. nB_StartX : B직선의 Start X값 6. nB_StartY : B직선의 Start Y값 7. nB_EndX : B직선의 End X값 8. nB_EndY : B직선의 End Y값 ★ return 1. 성공 = Rect Object( 단, Rect.left = 교차점 X좌표, Rect.top = 교차점 Y좌표 ) 2. 실패 = null *****************************************************************************/
function CrossPoint(nA_StartX, nA_StartY, nA_EndX, nA_EndY, nB_StartX, nB_StartY, nB_EndX, nB_EndY)
{
var vPoint = new Rect();
var nA_Angle, nB_Angle;
if( fn_IsNull(nA_StartX) || fn_IsNull(nA_StartY) || fn_IsNull(nA_EndX) || fn_IsNull(nA_EndY) ||
fn_IsNull(nB_StartX) || fn_IsNull(nB_StartY) || fn_IsNull(nB_EndX) || fn_IsNull(nB_EndY) )
return null;
nA_StartY = -1*nA_StartY;
nB_StartY = -1*nB_StartY;
nA_EndY = -1*nA_EndY;
nB_EndY = -1*nB_EndY;
nA_Angle = Math.tan(Math.atan2((nA_EndY - nA_StartY), (nA_EndX - nA_StartX)));
nB_Angle = Math.tan(Math.atan2((nB_EndY - nB_StartY), (nB_EndX - nB_StartX)));
// 평행한 경우
if( Math.abs(Deg2Rad(nA_Angle - nB_Angle))%180 == 0 )
return null;
vPoint.left = (nA_StartY - nB_StartY - nA_Angle*nA_StartX + nB_Angle*nB_StartX)/(nB_Angle - nA_Angle);
vPoint.top = nA_StartY - nA_Angle*(nA_StartX - vPoint.left);
vPoint.left = Math.round(vPoint.left,1);
vPoint.top = -1*Math.round(vPoint.top,1);
return vPoint;
}
|