;---------- ---------- ---------- ---------- ---------- ; 作成者のURL ---> http://www.setsuki.com/ ;---------- ---------- ---------- ---------- ---------- ; ; [ モジュールとマクロの一覧 ] ; ; ( x1,y1 ) -> ( x2,y2 ) の角度を取得 (ラジアン) ; getradian(x1,y1, x2,y2) ; ; ( x1,y1 ) -> ( x2,y2 ) の角度を取得 ; getangle(x1,y1, x2,y2) ; ; 決まった角度(直線になる角度)を取得 ; shiftangle(x1,y1, x2,y2) ; ; 角度が angle 度で、指定値( x1, y1 )から( w, h )離れた位置を取得 ; get_x2(x1, w, angle) ; get_y2(y1, h, angle) ; ;---------- ---------- ---------- ---------- ---------- #define ctype getradian(%1,%2, %3,%4) atan( %4-%2, %3-%1 ) ; x1=%1, y1=%2, x2=%3, y2=%4 #define ctype get_x2(%1,%2,%3) %1 + cos( double(%3)*3.14159265358979323846/180 ) * %2 #define ctype get_y2(%1,%2,%3) %1 + sin( double(%3)*3.14159265358979323846/180 ) * %2 ;---------- ---------- ---------- ---------- ---------- ---------- #module #defcfunc getangle int x1, int y1, int x2, int y2 angle = atan( y2-y1, x2-x1 ) * 180/3.14159265358979323846 if( angle < 0 ): angle += 360 return int( angle ) #defcfunc siftangle int x1, int y1, int x2, int y2 dim shift,8 shift = 180, 225, 270, 315, 0, 45, 90, 135 angle = int( atan( y2-y1, x2-x1 ) * 180/3.14159265358979323846 +202.5 )/ 45 \8 return shift.angle #global ;---------- ---------- ---------- ---------- ---------- ---------- ; サンプル pos 100,100 mes "マウスをクリックしてドラッグしよう!\n" mes "SIFTキーを押すと、直線になるよ。" onclick *click stop *click x1=mousex : y1=mousey *@ x2=mousex : y2=mousey ; シフトキーが押されたら getkey shift, 16 : if( shift ){ ; 角度をラジアンで取得 a = siftangle(x1,y1, x2,y2) ; 直角三角形の2辺の長さを求める x2 = abs(x1-x2) y2 = abs(y1-y2) ; 直角三角形の残りの1辺の長さを求める ; つまり、円の半径を求める c = sqrt(x2*x2+y2*y2) ; 新しい x, y 座標を取得 x2 = get_x2( x1, c, a ) y2 = get_y2( y1, c, a ) } ; ラジアン取得 radian = getradian(x1,y1, x2,y2) ; 角度取得 angle = getangle(x1,y1, x2,y2) title strf("%03d度 ",angle)+radian redraw 0 color 255,255,255 : boxf 0,0,ginfo_winx,ginfo_winy color 0,0,0 : line x1,y1,x2,y2 color 255,0,0 : pset x1,y1 redraw 1 wait 1 getkey mclick, 1 : if( mclick ) : goto *@b stop