Page 1503 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼曲線上に等間隔の点 初心者ちゃん 21/7/23(金) 15:14 ┣Re:曲線上に等間隔の点 N.Misumi 21/7/23(金) 17:08 ┃ ┗Re:曲線上に等間隔の点 初心者ちゃん 21/7/24(土) 17:57 ┣Re:曲線上に等間隔の点 通りすがりの後期高齢者 21/7/24(土) 15:37 ┃ ┗Re:曲線上に等間隔の点 Keiichi 21/7/24(土) 17:45 ┃ ┗Re:曲線上に等間隔の点 通りすがりの後期高齢者 21/7/24(土) 18:42 ┗その1 kojima 21/8/1(日) 0:30 ┣続き kojima 21/8/1(日) 0:31 ┣Re:外変 R.N 21/8/1(日) 10:10 ┃ ┗Re:外変 kojima 21/8/1(日) 10:21 ┃ ┗Re:外変 R.N 21/8/1(日) 10:29 ┗Re:外変(確認依頼) R.N 21/8/3(火) 19:09 ┣[投稿者削除] ┗Re:外変(確認依頼) kojima 21/8/3(火) 23:13 ┣続き kojima 21/8/4(水) 0:35 ┃ ┗続々 kojima 21/8/4(水) 0:36 ┗Re:外変(確認依頼) R.N 21/8/6(金) 5:25 ─────────────────────────────────────── ■題名 : 曲線上に等間隔の点 ■名前 : 初心者ちゃん ■日付 : 21/7/23(金) 15:14 -------------------------------------------------------------------------
こんにちは。jwcab初心者です。 スプライン曲線やベジェ曲線上に等間隔で点をつけることは可能でしょうか。 楕円を曲線ツールで作成し、6mm間隔で点を入れたいと思っております。 (円の扁平率設定で描けるきれいな楕円ではありません) 分割ツールで試してみましたがうまくいかず。。 どなたかお分かりでしたらご教示いただけますと幸いです。 |
▼初心者ちゃんさん: >こんにちは。jwcab初心者です。 >スプライン曲線やベジェ曲線上に等間隔で点をつけることは可能でしょうか。 >楕円を曲線ツールで作成し、6mm間隔で点を入れたいと思っております。 >(円の扁平率設定で描けるきれいな楕円ではありません) > >分割ツールで試してみましたがうまくいかず。。 >どなたかお分かりでしたらご教示いただけますと幸いです。 こちらで可能だと思います。 外部変形−円弧直線連続線分割 07 ( VisualBasic6.0ランタイムの動作する環境 ) http://siegel.cocolog-nifty.com/siegels_blog/2011/02/07-2b86.html Visual Basic 6.0 SP6 ランタイムファイル https://www.vector.co.jp/soft/dl/win95/util/se342080.html |
▼N.Misumiさん: >こちらで可能だと思います。 > >外部変形−円弧直線連続線分割 07 >( VisualBasic6.0ランタイムの動作する環境 ) >http://siegel.cocolog-nifty.com/siegels_blog/2011/02/07-2b86.html > >Visual Basic 6.0 SP6 ランタイムファイル >https://www.vector.co.jp/soft/dl/win95/util/se342080.html こちらの外部変形で思い通りに分割することができました。 ご回答いただきありがとうございます! |
▼初心者ちゃんさん: >こんにちは。jwcab初心者です。 >スプライン曲線やベジェ曲線上に等間隔で点をつけることは可能でしょうか。 >楕円を曲線ツールで作成し、6mm間隔で点を入れたいと思っております。 >(円の扁平率設定で描けるきれいな楕円ではありません) > >分割ツールで試してみましたがうまくいかず。。 >どなたかお分かりでしたらご教示いただけますと幸いです。 こんにちは。 ※円弧を含まない開放連続線の場合 Jw_cad[分割]コマンド可能です。 分割、割付方法を設定 Shift+Ctrlで始点をクリック(R) 終点指示(R)終了または次点指示で継続〜 ※円弧を含む開放連続線の場合の例 N.Misumiさん紹介の"円弧直線連続線分割07" ※任意の分割、割付方法による円弧を含む 開放図形及び閉鎖図形については 私の知る限り公開されていないようです。 私も昔、挑戦してみましたが円弧を含む 閉鎖図形の場合が分割方式によっては上手く いかず頓挫した覚えがあります。 |
▼通りすがりの後期高齢者さん: >※円弧を含まない開放連続線の場合 >Jw_cad[分割]コマンド可能です。 > >分割、割付方法を設定 >Shift+Ctrlで始点をクリック(R) >終点指示(R)終了または次点指示で継続〜 ヘルプファイルより ・[Shift]キーを押しながら右クリック(R)で連続線を指示すると、その連続線の端点が連続点なる。 Ctrlキーは要らないのでは? |
▼Keiichiさん: >▼通りすがりの後期高齢者さん: >>※円弧を含まない開放連続線の場合 >>Jw_cad[分割]コマンド可能です。 >> >>分割、割付方法を設定 >>Shift+Ctrlで始点をクリック(R) >>終点指示(R)終了または次点指示で継続〜 > >ヘルプファイルより >・[Shift]キーを押しながら右クリック(R)で連続線を指示すると、その連続線の端点が連続点なる。 > >Ctrlキーは要らないのでは? ご指摘の通りでした。 |
@REM 連続線(円弧含)上に等間隔で実点を描く @echo off REM #jww REM #cd goto %1 REM #hm|距離指定(L)|分割数指定(R)| REM #:1 REM #h1 REM #1連続線の始点を順に右クリックしてください REM #99# REM #c間隔 無指定:200/_/a REM #k|1)線端起点(L)|2)両端均等(R)|/_/b REM #hp REM #e REM #:2 REM #h1 REM #1連続線の始点を順に右クリックしてください REM #99# REM #c分割数 無指定:10/_/c REM #hp REM #e :1 copy jwc_temp.txt temp.txt > nul ruby -x %~f0 temp.txt %1 %2 %3> jwc_temp.txt pause goto end :2 copy jwc_temp.txt temp.txt > nul ruby -x %~f0 temp.txt %1 %2> jwc_temp.txt pause goto end #!ruby -Ks include Math #楕円弧の始点座標を返す def daenko_siten(zahyo) if zahyo.size==7 x=zahyo[0] y=zahyo[1] r=zahyo[2] siten=zahyo[3] hen=zahyo[5] ziku=zahyo[6] rajian=siten*PI/180 ziku_arg=ziku*PI/180 zahyo_x=r*cos(rajian) zahyo_y=r*sin(rajian)*hen zahyo_xy=hypot(zahyo_y,zahyo_x) zahyo_arg=atan2(zahyo_y,zahyo_x) zahyo_xt=x+zahyo_xy*cos(zahyo_arg+ziku_arg) zahyo_yt=y+zahyo_xy*sin(zahyo_arg+ziku_arg) return zahyo_xt,zahyo_yt end end #楕円弧の終点座標を返す def daenko_syuten(zahyo) if zahyo.size==7 x=zahyo[0] y=zahyo[1] r=zahyo[2] syuten=zahyo[4] hen=zahyo[5] ziku=zahyo[6] rajian=syuten*PI/180 ziku_arg=ziku*PI/180 zahyo_x=r*cos(rajian) zahyo_y=r*sin(rajian)*hen zahyo_xy=hypot(zahyo_y,zahyo_x) zahyo_arg=atan2(zahyo_y,zahyo_x) zahyo_xt=x+zahyo_xy*cos(zahyo_arg+ziku_arg) zahyo_yt=y+zahyo_xy*sin(zahyo_arg+ziku_arg) return zahyo_xt,zahyo_yt end end #線の配列senから閉鎖図形・連続線を区分けする def loop_renzoku_seach(sen,ten) cl=1;flg=0;i=0 x=ten[0];y=ten[1] 0.upto(sen.size-1){|i| if (sen[i][0]-x).abs<cl && (sen[i][1]-y).abs<cl or (sen[i][2]-x).abs<cl && (sen[i][3]-y).abs<cl flg=1;break; end } if flg==1 b=sen[i];sen.delete(sen[i]) end if(b[2]-x).abs<cl && (b[3]-y).abs<cl if b.size==4 a=[b[2],b[3],b[0],b[1]] else a=[b[2],b[3],b[0],b[1],b[4],b[5],b[6],b[7],b[8],b[9],b[10]] end else if b.size==4 a=[b[0],b[1],b[2],b[3]] else a=[b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9],b[10]] end end renzoku=[a];flg=1 while flg==1 flg=0 0.upto(sen.size-1){|i| if (sen[i][0]-a[2]).abs<cl && (sen[i][1]-a[3]).abs<cl or (sen[i][2]-a[2]).abs<cl && (sen[i][3]-a[3]).abs<cl flg=1;break; end } if flg==1 b=sen[i];size=renzoku.size if (renzoku[size-1][2]-b[0]).abs<cl && (renzoku[size-1][3]-b[1]).abs<cl if b.size==4 a=[b[0],b[1],b[2],b[3]]#線データ else a=[b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]#円弧データ end elsif (renzoku[size-1][2]-b[2]).abs<cl && (renzoku[size-1][3]-b[3]).abs<cl if b.size==4 a=[b[2],b[3],b[0],b[1]]#線データ else a=[b[2],b[3],b[0],b[1],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]#円弧データ end end renzoku<<a sen.delete(sen[i]) end end return renzoku end #線上に間隔pitchで実点を描く def ln_ten_draw(item,pitch,yo_tyo) x1=item[0];y1=item[1]; l=sqrt((item[3]-item[1])*(item[3]-item[1])+(item[2]-item[0])*(item[2]-item[0])) arg=atan2(item[3]-item[1],item[2]-item[0]) l2=pitch-yo_tyo if l2<=l printf("pt %.11f %.11f\n",x1+l2*cos(arg),y1+l2*sin(arg)) if l2<l n=((l+yo_tyo)/pitch).to_i yo_tyo=(l+yo_tyo)-pitch*n 0.upto(n-2){|i| l2 += pitch printf("pt %.11f %.11f\n",x1+l2*cos(arg),y1+l2*sin(arg)) } elsif l2==l yo_tyo=0 end else yo_tyo += l end return yo_tyo end #円弧上に間隔pitchで実点を描く def arc_ten_draw(item,pitch,yo_tyo) cl=1 x1=item[0];y1=item[1];x2=item[2];y2=item[3] r_x=item[4];r_y=item[5];r=item[6];sikaku=item[7];syukaku=item[8] arg=(syukaku-sikaku)*PI/180 l=r*arg l2=pitch-yo_tyo d_arg=l2/r zahyo=[] 4.upto(item.size-1){|i|zahyo<<item[i]} ten=daenko_siten(zahyo) x=ten[0];y=ten[1]; if (x-x1).abs<cl && (y-y1).abs<cl #円弧の始角が連続線の始点 if l2<=l pt_x=r_x+r*cos(sikaku*PI/180+d_arg) pt_y=r_y+r*sin(sikaku*PI/180+d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) n=((l+yo_tyo)/pitch).to_i yo_tyo=(l+yo_tyo)-pitch*n 0.upto(n-2){|i| l2 += pitch d_arg=l2/r pt_x=r_x+r*cos(sikaku*PI/180+d_arg) pt_y=r_y+r*sin(sikaku*PI/180+d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) } elsif l2==l pt_x=r_x+r*cos(sikaku*PI/180+d_arg) pt_y=r_y+r*sin(sikaku*PI/180+d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) yo_tyo=0 else yo_tyo += l end else #円弧の終角が連続線の始点 if l2<l pt_x=r_x+r*cos(syukaku*PI/180-d_arg) pt_y=r_y+r*sin(syukaku*PI/180-d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) n=((l+yo_tyo)/pitch).to_i yo_tyo=(l+yo_tyo)-pitch*n 0.upto(n-2){|i| l2 += pitch d_arg=l2/r pt_x=r_x+r*cos(syukaku*PI/180-d_arg) pt_y=r_y+r*sin(syukaku*PI/180-d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) } elsif l2==l pt_x=r_x+r*cos(syukaku*PI/180-d_arg) pt_y=r_y+r*sin(syukaku*PI/180-d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) yo_tyo=0 else yo_tyo += l end end return yo_tyo end |
#楕円弧上に間隔pitchで実点を描く def arc_ten_draw2(item,pitch,yo_tyo) cl=1 x1=item[0];y1=item[1];x2=item[2];y2=item[3] r_x=item[4];r_y=item[5];r=item[6];sikaku=item[7];syukaku=item[8] ziku_arg=item[10]*PI/180 xy=[0] 0.upto(item.size-1){|i|xy<<item[i]} sen_a=[];bunkaku=1 daen_rensen_array(sen_a,xy,bunkaku) if (x1-sen_a[0][0]).abs<cl && (y1-sen_a[0][1]).abs<cl else sen_a.reverse! 0.upto(sen_a.size-1){|i| x1=sen_a[i][0] y1=sen_a[i][1] x2=sen_a[i][2] y2=sen_a[i][3] sen_a[i][0]=x2 sen_a[i][1]=y2 sen_a[i][2]=x1 sen_a[i][3]=y1 } end 0.upto(sen_a.size-1){|i| x1=sen_a[i][0]; y1=sen_a[i][1]; l=hypot(sen_a[i][3]-sen_a[i][1],sen_a[i][2]-sen_a[i][0]) argatan2(sen_a[i][3]-sen_a[i][1],sen_a[i][2]-sen_a[i][0]) l2=pitch-yo_tyo if l2<=l x3=x1+l2*cos(arg);y3=y1+l2*sin(arg) arg2=atan2(y3-r_y,x3-r_x) rx=r*cos(arg2-ziku_arg); ry=r*sin(arg2-ziku_arg)/item[9] arg3=atan2(ry,rx) rx=r*cos(arg3);ry=r*sin(arg3)*item[9] rl=hypot(ry,rx) x4=r_x+rl*cos(arg2);y4=r_y+rl*sin(arg2) printf("pt %.11f %.11f\n" ,x4,y4) if l2<l n=((l+yo_tyo)/pitch).to_i yo_tyo=(l+yo_tyo)-pitch*n 0.upto(n-2){|i2| l2 += pitch x3=x1+l2*cos(arg);y3=y1+l2*sin(arg) arg2=atan2(y3-r_y,x3-r_x) rx=r*cos(arg2-ziku_arg);ry=r*sin(arg2-ziku_arg)/item[9] arg3=atan2(ry,rx) rx=r*cos(arg3);ry=r*sin(arg3)*item[9] rl=hypot(ry,rx) x4=r_x+rl*cos(arg2);y4=r_y+rl*sin(arg2) printf("pt %.11f %.11f\n" ,x4,y4) } elsif l2==l yo_tyo=0 end else yo_tyo += l end } return yo_tyo end #連続線上に間隔pitchで実点を描く def rensen_ten_draw(rensen,pitch,yo_tyo) 0.upto(rensen.size-1){|i| if rensen[i].size==4#線データ yo_tyo=ln_ten_draw(rensen[i],pitch,yo_tyo) else#円弧データ if rensen[i][9]==1 yo_tyo=arc_ten_draw(rensen[i],pitch,yo_tyo) else yo_tyo=arc_ten_draw2(rensen[i],pitch,yo_tyo) end end } end #楕円弧を連続線に変更してsen_aに格納する def daen_rensen_array(sen_a,xy,bunkaku) cl=1 ten=daenko_siten(xy[1..-1]);x1=ten[0];y1=ten[1]; ten=daenko_syuten(xy[1..-1]);x2=ten[0];y2=ten[1]; x=xy[1];y=xy[2];r=xy[3];sikaku=xy[4];syukaku=xy[5];hen=xy[6];ziku=xy[7] enko_kaku=syukaku-sikaku n=(enko_kaku/bunkaku).to_i if n==0 sen_a<<[x1,y1,x2,y2] return 1 end s_arg=sikaku*PI/180 ziku_arg=ziku*PI/180 bun_arg=bunkaku*PI/180 x2_2=0;y2_2=0 0.upto(n-2){|i| rx=r*cos(s_arg) ry=r*sin(s_arg)*hen l=hypot(ry,rx) arg=atan2(ry,rx) x1_2=x+l*cos(arg+ziku_arg) y1_2=y+l*sin(arg+ziku_arg) rx=r*cos(s_arg+bun_arg) ry=r*sin(s_arg+bun_arg)*hen l=hypot(ry,rx) arg=atan2(ry,rx) x2_2=x+l*cos(arg+ziku_arg) y2_2=y+l*sin(arg+ziku_arg) sen_a<<[x1_2,y1_2,x2_2,y2_2] s_arg += bun_arg } if (x2-x2_2).abs<cl && (y2-y2_2).abs<cl else sen_a<<[x2_2,y2_2,x2,y2] end return 0 end #連続線の総延長を返す def rensen_total_l(rensen) t_l=0 0.upto(rensen.size-1){|i| if rensen[i].size==4#線データ l=hypot(rensen[i][3]-rensen[i][1],rensen[i][2]-rensen[i][0]) else if rensen[i][9]==1 r=rensen[i][6] arg=(rensen[i][8]-rensen[i][7])*PI/180 l=r*arg else sen_a=[];bunkaku=1 daen_rensen_array(sen_a,xy,bunkaku) l=0 0.upto(sen_a.size-1){|i2| l += hypot(sen_a[i2][3]-sen_a[i2][1],sen_a[i2][2]-sen_a[i2][0]) } end end t_l += l } return t_l end #コマンドライン引数 pitch=200;nn=10 sitei=ARGV[1].to_i while ARGV.size>1 case argument=ARGV.pop when /\/a/ pitch=argument[2..-1].to_f when /\/b/ kiten=argument[2..-1].to_i when /\/c/ nn=argument[2..-1].to_i end end #メインルーチン sen_a=[];hp_a=[] while ARGF.gets xy=$_.split if xy[0]=~/^hp/ hp_a<<[xy[1].to_f,xy[2].to_f] end if xy[0]=~/^\d|^-/ xy.collect!{|item|item.to_f} sen_a<<xy end if xy[0]=~/^ci/ xy.collect!{|item|item.to_f} if xy.size==8 if(xy[4]>xy[5]) xy[4] -= 360 end zahyo=xy[1..-1] ten=daenko_siten(zahyo); x1=ten[0];y1=ten[1]; ten=daenko_syuten(zahyo); x2=ten[0];y2=ten[1]; if(xy[7] != 0 && xy[6]==1) xy[4] += xy[7] xy[5] += xy[7] xy[7]=0 end sen_a<<[x1,y1,x2,y2,xy[1],xy[2],xy[3],xy[4],xy[5],xy[6],xy[7]] end end end 0.upto(hp_a.size-1){|i| ten=hp_a[i] rensen=loop_renzoku_seach(sen_a,ten) if rensen.size>0 t_l=rensen_total_l(rensen) if sitei==1 if kiten==2 n=(t_l/pitch).to_i l2=pitch-((t_l-n*pitch)+pitch)/2 yo_tyo=l2 else yo_tyo=0 end else pitch=t_l/nn yo_tyo=0 end rensen_ten_draw(rensen,pitch,yo_tyo) end } __END__ :end |
▼kojimaさん:こんにちは、 外変提供して頂き、感謝です。☆⌒(*^∇゜)v !! batファイル名を、"連続線(円弧含)上に等間隔で実点を描く.bat" とすると、 エラーは出ないのですが、実行できず終了。 フォルダー名を、"連続線(円弧含)上に等間隔で実点を描く" にすると、 同じく、実行できず終了。 ()記号を取り除くと、問題なく動作します。 kojimaさんの環境では、問題なく実行できる、ということでは、 私の環境の問題かも知れませんが--- (Windows 10 Home(21H1)19043.1151、Ruby1.8.7-p374) ありがとうございます。 |
▼R.Nさん: >▼kojimaさん:こんにちは、 > >外変提供して頂き、感謝です。☆⌒(*^∇゜)v !! > >batファイル名を、"連続線(円弧含)上に等間隔で実点を描く.bat" とすると、 >エラーは出ないのですが、実行できず終了。 > >フォルダー名を、"連続線(円弧含)上に等間隔で実点を描く" にすると、 >同じく、実行できず終了。 > >()記号を取り除くと、問題なく動作します。 >kojimaさんの環境では、問題なく実行できる、ということでは、 >私の環境の問題かも知れませんが--- >(Windows 10 Home(21H1)19043.1151、Ruby1.8.7-p374) > >ありがとうございます。 @REM 連続線(円弧含)上に等間隔で実点を描く は、外変選択画面のメモ欄に表示される文字です。 batファイル名ではありません。 ファイル名は、適当に付けてください。 (batファイル名で()や半角スペースは、区切り文字になってしまいます。) |
▼kojimaさん: レス、ありがとうございます。 理解していましたが、 使用される方の参考として--- すみません。 |
▼kojimaさん: こんにちは、 たびたび、すみません。 楕円弧をひとつ描いて実行すると、下記エラーが--- (確認、お願いします) 連続線実点分割.bat:343:in `rensen_total_l’: undefined local variable or method `xy’for main:Object (NameError) from 連続線実点分割.bat:333:in `upto’ from 連続線実点分割.bat:333:in `rensen_total_l’ from 連続線実点分割.bat:402 from 連続線実点分割.bat:398:in `upto’ from 連続線実点分割.bat:398 |
この書き込みは投稿者によって削除されました。(21/8/3(火) 23:06) |
楕円・楕円弧は誤差を含みます。 拡大すると実点は楕円上からズレています。 楕円・楕円弧については、標準機能で作図したほうが正確です。 @REM 連続線・閉鎖連続線(円弧含)上に等間隔で実点を描く @echo off goto %1 REM #jww REM #cd REM #hm|距離指定(L)|分割数指定(R)| REM #:1 REM #h1 REM #1連続線の始点を順に右クリックしてください REM #99# REM #c間隔 無指定:200/_/a REM #k|1)線端起点(L)|2)両端均等(R)|指定間隔以下|/_/b REM #k閉鎖図形の時の作図方向|1)時計廻(L)|2)反時計廻(R)|/_/c REM #hp REM #e REM #:2 REM #h1 REM #1連続線の始点を順に右クリックしてください REM #99# REM #c分割数 無指定:10/_/d REM #hp REM #e :1 copy jwc_temp.txt temp.txt > nul ruby -x %~f0 temp.txt %1 %2 %3 %4> jwc_temp.txt pause goto end :2 copy jwc_temp.txt temp.txt > nul ruby -x %~f0 temp.txt %1 %2> jwc_temp.txt pause goto end #!ruby -Ks include Math #楕円弧の始点座標を返す def daenko_siten(zahyo) if zahyo.size==7 x=zahyo[0] y=zahyo[1] r=zahyo[2] siten=zahyo[3] hen=zahyo[5] ziku=zahyo[6] rajian=siten*PI/180 ziku_arg=ziku*PI/180 zahyo_x=r*cos(rajian) zahyo_y=r*sin(rajian)*hen zahyo_xy=hypot(zahyo_y,zahyo_x) zahyo_arg=atan2(zahyo_y,zahyo_x) zahyo_xt=x+zahyo_xy*cos(zahyo_arg+ziku_arg) zahyo_yt=y+zahyo_xy*sin(zahyo_arg+ziku_arg) return zahyo_xt,zahyo_yt end end #楕円弧の終点座標を返す def daenko_syuten(zahyo) if zahyo.size==7 x=zahyo[0] y=zahyo[1] r=zahyo[2] syuten=zahyo[4] hen=zahyo[5] ziku=zahyo[6] rajian=syuten*PI/180 ziku_arg=ziku*PI/180 zahyo_x=r*cos(rajian) zahyo_y=r*sin(rajian)*hen zahyo_xy=hypot(zahyo_y,zahyo_x) zahyo_arg=atan2(zahyo_y,zahyo_x) zahyo_xt=x+zahyo_xy*cos(zahyo_arg+ziku_arg) zahyo_yt=y+zahyo_xy*sin(zahyo_arg+ziku_arg) return zahyo_xt,zahyo_yt end end #線の配列senから閉鎖図形・連続線を区分けする def loop_renzoku_seach(sen,ten) cl=1;flg=0;i=0 x=ten[0];y=ten[1] 0.upto(sen.size-1){|i| if (sen[i][0]-x).abs<cl && (sen[i][1]-y).abs<cl or (sen[i][2]-x).abs<cl && (sen[i][3]-y).abs<cl flg=1;break; end } if flg==1 b=sen[i];sen.delete(sen[i]) end if(b[2]-x).abs<cl && (b[3]-y).abs<cl if b.size==4 a=[b[2],b[3],b[0],b[1]] else a=[b[2],b[3],b[0],b[1],b[4],b[5],b[6],b[7],b[8],b[9],b[10]] end else if b.size==4 a=[b[0],b[1],b[2],b[3]] else a=[b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9],b[10]] end end renzoku=[a];flg=1 while flg==1 flg=0 0.upto(sen.size-1){|i| if (sen[i][0]-a[2]).abs<cl && (sen[i][1]-a[3]).abs<cl or (sen[i][2]-a[2]).abs<cl && (sen[i][3]-a[3]).abs<cl flg=1;break; end } if flg==1 b=sen[i];size=renzoku.size if (renzoku[size-1][2]-b[0]).abs<cl && (renzoku[size-1][3]-b[1]).abs<cl if b.size==4 a=[b[0],b[1],b[2],b[3]]#線データ else a=[b[0],b[1],b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]#円弧データ end elsif (renzoku[size-1][2]-b[2]).abs<cl && (renzoku[size-1][3]-b[3]).abs<cl if b.size==4 a=[b[2],b[3],b[0],b[1]]#線データ else a=[b[2],b[3],b[0],b[1],b[4],b[5],b[6],b[7],b[8],b[9],b[10]]#円弧データ end end renzoku<<a sen.delete(sen[i]) end end dx=(renzoku[0][0]-renzoku[-1][2]).abs dy=(renzoku[0][1]-renzoku[-1][3]).abs if dx<cl && dy<cl return 1,renzoku else return 0,renzoku end #return renzoku end #連続線を点の配列にする def rensen_point_array(rensen) array=[[rensen[0][0],rensen[0][1]],[rensen[0][2],rensen[0][3]]] rensen[1..-1].each{|item|array<<[item[2],item[3]]} return array.uniq end #座標面積を返す def zahyo_s(array) s=0 0.upto(array.size-1){|i| if i==0 x1=array[-1][0] else x1=array[i-1][0] end if i==array.size-1 x2=array[0][0] else x2=array[i+1][0] end s += (x2-x1)*array[i][1] } return s end #線上に間隔pitchで実点を描く def ln_ten_draw(item,pitch,yo_tyo) x1=item[0];y1=item[1]; l=sqrt((item[3]-item[1])*(item[3]-item[1])+(item[2]-item[0])*(item[2]-item[0])) arg=atan2(item[3]-item[1],item[2]-item[0]) l2=pitch-yo_tyo if l2<=l printf("pt %.11f %.11f\n",x1+l2*cos(arg),y1+l2*sin(arg)) if l2<l n=((l+yo_tyo)/pitch).to_i yo_tyo=(l+yo_tyo)-pitch*n 0.upto(n-2){|i| l2 += pitch printf("pt %.11f %.11f\n",x1+l2*cos(arg),y1+l2*sin(arg)) } elsif l2==l yo_tyo=0 end else yo_tyo += l end return yo_tyo end |
#円弧上に間隔pitchで実点を描く def arc_ten_draw(item,pitch,yo_tyo) cl=1 x1=item[0];y1=item[1];x2=item[2];y2=item[3] r_x=item[4];r_y=item[5];r=item[6];sikaku=item[7];syukaku=item[8] arg=(syukaku-sikaku)*PI/180 l=r*arg l2=pitch-yo_tyo d_arg=l2/r zahyo=[] 4.upto(item.size-1){|i|zahyo<<item[i]} ten=daenko_siten(zahyo) x=ten[0];y=ten[1]; if (x-x1).abs<cl && (y-y1).abs<cl #円弧の始角が連続線の始点 if l2<=l pt_x=r_x+r*cos(sikaku*PI/180+d_arg) pt_y=r_y+r*sin(sikaku*PI/180+d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) n=((l+yo_tyo)/pitch).to_i yo_tyo=(l+yo_tyo)-pitch*n 0.upto(n-2){|i| l2 += pitch d_arg=l2/r pt_x=r_x+r*cos(sikaku*PI/180+d_arg) pt_y=r_y+r*sin(sikaku*PI/180+d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) } elsif l2==l pt_x=r_x+r*cos(sikaku*PI/180+d_arg) pt_y=r_y+r*sin(sikaku*PI/180+d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) yo_tyo=0 else yo_tyo += l end else #円弧の終角が連続線の始点 if l2<l pt_x=r_x+r*cos(syukaku*PI/180-d_arg) pt_y=r_y+r*sin(syukaku*PI/180-d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) n=((l+yo_tyo)/pitch).to_i yo_tyo=(l+yo_tyo)-pitch*n 0.upto(n-2){|i| l2 += pitch d_arg=l2/r pt_x=r_x+r*cos(syukaku*PI/180-d_arg) pt_y=r_y+r*sin(syukaku*PI/180-d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) } elsif l2==l pt_x=r_x+r*cos(syukaku*PI/180-d_arg) pt_y=r_y+r*sin(syukaku*PI/180-d_arg) printf("pt %.11f %.11f\n",pt_x,pt_y) yo_tyo=0 else yo_tyo += l end end return yo_tyo end #楕円弧上に間隔pitchで実点を描く def arc_ten_draw2(item,pitch,yo_tyo) cl=1 x1=item[0];y1=item[1];x2=item[2];y2=item[3] r_x=item[4];r_y=item[5];r=item[6];sikaku=item[7];syukaku=item[8] ziku_arg=item[10]*PI/180 xy=[0] for i in 4..item.size-1 xy<<item[i] end sen_a=[];bunkaku=1 daen_rensen_array(sen_a,xy,bunkaku) if((x1-sen_a[0][0]).abs<cl && (y1-sen_a[0][1]).abs<cl) else sen_a.reverse! for i in 0..sen_a.size-1 x1=sen_a[i][0] y1=sen_a[i][1] x2=sen_a[i][2] y2=sen_a[i][3] sen_a[i][0]=x2 sen_a[i][1]=y2 sen_a[i][2]=x1 sen_a[i][3]=y1 end end for i in 0..sen_a.size-1 x1=sen_a[i][0]; y1=sen_a[i][1]; l=hypot(sen_a[i][3]-sen_a[i][1],sen_a[i][2]-sen_a[i][0]) arg=atan2(sen_a[i][3]-sen_a[i][1],sen_a[i][2]-sen_a[i][0]) l2=pitch-yo_tyo if l2<=l x3=x1+l2*cos(arg);y3=y1+l2*sin(arg) arg2=atan2(y3-r_y,x3-r_x) rx=r*cos(arg2-ziku_arg); ry=r*sin(arg2-ziku_arg)/item[9] arg3=atan2(ry,rx) rx=r*cos(arg3);ry=r*sin(arg3)*item[9] rl=hypot(ry,rx) x4=r_x+rl*cos(arg2);y4=r_y+rl*sin(arg2) printf("pt %.11f %.11f\n",x4,y4) if l2<l n=((l+yo_tyo)/pitch).to_i yo_tyo=(l+yo_tyo)-pitch*n for i2 in 0..n-2 l2 += pitch x3=x1+l2*cos(arg);y3=y1+l2*sin(arg) arg2=atan2(y3-r_y,x3-r_x) rx=r*cos(arg2-ziku_arg);ry=r*sin(arg2-ziku_arg)/item[9] arg3=atan2(ry,rx) rx=r*cos(arg3);ry=r*sin(arg3)*item[9] rl=hypot(ry,rx) x4=r_x+rl*cos(arg2);y4=r_y+rl*sin(arg2) printf("pt %.11f %.11f\n",x4,y4) end elsif l2==l yo_tyo=0 end else yo_tyo += l end end return yo_tyo end #連続線上に間隔pitchで実点を描く def rensen_ten_draw(rensen,pitch,yo_tyo) 0.upto(rensen.size-1){|i| if rensen[i].size==4#線データ yo_tyo=ln_ten_draw(rensen[i],pitch,yo_tyo) else#円弧データ if rensen[i][9]==1 yo_tyo=arc_ten_draw(rensen[i],pitch,yo_tyo) else yo_tyo=arc_ten_draw2(rensen[i],pitch,yo_tyo) end end } end #楕円弧を連続線に変更してsen_aに格納する def daen_rensen_array(sen_a,xy,bunkaku) cl=1 ten=daenko_siten(xy[1..-1]);x1=ten[0];y1=ten[1]; ten=daenko_syuten(xy[1..-1]);x2=ten[0];y2=ten[1]; x=xy[1];y=xy[2];r=xy[3];sikaku=xy[4];syukaku=xy[5];hen=xy[6];ziku=xy[7] enko_kaku=syukaku-sikaku n=(enko_kaku/bunkaku).to_i if n==0 sen_a<<[x1,y1,x2,y2] return 1 end s_arg=sikaku*PI/180 ziku_arg=ziku*PI/180 bun_arg=bunkaku*PI/180 x2_2=0;y2_2=0 0.upto(n-2){|i| rx=r*cos(s_arg) ry=r*sin(s_arg)*hen l=hypot(ry,rx) arg=atan2(ry,rx) x1_2=x+l*cos(arg+ziku_arg) y1_2=y+l*sin(arg+ziku_arg) rx=r*cos(s_arg+bun_arg) ry=r*sin(s_arg+bun_arg)*hen l=hypot(ry,rx) arg=atan2(ry,rx) x2_2=x+l*cos(arg+ziku_arg) y2_2=y+l*sin(arg+ziku_arg) sen_a<<[x1_2,y1_2,x2_2,y2_2] s_arg += bun_arg } if (x2-x2_2).abs<cl && (y2-y2_2).abs<cl else sen_a<<[x2_2,y2_2,x2,y2] end return 0 end #連続線の総延長を返す def rensen_total_l(rensen) t_l=0 0.upto(rensen.size-1){|i| if rensen[i].size==4#線データ l=hypot(rensen[i][3]-rensen[i][1],rensen[i][2]-rensen[i][0]) else if rensen[i][9]==1 r=rensen[i][6] arg=(rensen[i][8]-rensen[i][7])*PI/180 l=r*arg else sen_a=[];bunkaku=1 xy=rensen[i][3..-1] daen_rensen_array(sen_a,xy,bunkaku) l=0 0.upto(sen_a.size-1){|i2| l += hypot(sen_a[i2][3]-sen_a[i2][1],sen_a[i2][2]-sen_a[i2][0]) } end end t_l += l } return t_l end |
#rensenの並べ替え def rev_array(rensen) rensen2=[] rensen.each{|item| item[0],item[1],item[2],item[3]=item[2],item[3],item[0],item[1] rensen2<<item } return rensen2.reverse end #コマンドライン引数 pitch=200.0;nn=10 sitei=ARGV[1].to_i while ARGV.size>1 case argument=ARGV.pop when /\/a/ pitch=argument[2..-1].to_f when /\/b/ kiten=argument[2..-1].to_i when /\/c/ houkou=argument[2..-1].to_i when /\/d/ nn=argument[2..-1].to_i end end #メインルーチン sen_a=[];hp_a=[] while ARGF.gets xy=$_.split if xy[0]=~/^hp/ hp_a<<[xy[1].to_f,xy[2].to_f] end if xy[0]=~/^\d|^-/ xy.collect!{|item|item.to_f} sen_a<<xy end if xy[0]=~/^ci/ xy.collect!{|item|item.to_f} if xy.size==4 xy<<0<<360<<1<<0 end if(xy[4]>xy[5]) xy[4] -= 360 elsif xy[4]==xy[5] xy[4]=0 xy[5]=360 end zahyo=xy[1..-1] ten=daenko_siten(zahyo); x1=ten[0];y1=ten[1]; ten=daenko_syuten(zahyo); x2=ten[0];y2=ten[1]; if(xy[7] != 0 && xy[6]==1) xy[4] += xy[7] xy[5] += xy[7] xy[7]=0 end sen_a<<[x1,y1,x2,y2,xy[1],xy[2],xy[3],xy[4],xy[5],xy[6],xy[7]] end end 0.upto(hp_a.size-1){|i| ten=hp_a[i] j,rensen=loop_renzoku_seach(sen_a,ten) if rensen.size>0 if j==1 array=rensen_point_array(rensen) s=zahyo_s(array) if houkou ==1 if s<0 rensen=rev_array(rensen) end else if s>0 rensen=rev_array(rensen) end end end t_l=rensen_total_l(rensen) n=(t_l/pitch).to_i if sitei==1 if kiten==2 l2=pitch-((t_l-n*pitch)+pitch)/2 yo_tyo=l2 elsif kiten==3 pitch=t_l/(n+1) yo_tyo=0 printf("h#(#{n+1}分割) %.3fmm\n",pitch) else yo_tyo=0 end printf("h#(#{n+1}分割)\n") unless kiten==3 else pitch=t_l/nn yo_tyo=0 printf("h#%.3fmm\n",pitch) end rensen_ten_draw(rensen,pitch,yo_tyo) end } __END__ :end |
▼kojimaさん: >楕円・楕円弧については、標準機能で作図したほうが正確です。 了解しました。 実行確認も、取り敢えず作図できるかの確認だけですが、問題ないようです。 編集頂き、感謝です!! |