/* sprocket様製作「d3module」の一部簡易移植テスト(d3setcam/d3line/d3pset/d3box d3square_b/d3ribbonto_b d3mObject) ネコペから呼び出す関数はtest() ※初回実行時はConversion from double to float, possible loss of precisionという警告が出ます(型変換周り) Special Thanks 【d3module】 S.Programs NET sprocket様(http://sprocket.babyblue.jp/html/index.htm) [user_list.txt] d3mnas_test.nas test #d3m_nas/d3m_test */ void test(){ //------------------------------------------------------ np_image img = get_active_image(); //------------------------------------------------------ //※描画サンプルの数式はd3moduleのサンプルまんま参考にしています set_select_color_HTMLcode(0xffffff); np_cmd(NP_FILL); set_name(get_active_layer(img),"テスト1"); d3mObject d3mData; d3mObject@ d3mData_h = @d3mData; int i; d3setcam(cos(0.01*200)*1500, sin(0.01*200)*1500, 1000, 0, 0, 0, 1.0, d3mData_h); set_select_color_HTMLcode(0xD1BBB5); for(int cnt=0;cnt<31;cnt++){ i=cnt*2000/30-1000; d3line(i,1000,0,i,-1000,0,d3mData_h); d3line(1000,i,0,-1000,i,0,d3mData_h); } set_select_color_HTMLcode(0xFF0000); d3line(2000, 0, 0, -2000, 0, 0, d3mData_h); set_select_color_HTMLcode(0x00FF00); d3line(0, 2000, 0, 0, -2000, 0, d3mData_h); set_select_color_HTMLcode(0x0000FF); d3line(0, 0, 1000, 0, 0, -1000, d3mData_h); set_select_color_HTMLcode(0x000000); double x = cos(0.08)*600, y = sin(0.12)*600, z = sin(0.152)*60; int r = 300; d3box(x-r,y-r,z-r, x+r,y+r,z+r, d3mData_h); //@d3mData_h = null; //------------------------------------------------------ //連続直線 np_cmd(NP_NEW_LAYER); set_select_color_HTMLcode(0xffffff); np_cmd(NP_FILL); set_name(get_active_layer(img),"テスト2"); d3mObject d3mData2; d3mObject@ d3mdata_h2 = @d3mData2; r = 500; int[] objx = {0,r,0,r,r,r,0,-r,0,-r,-r,-r,0,r,0,r,r,r,0,-r,0,-r,-r,-r,0}; int[] objy = {r,r,r,0,r,0,r,r,r,0,r,0,-r,-r,-r,0,-r,0,-r,-r,-r,0,-r,0,r}; int[] objz = {r,0,-r,-r,0,r,r,0,-r,-r,0,r,r,0,-r,-r,0,r,r,0,-r,-r,0,r,r}; d3setcam(cos(0.04*15)*2000,sin(0.04*15)*2000,cos(0.03*15)*1000,0,0,0,1.0, d3mdata_h2); set_select_color_HTMLcode(0x777777); d3line(1000, 0, 0, -1000, 0, 0, d3mdata_h2); d3line(0, 1000, 0, 0, -1000, 0, d3mdata_h2); d3line(0, 0, 1000, 0, 0, -1000, d3mdata_h2); d3initlineto(d3mdata_h2); for(int cnt=0;cnt<25;cnt++){ set_select_color_HTMLcode(HSVtoRGB(cnt*4,100,60)); d3lineto( objx[cnt], objy[cnt], objz[cnt], d3mdata_h2); } //@d3mdata_h2 = null; //------------------------------------------------------ //連続四角面 np_cmd(NP_NEW_LAYER); set_select_color_HTMLcode(0x000000); np_cmd(NP_FILL); set_name(get_active_layer(img),"テスト3"); d3mObject d3mData3; d3mObject@ d3mdata_h3 = @d3mData3; double /*x,y,*/z1,z2; d3initlineto(d3mdata_h3); for(int i=0;i<100;i++){ d3setcam( cos(0.001 * i) * 500, sin(0.001 * i) * 750, cos(0.001 * i) * 1000 ,0,0,0,0.5,d3mdata_h3); x = cos(0.3 * i) * sin(3.14 * i / 100) * 100; y = sin(0.3 * i) * sin(3.14 * i / 100) * 100; z1 = (i-51) * 20; z2 = (i-50) * 20; set_select_color_HTMLcode(HSVtoRGB(i*8%360,80,80)); set_brush_size(i/10+1); d3ribbonto_b(x, y, z1, -x, -y, z2, d3mdata_h3); } //------------------------------------------------------ message_box_ok("終わり"); }//test //〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 //ここからd3m関係 //〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 class d3mObject { //------------------------------------------------------ d3mObject() { can = get_active_canvas(); img = get_active_image(); layer = get_active_layer(this.img); } //------------------------------------------------------ ~d3mObject() { } //------------------------------------------------------ d3mObject(np_canvas can, np_image img, np_layer layer) { this.can = can; this.img = img; this.layer = layer; } //------------------------------------------------------ int width(){return get_width(this.img);} int height(){return get_height(this.img);} //------------------------------------------------------ int wincx(){return get_width(this.img)/2;} int wincy(){return get_height(this.img)/2;} //------------------------------------------------------ void setActive(){set_active_layer(this.img,this.layer);} //------------------------------------------------------ np_canvas can; np_image img; np_layer layer; /* double dx,dy,dz,df,ex,ey,ez,ef; ↑クラスでの変数のみ、こんなふうにまとめて宣言するとコンパイルが通らないようです */ double dx; double dy; double dz; double ex; double ey; double ez; bool df; bool ef; bool af; bool tof; double GSm00; double GSm10; double GSm20; double GSm01; double GSm11; double GSm21; double GSm02; double GSm12; double GSm22; double GSmpx; double GSmpy; double GSmpz; double LGSm00; double LGSm10; double LGSm20; double LGSm01; double LGSm11; double LGSm21; double LGSm02; double LGSm12; double LGSm22; double LGSmpx; double LGSmpy; double LGSmpz; } //〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 //描画系 //d3line ライン描画 (x1, y1, z1, x2, y2, z2, d3mObject@) void d3line(double ppx, double ppy, double ppz, double ssx, double ssy, double ssz, d3mObject@ obj_h){ double ax,ay,az, bx,by,bz, cx,cy,cz, sx,sy; int i = 0; d3vpos(ssx,ssy,ssz,obj_h); d3vpos(ppx,ppy,ppz,obj_h); obj_h.setActive(); //draw_line(obj_h.can, obj_h.dx, obj_h.dy, obj_h.ex, obj_h.ey); //☆ //クリップさせない場合は☆行のコメントアウトを外し、★〜★間をコメントアウト //★↓ if(obj_h.df && obj_h.ef){ draw_line(obj_h.can, obj_h.dx, obj_h.dy, obj_h.ex, obj_h.ey); } else{ if(obj_h.df || obj_h.ef){ if(obj_h.df == true){ sx=obj_h.dx; sy=obj_h.dy; ax=ppx; ay=ppy; az=ppz; bx=ssx; by=ssy; bz=ssz; } else{ sx=obj_h.ex; sy=obj_h.ey; ax=ssx; ay=ssy; az=ssz; bx=ppx; by=ppy; bz=ppz; } for(int i=0;i<10;i++){ cx = (ax+bx)/2; cy = (ay+by)/2; cz = (az+bz)/2; d3trans_e(cx, cy, cz, obj_h); if(obj_h.af == true){ ax=cx; ay=cy; az=cz; draw_line(obj_h.can,sx,sy,obj_h.ex,obj_h.ey); } else{bx=cx; by=cy; bz=cz;} }//for }//if }//else //★↑ } //------------------------------------------------------------------------------ //d3lineto 連続直線描画 (x1, y1, z1, d3mObject@) void d3lineto(double ppx, double ppy, double ppz, d3mObject@ obj_h){ d3vpos(ppx,ppy,ppz,obj_h); if(obj_h.df&&obj_h.ef){ //true obj_h.setActive(); draw_line(obj_h.can, obj_h.dx, obj_h.dy, obj_h.ex, obj_h.ey); //☆ } } //------------------------------------------------------------------------------ //d3line 点描画 (x1, y1, z1, d3mObject@) void d3pset(double ppx, double ppy, double ppz, d3mObject@ obj_h){ d3vpos(ppx,ppy,ppz,obj_h); obj_h.setActive(); draw_line(obj_h.can, obj_h.dx, obj_h.dy, obj_h.dx+1, obj_h.dy+1); //☆ } //------------------------------------------------------------------------------ //d3box ボックスを描画 (x1, y1, z1, x2, y2, z2) void d3box(double v11, double v12, double v13, double v14, double v15, double v16, d3mObject@ obj_h){ obj_h.setActive(); d3line(v11, v12, v13, v11, v12, v16, obj_h); d3line(v11, v12, v16, v11, v15, v16, obj_h); d3line(v11, v15, v16, v11, v15, v13, obj_h); d3line(v11, v15, v13, v11, v12, v13, obj_h); d3line(v14, v12, v13, v14, v15, v13, obj_h); d3line(v14, v15, v13, v14, v15, v16, obj_h); d3line(v14, v15, v16, v14, v12, v16, obj_h); d3line(v14, v12, v16, v14, v12, v13, obj_h); d3line(v11, v12, v13, v14, v12, v13, obj_h); d3line(v11, v12, v16, v14, v12, v16, obj_h); d3line(v11, v15, v16, v14, v15, v16, obj_h); d3line(v11, v15, v13, v14, v15, v13, obj_h); } //------------------------------------------------------------------------------ //d3initlineto d3lineto / d3ribbonto 使用前の初期化 (カレントポジション無効化) void d3initlineto(d3mObject@ obj_h){obj_h.df = false;} //------------------------------------------------------------------------------ //d3square_b 四角平面描画(※塗り潰しはしていません) (x1[], y1[], z1[], x2[], y2[], z2[]) void d3square_b(double[] aryx, double[] aryy, double[] aryz, d3mObject@ obj_h){ double vx,vy,vz; double[] pdx(4), pdy(4); for(int i=0;i<4;i++){ vx = aryx[i]; vy = aryy[i]; vz = aryz[i]; d3trans_d(vx,vy,vz,obj_h); if(obj_h.df==false){break;} //座標変換範囲外 pdx[i] = obj_h.dx; pdy[i] = obj_h.dy; } if(obj_h.df){ //df==true obj_h.setActive(); draw_line( obj_h.can, pdx[0], pdy[0], pdx[1], pdy[1] ); draw_line( obj_h.can, pdx[1], pdy[1], pdx[2], pdy[2] ); draw_line( obj_h.can, pdx[2], pdy[2], pdx[3], pdy[3] ); draw_line( obj_h.can, pdx[3], pdy[3], pdx[0], pdy[0] ); } } //------------------------------------------------------------------------------ //d3ribbonto リボン状に連なる面を連続描画(※塗り潰しはしていません) (x1[], y1[], z1[], x2[], y2[], z2[]) void d3ribbonto_b(double x1, double y1, double z1, double x2, double y2, double z2, d3mObject@ obj_h){ //前回描画位置 double[] pdx = {obj_h.dx,obj_h.ex,0,0}; double[] pdy = {obj_h.dy,obj_h.ey,0,0}; obj_h.tof = (obj_h.ef && obj_h.df); d3vpos(x1, y1, z1, obj_h); d3vpos(x2, y2, z2, obj_h); if( obj_h.tof && obj_h.ef && obj_h.df ) { pdx[2] = obj_h.ex; pdx[3] = obj_h.dx; pdy[2] = obj_h.ey; pdy[3] = obj_h.dy; obj_h.setActive(); draw_line( obj_h.can, pdx[0], pdy[0], pdx[1], pdy[1] ); draw_line( obj_h.can, pdx[1], pdy[1], pdx[2], pdy[2] ); draw_line( obj_h.can, pdx[2], pdy[2], pdx[3], pdy[3] ); draw_line( obj_h.can, pdx[3], pdy[3], pdx[0], pdy[0] ); }//if } //〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 //カメラ //------------------------------------------------------------------------------ //カメラ設定 void d3setcam(double cpx,double cpy,double cpz,double ppx,double ppy,double ppz,double va, d3mObject@ obj_h){ double ppv = va; if(ppv>1.0){ppv=1.0;} if(ppv<0.0){ppv=0.0;} double ax = cpx - ppx, ay = cpy - ppy, az = cpz - ppz; double r0 = sqrt(ax*ax + ay*ay), r1 = sqrt(r0*r0 + az*az); double cos0=0,sin0=0,cos1=0,sin1=0; if(r0!=0){ cos0 = -ax/r0; sin0 = -ay/r0; } if(r1!=0){ cos1 = r0/r1; sin1 = az/r1; } az = ppv / ( 0.01 + obj_h.width() ); obj_h.GSm00 = sin0; obj_h.GSm10 = -cos0; obj_h.GSm20 = 0.0; obj_h.GSm01 = cos0*cos1*az; obj_h.GSm11 = sin0*cos1*az; obj_h.GSm21 = -sin1*az; obj_h.GSm02 = cos0*sin1; obj_h.GSm12 = sin0*sin1; obj_h.GSm22 = cos1; obj_h.GSmpx = -(obj_h.GSm00*cpx + obj_h.GSm10*cpy); obj_h.GSmpy = -(obj_h.GSm01*cpx + obj_h.GSm11*cpy + obj_h.GSm21*cpz); obj_h.GSmpz = -(obj_h.GSm02*cpx + obj_h.GSm12*cpy + obj_h.GSm22*cpz); d3setlocalmx(0,0,0, 1,0,0, 0,1,0, 0,0,1, obj_h); } //〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 //------------------------------------------------------------------------------ //d3trans 座標変換 dxに対して (inx, iny, inz, d3mObject@) void d3trans_d(double inx, double iny, double inz, d3mObject@ obj_h){ obj_h.dz = obj_h.LGSm01*inx + obj_h.LGSm11*iny + obj_h.LGSm21*inz + obj_h.LGSmpy; obj_h.df = false; if(obj_h.dz > 0){ obj_h.dx = obj_h.wincx() + (obj_h.LGSm00*inx + obj_h.LGSm10*iny + obj_h.LGSm20*inz + obj_h.LGSmpx) / obj_h.dz; obj_h.dy = obj_h.wincy() - (obj_h.LGSm02*inx + obj_h.LGSm12*iny + obj_h.LGSm22*inz + obj_h.LGSmpz) / obj_h.dz; //if( (obj_h.dx/8000 | obj_h.dy/8000) == 0){obj_h.df = true;} obj_h.df = ( (obj_h.dx/8000 | obj_h.dy/8000) == 0); } } //d3trans 座標変換 ex,afに対して (inx, iny, inz, d3mObject@) void d3trans_e(double inx, double iny, double inz, d3mObject@ obj_h){ obj_h.ez = obj_h.LGSm01*inx + obj_h.LGSm11*iny + obj_h.LGSm21*inz + obj_h.LGSmpy; obj_h.af = false; if(obj_h.ez > 0){ obj_h.ex = obj_h.wincx() + (obj_h.LGSm00*inx + obj_h.LGSm10*iny + obj_h.LGSm20*inz + obj_h.LGSmpx) / obj_h.ez; obj_h.ey = obj_h.wincy() - (obj_h.LGSm02*inx + obj_h.LGSm12*iny + obj_h.LGSm22*inz + obj_h.LGSmpz) / obj_h.ez; if( (obj_h.ex/8000 | obj_h.ey/8000) == 0){obj_h.af = true;} } } //------------------------------------------------------------------------------ //d3vpos 座標変換 (x, y, z) -> dx, dy, dz, df void d3vpos(double v01, double v02, double v03, d3mObject@ obj_h){ obj_h.ex = obj_h.dx; obj_h.ey = obj_h.dy; obj_h.ef = obj_h.df; d3trans_d(v01, v02, v03, obj_h); } //------------------------------------------------------------------------------ //; d3setlocalmx ローカル座標系設定 平行移動量 + 3x3 変形マトリクス (px, py, pz, m00, m01, m02, m10, m11, m12, m20, m21, m22, 値を渡すd3mdata型obj) void d3setlocalmx(double LGmpx, double LGmpy, double LGmpz, double LGm00, double LGm10, double LGm20, double LGm01, double LGm11, double LGm21, double LGm02, double LGm12, double LGm22, d3mObject@ obj_h){ obj_h.LGSm00 = obj_h.GSm00*LGm00 + obj_h.GSm10*LGm01;// + obj_h.GSm20*LGm02; obj_h.LGSm10 = obj_h.GSm00*LGm10 + obj_h.GSm10*LGm11;// + obj_h.GSm20*LGm12; obj_h.LGSm20 = obj_h.GSm00*LGm20 + obj_h.GSm10*LGm21;// + obj_h.GSm20*LGm22; obj_h.LGSmpx = obj_h.GSm00*LGmpx + obj_h.GSm10*LGmpy + obj_h.GSmpx;// + obj_h.GSm20*LGmpz; obj_h.LGSm01 = obj_h.GSm01*LGm00 + obj_h.GSm11*LGm01 + obj_h.GSm21*LGm02; obj_h.LGSm11 = obj_h.GSm01*LGm10 + obj_h.GSm11*LGm11 + obj_h.GSm21*LGm12; obj_h.LGSm21 = obj_h.GSm01*LGm20 + obj_h.GSm11*LGm21 + obj_h.GSm21*LGm22; obj_h.LGSmpy = obj_h.GSm01*LGmpx + obj_h.GSm11*LGmpy + obj_h.GSm21*LGmpz + obj_h.GSmpy; obj_h.LGSm02 = obj_h.GSm02*LGm00 + obj_h.GSm12*LGm01 + obj_h.GSm22*LGm02; obj_h.LGSm12 = obj_h.GSm02*LGm10 + obj_h.GSm12*LGm11 + obj_h.GSm22*LGm12; obj_h.LGSm22 = obj_h.GSm02*LGm20 + obj_h.GSm12*LGm21 + obj_h.GSm22*LGm22; obj_h.LGSmpz = obj_h.GSm02*LGmpx + obj_h.GSm12*LGmpy + obj_h.GSm22*LGmpz + obj_h.GSmpz; } //〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 //ここからはd3mModuleとは無関係 //------------------------------------------------------------------------------ //H,S,V=>0xRRGGBB int HSVtoRGB(int hi, int si, int vi){ int r=0,g=0,b=0,h=hi%360,i; double r1,g1,b1; double s=double(si)/100,v=double(vi)/100,f; if(s < 0 || s > 1 || v < 0 || v > 1){return 0;} if(s == 0){return (floor(vi)|floor(vi<<8)|floor(vi<<16));} i = int(floor(double(h)/60)%6); f = (double(h)/60)-double(i); double m=v*(1.0f-s), n=v*(1.0f-s*f), k=v*(1.0f-s*(1.0f-f)); switch( int(i) ){ case 0: r1=v; g1=k; b1=m; break; case 1: r1=n; g1=v; b1=m; break; case 2: r1=m; g1=v; b1=k; break; case 3: r1=m; g1=n; b1=v; break; case 4: r1=k; g1=m; b1=v; break; case 5: r1=v; g1=m; b1=n; break; } r=(r1*100*255/100); g=(g1*100*255/100); b=(b1*100*255/100); return (floor(r)|floor(g<<8)|floor(b<<16)); } //------------------------------------------------------------------------------ //0xRRGGBB形式の数値を描画色に指定(BBGGRRじゃないのは都合) void set_select_color_HTMLcode(int i){ set_select_color( (i&0xFF0000)/0x10000,(i&0x00FF00)/0x100,i&0x0000FF); } //------------------------------------------------------------------------------ //R,G,B -> 0xRRGGBB int RGB16(int r,int g,int b){ return (r|g<<8|b<<16); } //〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 //10.10.17