とり · @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);
}