2007年10月28日日曜日

角丸四角形を描画

標準命令で角丸四角形を描くモジュール。
半径が大きすぎた場合は自動で調節するおまけつき。

// 角丸四角形を描画する
#module
#define ctype max%1%2 ) ( %1 )*( %1 > %2 ) + ( %2 )*( %1 <= %2 )
#define ctype min%1%2 ) ( %1 )*( %1 < %2 ) + ( %2 )*( %1 >= %2 )
#const DEFAULT_R 20
/*
    rboxf (左上X座標), (左上Y座標), (右下X座標), (右下Y座標), (角の半径)
*/

#deffunc rboxf int _x1, int _y1, int _x2, int _y2, int _r
    x1 = min(_x1, _x2) : x2 = max(_x1, _x2)
    y1 = min(_y1, _y2) : y2 = max(_y1, _y2)
    box_width = x2 - x1 : box_height = y2 - y1

    if ( _r <= 0 ) {
        r = DEFAULT_R
    } else {
        r = _r
    }
    r = min( r, min( box_width / 2, box_height / 2 ) )

    boxf x1, y1+r, x2, y2-r
    boxf x1+r, y1, x2-r, y2
    repeat 4
        x = x1 + ( cnt \ 2 ) * ( box_width - r * 2 + 1)
        y = y1 + ( cnt / 2 ) * ( box_height - r * 2 + 1 )
        circle x, y, x + r * 2, y + r * 2
    loop
    return
#global
// サンプル
    rboxf 505030030050
    rboxf 600400400300100   // 右下→左上の順で指定してもOK
                                    // 半径が大きすぎる場合は自動で調節する

0 件のコメント: