Page 556 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼外部変形の円・円弧内 消去 snackpan 17/3/12(日) 16:06 ┣Re:外部変形の円・円弧内 消去 P 17/3/12(日) 16:59 ┃ ┗Re:外部変形の円・円弧内 消去 snackpan 17/3/12(日) 23:19 ┗外部変形の円・円弧内 消去 その1 kojima 17/3/13(月) 8:52 ┣Re:外部変形の円・円弧内 消去 R.N 17/3/15(水) 16:07 ┃ ┗Re:外部変形の円・円弧内 消去 P 17/3/15(水) 18:44 ┗外部変形の円・円弧内 消去 修正その1 kojima 17/3/15(水) 21:03 ┗外部変形の円・円弧内 消去 修正その2 kojima 17/3/15(水) 21:04 ┗Re:外部変形の円・円弧内 消去 修正その2 R.N 17/3/16(木) 18:42 ─────────────────────────────────────── ■題名 : 外部変形の円・円弧内 消去 ■名前 : snackpan ■日付 : 17/3/12(日) 16:06 -------------------------------------------------------------------------
教えてください。 外部変形の円・円弧内 消去ですがSnap_Kinさん作のものは無くなったのでしょうか? 出来れば複数の円を選択して円内消去をしたいのです。 または同様の物はありませんか?(Win7,Win10) |
▼snackpanさん: >教えてください。 >外部変形の円・円弧内 消去ですがSnap_Kinさん作のものは無くなったのでしょうか? >出来れば複数の円を選択して円内消去をしたいのです。 >または同様の物はありませんか?(Win7,Win10) 複数の円弧は出来ないようですが、試してみたらどうでしょうか? http://www.vector.co.jp/soft/dos/business/se023206.html Snap_KinさんのHPは既に無くなっています 円・円弧内 消去の説明書に 無断でネットを利用した配布はしないでください。 と書かれていますので、手に入れるのは難しいと思います。 |
▼Pさん: >▼snackpanさん: >>教えてください。 >>外部変形の円・円弧内 消去ですがSnap_Kinさん作のものは無くなったのでしょうか? >>出来れば複数の円を選択して円内消去をしたいのです。 >>または同様の物はありませんか?(Win7,Win10) > >複数の円弧は出来ないようですが、試してみたらどうでしょうか? >http://www.vector.co.jp/soft/dos/business/se023206.html > >Snap_KinさんのHPは既に無くなっています >円・円弧内 消去の説明書に >無断でネットを利用した配布はしないでください。 >と書かれていますので、手に入れるのは難しいと思います。 ありがとうございます。 Snap_Kinさんのはそういうことなんですね。 教えていただいた外部変形で試してみます。 |
バッチファイルにrubyスクリプトを記述するタイプの外部変形です。 (Rubyのインストールが必要) @REM 円内の直線を消去 @echo off REM #jww REM #cd REM #ht10 REM #ht30 REM #zz REM #zw REM #zc REM #h2 REM #e copy jwc_temp.txt temp.txt > nul ruby -x %~f0 temp.txt > jwc_temp.txt pause goto end #!ruby -Ks include Math #3線と円の交点角度の配列を返す(扁平率は考慮しない) def sen_en_kakudo(sen,en) kakudo=[] if en.size==4 x=en[1] y=en[2] r=en[3] en[4]=0 en[5]=0 en[6]=1 en[7]=0 else x=en[1] y=en[2] r=en[3] end hen=en[6] ziku=en[7] ziku_arg=ziku*2*PI/360 sen_x=sen[2]-sen[0] sen_y=sen[3]-sen[1] sen_kakudo1=atan2(sen_y,sen_x) en_x1=x-sen[0] en_y1=y-sen[1] en_x2=sen[2]-x en_y2=sen[3]-y en_xy1=sqrt(en_x1**2+en_y1**2) en_xy2=sqrt(en_x2**2+en_y2**2) en_kakudo1=atan2(en_y1,en_x1) en_kakudo2=atan2(en_y2,en_x2) if hen==1 && ziku==0 sen_x1=sen[0] sen_y1=sen[1] sen_x2=sen[2] sen_y2=sen[3] else sen_x1=x-en_xy1*cos(en_kakudo1-ziku_arg) sen_y1=y-en_xy1*sin(en_kakudo1-ziku_arg)/hen sen_x2=x+en_xy2*cos(en_kakudo2-ziku_arg) sen_y2=y+en_xy2*sin(en_kakudo2-ziku_arg)/hen end if sen_x1>sen_x2 sen_x1,sen_x2=sen_x2,sen_x1 sen_y1,sen_y2=sen_y2,sen_y1 elsif sen_x1==sen_x2 if sen_y1>sen_y2 sen_y1,sen_y2=sen_y2,sen_y1 end end senx=(sen_x2-sen_x1) seny=(sen_y2-sen_y1) sen_kakudo2=atan2(seny,senx) en_kakudo2_1=atan2((y-sen_y1),x-sen_x1) en_xy2_1=sqrt((y-sen_y1)**2+(x-sen_x1)**2) en_xy2_2=sqrt((sen_y2-y)**2+(sen_x2-x)**2) henkaku=sen_kakudo2-en_kakudo2_1 y1=en_xy2_1*sin(henkaku) if r>y1.abs x1=sqrt(r**2-y1**2) kakudo1=atan2(y1,-x1) kakudo2=atan2(y1,x1) if en_xy2_1>r && (sen_x1<en[1]+r* cos(kakudo1+sen_kakudo2) && sen_x2>en[1]+r* cos(kakudo1+sen_kakudo2) or sen_y1<en[2]+r* sin(kakudo1+sen_kakudo2) && sen_y2>en[2]+r* sin(kakudo1+sen_kakudo2)) kakudo<<(kakudo1+sen_kakudo2)*360/(2*PI)+ziku end if en_xy2_2>r && (sen_x2>en[1]+r* cos(kakudo2+sen_kakudo2) && sen_x1<en[1]+r* cos(kakudo2+sen_kakudo2) or sen_y2>en[2]+r* sin(kakudo2+sen_kakudo2) && sen_y1<en[2]+r*sin(kakudo2+sen_kakudo2)) kakudo<<(kakudo2+sen_kakudo2)*360/(2*PI)+ziku end end if kakudo.size!=0 kakudo.collect!{|item| if item<0 360+item else item end } return kakudo else return nil end end #5線と円の交点座標の配列を返す(扁平率・軸角考慮) def sen_en_zahyo(sen,en) zahyo=[] if en.size==4 x=en[1] y=en[2] r=en[3] en[4]=0 en[5]=0 en[6]=1 en[7]=0 else x=en[1] y=en[2] r=en[3] end hen=en[6] ziku=en[7] kakudo=sen_en_kakudo(sen,en) if sen_en_kakudo(sen,en) if kakudo kakudo.each{|item| rajian=item*2*PI/360 ziku_arg=ziku*2*PI/360 ax=r*cos(rajian-ziku_arg) ay=r*sin(rajian-ziku_arg)*hen axy=sqrt(ax**2+ay**2) arg=atan2(ay,ax) axt=x+axy*cos(arg+ziku_arg) ayt=y+axy*sin(arg+ziku_arg) zahyo<<[axt,ayt] } end if zahyo.size>0 return zahyo else return nil end end #tenの位置がenの内(true)か、外(false)かを判定 def area(en,ten) zahyo=[] zahyo<<sen_en_zahyo([0,0,ten[0],ten[1]],en) if sen_en_zahyo([0,0,ten[0],ten[1]],en) if(zahyo.flatten).size==2 return true else return false end end #点が円上にあるか? def ten_en_kouten?(ten,en) if en.size==4 en[4]=0 en[5]=360 en[6]=1 en[7]=0 end en[5]+=360 if en[4]==en[5] ten_arg=atan2(ten[1],ten[0]) tenx=ten[0]-en[1] teny=ten[1]-en[2] tenxy=sqrt(tenx**2+teny**2) x=en[3]*cos(ten_arg-en[7]*2*PI/360) y=en[3]*sin(ten_arg-en[7]*2*PI/360)*en[6] xy=sqrt(x**2+y**2) if ika3(tenxy)==ika3(xy) return true else return false end end #数値の小数点3桁以下を切り捨て def ika3(x) a=(((x.to_f)*1000000).to_i/1000000.to_f) return a end |
▼kojimaさん: 外変公開、感謝いたします。 試用させて頂きました。 その1・2を結合して、BATとして保存したのですが--- 実行しても、エラー等は表示されないのですが、現状のままで、円内を消去することができません? 何か不手際があるでしょうか? win10-64,Ruby-186,jww7.11 |
▼R.Nさん: >その1・2を結合して、BATとして保存したのですが--- >実行しても、エラー等は表示されないのですが、現状のままで、円内を消去することができません? >何か不手際があるでしょうか? > >win10-64,Ruby-186,jww7.11 消去したい線と円が同一レイヤグループにありますか? 違う場合はR.Nさんと同じ症状になりました ▼kojimaさん 公開有り難うございます 円弧でも消去出来るのですね |
@REM 円内の直線を消去 @echo off REM #jww REM #cd REM #ht10 REM #ht30 REM #zz REM #zw REM #zc REM #h2 REM #hp REM #e copy jwc_temp.txt temp.txt > nul ruby -x %~f0 temp.txt > jwc_temp.txt pause goto end #!ruby -Ks include Math #3線と円の交点角度の配列を返す(扁平率は考慮しない) def sen_en_kakudo(sen,en) kakudo=[] if en.size==4 x=en[1] y=en[2] r=en[3] en[4]=0 en[5]=0 en[6]=1 en[7]=0 else x=en[1] y=en[2] r=en[3] end hen=en[6] ziku=en[7] ziku_arg=ziku*2*PI/360 sen_x=sen[2]-sen[0] sen_y=sen[3]-sen[1] sen_kakudo1=atan2(sen_y,sen_x) en_x1=x-sen[0] en_y1=y-sen[1] en_x2=sen[2]-x en_y2=sen[3]-y en_xy1=sqrt(en_x1**2+en_y1**2) en_xy2=sqrt(en_x2**2+en_y2**2) en_kakudo1=atan2(en_y1,en_x1) en_kakudo2=atan2(en_y2,en_x2) if hen==1 && ziku==0 sen_x1=sen[0] sen_y1=sen[1] sen_x2=sen[2] sen_y2=sen[3] else sen_x1=x-en_xy1*cos(en_kakudo1-ziku_arg) sen_y1=y-en_xy1*sin(en_kakudo1-ziku_arg)/hen sen_x2=x+en_xy2*cos(en_kakudo2-ziku_arg) sen_y2=y+en_xy2*sin(en_kakudo2-ziku_arg)/hen end if sen_x1>sen_x2 sen_x1,sen_x2=sen_x2,sen_x1 sen_y1,sen_y2=sen_y2,sen_y1 elsif sen_x1==sen_x2 if sen_y1>sen_y2 sen_y1,sen_y2=sen_y2,sen_y1 end end senx=(sen_x2-sen_x1) seny=(sen_y2-sen_y1) sen_kakudo2=atan2(seny,senx) en_kakudo2_1=atan2((y-sen_y1),x-sen_x1) en_xy2_1=sqrt((y-sen_y1)**2+(x-sen_x1)**2) en_xy2_2=sqrt((sen_y2-y)**2+(sen_x2-x)**2) henkaku=sen_kakudo2-en_kakudo2_1 y1=en_xy2_1*sin(henkaku) if r>y1.abs x1=sqrt(r**2-y1**2) kakudo1=atan2(y1,-x1) kakudo2=atan2(y1,x1) if en_xy2_1>r && (sen_x1<en[1]+r* cos(kakudo1+sen_kakudo2) && sen_x2>en[1]+r* cos(kakudo1+sen_kakudo2) or sen_y1<en[2]+r* sin(kakudo1+sen_kakudo2) && sen_y2>en[2]+r* sin(kakudo1+sen_kakudo2)) kakudo<<(kakudo1+sen_kakudo2)*360/(2*PI)+ziku end if en_xy2_2>r && (sen_x2>en[1]+r* cos(kakudo2+sen_kakudo2) && sen_x1<en[1]+r* cos(kakudo2+sen_kakudo2) or sen_y2>en[2]+r* sin(kakudo2+sen_kakudo2) && sen_y1<en[2]+r*sin(kakudo2+sen_kakudo2)) kakudo<<(kakudo2+sen_kakudo2)*360/(2*PI)+ziku end end if kakudo.size!=0 kakudo.collect!{|item| if item<0 360+item else item end } return kakudo else return nil end end #5線と円の交点座標の配列を返す(扁平率・軸角考慮) def sen_en_zahyo(sen,en) zahyo=[] if en.size==4 x=en[1] y=en[2] r=en[3] en[4]=0 en[5]=0 en[6]=1 en[7]=0 else x=en[1] y=en[2] r=en[3] end hen=en[6] ziku=en[7] kakudo=sen_en_kakudo(sen,en) if sen_en_kakudo(sen,en) if kakudo kakudo.each{|item| rajian=item*2*PI/360 ziku_arg=ziku*2*PI/360 ax=r*cos(rajian-ziku_arg) ay=r*sin(rajian-ziku_arg)*hen axy=sqrt(ax**2+ay**2) arg=atan2(ay,ax) axt=x+axy*cos(arg+ziku_arg) ayt=y+axy*sin(arg+ziku_arg) zahyo<<[axt,ayt] } end if zahyo.size>0 return zahyo else return nil end end #tenの位置がenの内(true)か、外(false)かを判定 def area(en,ten) zahyo=[] zahyo<<sen_en_zahyo([0,0,ten[0],ten[1]],en) if sen_en_zahyo([0,0,ten[0],ten[1]],en) if(zahyo.flatten).size==2 return true else return false end end #点が円上にあるか? def ten_en_kouten?(ten,en) if en.size==4 en[4]=0 en[5]=360 en[6]=1 en[7]=0 end en[5]+=360 if en[4]==en[5] ten_arg=atan2(ten[1],ten[0]) tenx=ten[0]-en[1] teny=ten[1]-en[2] tenxy=sqrt(tenx**2+teny**2) x=en[3]*cos(ten_arg-en[7]*2*PI/360) y=en[3]*sin(ten_arg-en[7]*2*PI/360)*en[6] xy=sqrt(x**2+y**2) if ika3(tenxy)==ika3(xy) return true else return false end end #数値の小数点3桁以下を切り捨て def ika3(x) a=(((x.to_f)*1000000).to_i/1000000.to_f) return a end |
en=[];naigai=[] while ARGF.gets xy=$_.split if xy[0]=~/^ci/ xy.collect!{|item|item.to_f} en<<xy end end puts "hd" open("temp.txt","r"){|f| while line=f.gets xy=line.split if xy[0]=~/^hq/ elsif xy[0]=~/^\d|^-/ xy.collect!{|item|item.to_f} if xy[0]>xy[2] xy[0],xy[2],xy[1],xy[3]=xy[2],xy[0],xy[3],xy[1] elsif xy[0]==xy[2] if xy[1]>xy[3] xy[1],xy[3]=xy[3],xy[1] end end xy2=xy.collect{|item|ika3(item)} arg=atan2(xy2[3]-xy2[1],xy2[2]-xy2[0]) kouten=[];area1=0;area2=0 en.each{|item| if sen_en_zahyo(xy2,item)!=nil if sen_en_zahyo(xy2,item).size==2 kouten<<[sen_en_zahyo(xy2,item)[0][0],sen_en_zahyo(xy2,item)[0][1]] kouten<<[sen_en_zahyo(xy2,item)[1][0],sen_en_zahyo(xy2,item)[1][1]] elsif sen_en_zahyo(xy2,item).size==1 kouten<<[sen_en_zahyo(xy2,item)[0][0],sen_en_zahyo(xy2,item)[0][1]] end end if area(item,[xy2[0],xy2[1]])==true area1+=1 end if area(item,[xy2[2],xy2[3]])==true area2+=1 end } if xy[0]==xy[2] kouten2=kouten.sort{|a,b|a[1]<=>b[1]} else kouten2=kouten.sort{|a,b|a[0]<=>b[0]} end if area1==0 && kouten2.size>0 printf("%.11f %.11f %.11f %.11f\n",xy[0],xy[1],kouten2[0][0],kouten2[0][1]) end if area2==0 && kouten2.size>0 printf("%.11f %.11f %.11f %.11f\n",xy[2],xy[3],kouten2[-1][0],kouten2[-1][1]) end if kouten2.size>=2 area1==0 ? n1=1 : n1=0 area2==0 ? n2=kouten2.size-3 : n2=kouten2.size-2 n1.step(n2,2){|i|printf("%.11f %.11f %.11f %.11f\n",kouten2[i][0],kouten2[i][1],kouten2[i+1][0],kouten2[i+1][1])} end if kouten.size==0 && area1==0 && area2==0 print line end naigai<<area2 elsif xy[0]=~/^pt/ area1=0 en.each{|item| if area(item,[xy[1].to_f,xy[2].to_f])==true area1+=1 end } print line if area1==0 else print line end end } __END__ :end |
▼kojimaさん: 修正ありがとうございます。 消去できました。 |