/********************************************************************************************* ★ 설명 GraphicPath의 그리기 영역을 구한다. GraphicPath에서 Border와 Pen의 크기를 뺀 영역을 의미한다. ★ parameter 1. obj : GraphicPath Object ( 예 : GraphicPath00 ) 2. nLeftOffset : GrapicPath의 영역 중 Left에서 안쪽으로 들어가는 Offset값 (옵션 : Default = 0) (예 : nLeftOffset=10이면 10만큼 Left에서 떨어진 지점이 영역으로 잡힘) 3. nTopOffset : GrapicPath의 영역 중 Top에서 안쪽으로 들어가는 Offset값 (옵션 : Default = 0) (예 : nTopOffset=10이면 10만큼 Top에서 떨어진 지점이 영역으로 잡힘) 4. nRightOffset : GrapicPath의 영역 중 Right에서 안쪽으로 들어가는 Offset값 (옵션 : Default = nLeftOffset) (예 : nLeftOffset=10이면 10만큼 Right에서 떨어진 지점이 영역으로 잡힘) 5. nBottomOffset : GrapicPath의 영역 중 Bottom에서 안쪽으로 들어가는 Offset값 (옵션 : Default = nBottomOffset) (예 : nLeftOffset=10이면 10만큼 Bottom에서 떨어진 지점이 영역으로 잡힘)★ return ★ Return - 성공 = Rect Object - 실패 = null (단, offset이 너무커서 width나 height값보다 클 경우도 null이 return된다.) ★ 목적 GraphicPath.position을 이용하여 그리면 제대로 안되는 것을 알 수 있다. 그래서, 만들었다. Offset도 줄겸 ★ BUG 이 함수도 제대로 되는게 아니다. 나도 정확히 우찌해야 할지 잘 모르겠다. ???(모름) *********************************************************************************************/
function GPRect(obj:GraphicPath, nLeftOffset, nTopOffset, nRightOffset, nBottomOffset)
{
var GR = new Rect();
var border, pen;
if( fn_IsNull(obj) ) return null;
if( fn_IsNull(nLeftOffset) ) nLeftOffset = 0;
if( fn_IsNull(nTopOffset) ) nTopOffset = 0;
if( fn_IsNull(nRightOffset) ) nRightOffset = nLeftOffset;
if( fn_IsNull(nBottomOffset) ) nBottomOffset = nTopOffset;
border = ( "x"+obj.style.border.width == "xNaN" ? 0 : obj.style.border.width );
pen = ( "x"+obj.strokepen.width == "xNaN" ? 1 : obj.strokepen.width );
GR.left = nLeftOffset;
GR.top = nTopOffset;
// 이렇게 하는게 최선이다.
GR.right = obj.position.width - nRightOffset - 2*border - pen;
GR.bottom = obj.position.height - nBottomOffset - 2*border - pen;
if( GR.width < 0 || GR.height < 0 )
return null;
return GR;
}
/********************************************************************************************* ★ 설명 GraphicPath처리 시 화살표처리 Data를 만들어 준다. 이미 그려놓은 GraphicPath.data에 이 함수에서 return된 data를 덧붙여 처리해서 사용한다. ★ parameter 1. obj:GraphicPath : GraphicPath Object ( 예 : GraphicPath00 ) 2. nArrowType : 화살표의 종류( 예 : 1 ) - 0 = 화살표 안그림 - 1 = ---> 화살표 - 2 = ---▶ 화살표 - 3 = ---◆ 화살표 - 4 = ---● 화살표 3. nEndX, nEndY, nDirAngle : 화살표의 위치 및 화살표 방향 - nEndX, nEndY : 화살표의 끝좌표 - nAngle : 화살표의 방향, 단 Radian값이다. 화살표 끝좌표의 가로축과 시작방향이 이루는 각이다. (※ GetAngle()함수를 이용하면 쉽게 구할 수 있다.) (예 : (15,15) ----> (20,20) 으로 화살표를 그리고 싶다면 nEndX = 20, nEndY = 20, nAngle = Deg2Rad(-45) ) 4. 화살표가 그려질 선을 중심으로 화살표의 넓이와 높이 1) nArrowW : 화살표 넓이 2) nArrowH : 화살표 높이 (※ 단, ---●의 경우 타원처리는 안되고 nArrowW, nArrowH중 작은 쪽을 반지름으로 하는 원만 처리한다. ) (20) (예 : -----(0)▶(10) ==> nArrowW = 10, nArrowH = 20 ) (0) (20) (예 : -----(0)◆(10) ==> nArrowW = 10, nArrowH = 20 ) (0) ★ return - 성공 = GraphicPath.data에 들어갈 화살표 Data - 실패 = "" *********************************************************************************************/
function GPArrow(obj:GraphicPath, nArrowType, nEndX, nEndY, nAngle, nArrowW, nArrowH )
{
var D="";
var nDirX, nDirY;
var nArrowOrgX, nArrowOrgY, nArrowCoW, nArrowCoH, nArrowDist;
var nArrowType;
if( fn_IsNull(obj) || fn_IsNull(nArrowType) || fn_IsNull(nEndX) || fn_IsNull(nEndY) ||
fn_IsNull(nAngle) || fn_IsNull(nArrowW) || fn_IsNull(nArrowH) )
return "";
// ->, ▶
if( nArrowType == 1 || nArrowType == 2 )
{
nArrowCoW = nArrowW;
nArrowCoH = Math.round(nArrowH/2,1);
}
// ◆, ●
else if( nArrowType == 3 || nArrowType == 4 )
{
nArrowCoW = Math.round(nArrowW/2,1);
nArrowCoH = Math.round(nArrowH/2,1);
}
else
return "";
if( nArrowType == 4 )
nArrowDist = Math.min(nArrowW,nArrowH);
else
nArrowDist = Math.sqrt(Math.pow(nArrowCoW,2)+Math.pow(nArrowCoH,2));
nArrowOrgX = nEndX + nArrowDist*Math.cos(nAngle);
nArrowOrgY = nEndY - nArrowDist*Math.sin(nAngle);
/*
D = " M " + nEndX + " " + nEndY;
D += " L " + nArrowOrgX + " " + nArrowOrgY;
return D;
*/
// ->
if( nArrowType == 1 )
{
var nArrowAngle, vRotatePoint1, vRotatePoint2;
nArrowAngle = Math.atan2(nArrowCoH,nArrowCoW);
vRotatePoint1 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, nArrowAngle );
vRotatePoint2 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, -1*nArrowAngle );
D += " M " + nEndX + " " + nEndY;
D += " L " + vRotatePoint1.left + " " + vRotatePoint1.top;
D += " M " + nEndX + " " + nEndY;
D += " L " + vRotatePoint2.left + " " + vRotatePoint2.top;
}
// ▶
if( nArrowType == 2 )
{
var nArrowAngle, vRotatePoint1, vRotatePoint2;
nArrowAngle = Math.atan2(nArrowCoH,nArrowCoW);
vRotatePoint1 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, nArrowAngle );
vRotatePoint2 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, -1*nArrowAngle );
D += " M " + nEndX + " " + nEndY;
D += " L " + vRotatePoint1.left + " " + vRotatePoint1.top;
D += " L " + vRotatePoint2.left + " " + vRotatePoint2.top;
D += " L " + nEndX + " " + nEndY;
}
// ◆
if( nArrowType == 3 )
{
var nArrowAngle, vRotatePoint1, vRotatePoint2, vRotatePoint3;
nArrowAngle = Math.atan2(nArrowCoH,nArrowCoW);
vRotatePoint1 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, nArrowAngle );
vRotatePoint2 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, -1*nArrowAngle );
vRotatePoint3 = RotatePoint( nEndX, nEndY, vRotatePoint1.left, vRotatePoint1.top, Math.PI-2*nArrowAngle );
D += " M " + nEndX + " " + nEndY;
D += " L " + vRotatePoint1.left + " " + vRotatePoint1.top;
D += " L " + vRotatePoint3.left + " " + vRotatePoint3.top;
D += " L " + vRotatePoint2.left + " " + vRotatePoint2.top;
D += " L " + nEndX + " " + nEndY;
}
// ●
if( nArrowType == 4 )
{
var nRX, nRY;
nRX = nRY = Math.min(nArrowCoW,nArrowCoH);
D += " M " + nEndX + " " + nEndY;
D += " A " + nRX + " " + nRY + " 180 0 1 " + nArrowOrgX + " " + nArrowOrgY;
D += " A " + nRX + " " + nRY + " 180 0 1 " + nEndX + " " + nEndY;
}
return D;
}
/********************************************************************************************* ★ 설명 GraphicPath.data를 2차원 Array로 반환한다. 단순히 Parsing만 하며 Array의 순서는 GraphicPath.data의 순서를 그대로 따른다. 단, type이 중복되어 생략되는 경우(예: V 100 100) Array가 추가되고 첫번째 요소는 ""가 들어간다. (아래 예를 참고할것) ★ parameter 1. sGpData : GraphicPath.data ( 예 : "M 0 0 L 100 100 H 100 V 100 100" ) ★ return - 성공 = 2차원 Array ( 예 : Array ==> { {M,0,0}, {L,100,100}, {H,100}, {V,100}, {,100} } - 실패 = 빈 Array ★ 목적 GraphicPathData Object가 있었다가 사라졌다. ★ 참고사항 aGpData로 data문자열을 만들고 싶다면 ==> GraphicPath.data = aGpData.join(" "); 로 처리하면 된다. ********************************************************************************************/
function AGPData(sGpData)
{
var aGpData = new Array();
var arr = new Array();
var i, gi_no=-1, ho_no, val, sType, ho_num;
if( fn_IsNull(sGpData) ) return aGpData;
sGpData = sGpData.toString();
arr = sGpData.split(" ");
for( i = 0 ; i < arr.length ; i++ )
{
val = RTrim(LTrim(arr[i]));
if( IsAlpha(val) == true )
{
gi_no++;
ho_no = 0;
var aHor = new Array(); // 2차원 배열의 가로 배열
aGpData[gi_no] = aHor;
aGpData[gi_no][ho_no] = val;
sType = val;
}
else if( IsNum(val) == true )
{
ho_no++;
if( ( (sType == "M" || sType == "m") && ho_no == 3) ||
( (sType == "L" || sType == "l") && ho_no == 3) ||
( (sType == "H" || sType == "h") && ho_no == 2) ||
( (sType == "V" || sType == "v") && ho_no == 2) ||
( (sType == "A" || sType == "a") && ho_no == 8) ||
( (sType == "C" || sType == "c") && ho_no == 7) )
{
gi_no++;
ho_no = 0;
var aHor1 = new Array(); // 2차원 배열의 가로 배열
aGpData[gi_no] = aHor1;
aGpData[gi_no][ho_no] = "";
ho_no++;
aGpData[gi_no][ho_no] = parseInt(val);
}
else
{
aGpData[gi_no][ho_no] = parseInt(val);
}
}
}
return aGpData;
}
|