silent_ri

とり · @silent_ri

27th Nov 2010 from Twitlonger

Nekopaintで正多角形とか星とかを描くスクリプト。
角数はいくらでも増やせるように作ってある(筈)ので適当に増やしてください。


void draw_pointedstar(int num)
{
np_canvas c = get_active_canvas();

// 原点取得
read_mouse_input(c,"input mouse pos1");
np_point p1 = get_mouse_point(c);

// 半径/角度取得
read_mouse_input(c,"input mouse pos2");
np_point p2 = get_mouse_point(c);

// read_mouse_input(c,"input mouse_pos3");
// np_point p3 = get_mouse_point(c);

// p1とp2から開始角度・半径計算
double x = p2.x - p1.x;
double y = p2.y - p1.y;
double theta1 = atan2( y,x );
double con_pi = acos(-1);
double r = sqrt( x*x + y*y );

// show_script_window();
// puts( theta1 );

double add_th = con_pi*2 / num;
np_point sp = p2;
double nowth = theta1;
np_point nowp;

// 芒星描画
for ( int i = 0; i < num; i++ ){
nowth += add_th*2;
nowp.x = cos( nowth ) * r + p1.x;
nowp.y = sin( nowth ) * r + p1.y;
draw_line( c, sp, nowp );
sp = nowp;
// numが偶数の場合角度をずらす
if( i+1 == num/2 && num%2 == 0 ){
nowth += add_th;
sp.x = cos( nowth ) * r + p1.x;
sp.y = sin( nowth ) * r + p1.y;
}
}
}

void draw_star(int num)
{
np_canvas c = get_active_canvas();

// 原点取得
read_mouse_input(c,"input mouse pos1");
np_point p1 = get_mouse_point(c);

// 外側の半径/角度取得
read_mouse_input(c,"input mouse pos2");
np_point p2 = get_mouse_point(c);

// 内側の半径取得
read_mouse_input(c,"input mouse_pos3");
np_point p3 = get_mouse_point(c);

// p1とp2から開始角度・外側の半径計算
double x = p2.x - p1.x;
double y = p2.y - p1.y;
double theta1 = atan2( y,x );
double con_pi = acos(-1);
double r = sqrt( x*x + y*y );

// p1とp3から内側の半径計算
x = p3.x - p1.x;
y = p3.y - p1.y;
double r2 = sqrt( x*x + y*y );

// show_script_window();
// puts( theta1 );


double add_th = con_pi / num;
np_point sp = p2;
double nowth = theta1;
double nowr;
np_point nowp;

// 星描画
for ( int i = 0; i < num*2; i++ ){
nowth += add_th;
if( i % 2 == 0 ){
nowr = r2;
}
else {
nowr = r;
}
nowp.x = cos( nowth ) * nowr + p1.x;
nowp.y = sin( nowth ) * nowr + p1.y;
draw_line( c, sp, nowp );
sp = nowp;
}
}


void draw_angle(int num)
{
np_canvas c = get_active_canvas();

// 原点取得
read_mouse_input(c,"input mouse pos1");
np_point p1 = get_mouse_point(c);

// 半径/角度取得
read_mouse_input(c,"input mouse pos2");
np_point p2 = get_mouse_point(c);

// read_mouse_input(c,"input mouse_pos3");
// np_point p3 = get_mouse_point(c);

// p1とp2から開始角度・半径計算
double x = p2.x - p1.x;
double y = p2.y - p1.y;
double theta1 = atan2( y,x );
double con_pi = acos(-1);
double r = sqrt( x*x + y*y );

// show_script_window();
// puts( theta1 );

double add_th = con_pi*2 / num;
np_point sp = p2;
double nowth = theta1;
np_point nowp;

// 多角形描画
for ( int i = 0; i < num; i++ ){
nowth += add_th;
nowp.x = cos( nowth ) * r + p1.x;
nowp.y = sin( nowth ) * r + p1.y;
draw_line( c, sp, nowp );
sp = nowp;
}
}



void draw_astar(int num)
{
np_canvas c = get_active_canvas();

// 原点取得
read_mouse_input(c,"input mouse pos1");
np_point p1 = get_mouse_point(c);

// 半径/角度取得
read_mouse_input(c,"input mouse pos2");
np_point p2 = get_mouse_point(c);

// read_mouse_input(c,"input mouse_pos3");
// np_point p3 = get_mouse_point(c);

// p1とp2から開始角度・半径計算
double x = p2.x - p1.x;
double y = p2.y - p1.y;
double theta1 = atan2( y,x );
double con_pi = acos(-1);
double r = sqrt( x*x + y*y );

// show_script_window();
// puts( theta1 );

double add_th = con_pi*2 / num;
double nowth = theta1;
np_point nowp = p2;

// *描画
for ( int i = 0; i < num; i++ ){
draw_line( c, p1, nowp );
nowth += add_th;
nowp.x = cos( nowth ) * r + p1.x;
nowp.y = sin( nowth ) * r + p1.y;
}
}

void draw_star5()
{
draw_star(5);
}
void draw_star6()
{
draw_star(6);
}

void draw_pointedstar5()
{
draw_pointedstar(5);
}
void draw_pointedstar6()
{
draw_pointedstar(6);
}

void draw_angle5()
{
draw_angle(5);
}
void draw_angle6()
{
draw_angle(6);
}


void draw_astar5()
{
draw_astar(5);
}
void draw_astar6()
{
draw_astar(6);
}

Reply · Report Post