Page 75 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼曲線への文字の配置 kojima 15/07/18(土) 9:48 ┣Re(1):曲線への文字の配置 住職 15/07/18(土) 11:22 ┗Re(1):曲線への文字の配置 R.N 15/07/19(日) 4:11 ┗Re(2):曲線への文字の配置 kojima 15/07/20(月) 14:03 ┗Re(3):曲線への文字の配置 R.N 15/07/20(月) 19:01 ─────────────────────────────────────── ■題名 : 曲線への文字の配置 ■名前 : kojima ■日付 : 15/07/18(土) 9:48 -------------------------------------------------------------------------
ヒマなので 相談室に質問のあった、曲線上へ文字を配置 を外部変形で実現してみました。 相談室の質問は、「外部変形以外で」との条件つきなので、そちらには貼りません。 バッチファイルにrubyスクリプトを記述した外部変形です。 @REM 連続線・曲線への文字均等割付(範囲選択) @echo off REM #jww REM #cd REM #hp REM #c文字の入力/_/a REM #h1 REM #1連続線・曲線の始点を指示(右クリック) REM #e copy jwc_temp.txt temp.txt >nul ruby -x %~f0 temp.txt %1>jwc_temp.txt exit #!ruby -Ks include Math picth=100 while ARGV.length > 1 case argument = ARGV.pop when /^\/a/ moji = argument[ 2 .. -1] end end moji_a=moji.split('') def moji(x,y,dx,dy,word) printf("ch %.11f %.11f %.11f %.11f \"%s\n",x,y,dx,dy,word) end def ika3(x) s=sprintf("%.3f",x.to_f) return s.to_f end def arraysum(array) sum=0 array.each{|item| sum += item} return sum end def en_d_zahyo(x,y,r,arg,hen,ziku_arg) rx=r*cos(arg) ry=r*sin(arg)*hen l=hypot(ry,rx) arg1=atan2(ry,rx) x1=x+l*cos(arg1+ziku_arg) y1=y+l*sin(arg1+ziku_arg) return [x1,y1] end sen=[];by=[];hp=[];s=0 while ARGF.gets xy =split if xy[0] =~ /^hs/ xy[1..-1].each{|item|by<<item.to_i} end if xy[0] =~ /^lg/ lg=xy[0][2,1];zusun=by[lg.hex] end if xy[0] =~ /^hp/ hp<<[ika3(xy[1]),ika3(xy[2])] end if xy[0] =~ /^\d|^-/ xy.collect!{|item|ika3(item)} sen<<xy end if xy[0] =~ /^ci/ xy.collect!{|item|item.to_f} x,y,r=xy[1],xy[2],xy[3] if xy.size==4 sikaku,syukaku,hen,ziku=0,360,1,0 else sikaku,syukaku,hen,ziku=xy[4..-1] end if sikaku>syukaku sikaku -= 360 elsif sikaku==syukaku syukaku += 360 end n=20 d_kaku=(syukaku-sikaku)/n d_arg=d_kaku*PI/180 ziku_arg=ziku*PI/180 arg=sikaku*PI/180 n.times{ x1,y1=en_d_zahyo(x,y,r,arg,hen,ziku_arg) x2,y2=en_d_zahyo(x,y,r,arg+d_arg,hen,ziku_arg) arg += d_arg sen<<[ika3(x1),ika3(y1),ika3(x2),ika3(y2)] } end end i=0 renzoku=[];a=hp[i] begin renzoku<<a b=sen.find{|item|[item[0],item[1]]==a or [item[2],item[3]]==a} if b if renzoku[-1][0]==b[0] && renzoku[-1][1]==b[1] a=[b[2],b[3]] elsif renzoku[-1][0]==b[2] && renzoku[-1][1]==b[3] a=[b[0],b[1]] end sen.delete_if{|item|item==b} end end while(b) renzoku.uniq! dx=[0];dy=[0];larray=[0];l=0;n=0 while n<renzoku.size-1 lx=renzoku[n+1][0]-renzoku[n][0] ly=renzoku[n+1][1]-renzoku[n][1] lxy=hypot(lx,ly) dx<<lx/lxy dy<<ly/lxy larray<<lxy n+=1 end l=arraysum(larray) picth=l/(moji_a.size-1) yotyo=0;ruisin=0;s=0 puts "cc1" moji(renzoku[0][0],renzoku[0][1],dx[1],dy[1],moji_a[s]) m=1;l=0 s += 1 while m<larray.size if (larray[m]+yotyo)>=picth warisu=((larray[m]+yotyo)/picth).to_i n=1 warisu.times{ moji(renzoku[l][0]+(picth*n-yotyo)*dx[m],renzoku[l][1]+(picth*n-yotyo)*dy[m],dx[m],dy[m],moji_a[s]) n+=1;s+=1 } yotyo=(larray[m]+yotyo)-picth*warisu else yotyo += larray[m] end m+=1;l+=1 end moji(renzoku[-1][0],renzoku[-1][1],dx[-1],dy[-1],moji_a[-1]) |
▼kojimaさん: >ヒマなので >相談室に質問のあった、曲線上へ文字を配置 を外部変形で実現してみました。 >相談室の質問は、「外部変形以外で」との条件つきなので、そちらには貼りません。 > >バッチファイルにrubyスクリプトを記述した外部変形です。 使用させていただき、動作確認しました。 (Win8.1 Jww_8.00d Ruby_1.8.6) |
kojimaさん;こんにちは 円弧でも確認しました。 ありがとうございます。 線上点2点では---と勝手なことを (win7 64bit ruby1.8.6 jww8.00d) |
>線上点2点では---と勝手なことを 直線上の2点? 連続線上の2点? 指示点が円上だと実行されません。 @REM 連続線の2点間に文字均等配置 @echo off REM #jww REM #cd REM #h1 REM #c文字の入力/_/a REM #1線上1点目を指示してください REM #2線上2点目を指示してください REM #e copy jwc_temp.txt temp.txt >nul ruby -x %~f0 temp.txt %1>jwc_temp.txt pause exit #!ruby -Ks include Math class Sen attr_accessor :x1, :y1, :x2, :y2 def initialize(x1,y1,x2,y2) @x1=x1 @y1=y1 @x2=x2 @y2=y2 end end while ARGV.length > 1 case argument = ARGV.pop when /^\/a/ moji = argument[ 2 .. -1] end end moji_a=moji.split('') def moji(x,y,dx,dy,word) printf("ch %.11f %.11f %.11f %.11f \"%s\n",x,y,dx,dy,word) end def ika3(x) s=sprintf("%.3f",x.to_f) return s.to_f end #線の配列senから連続線を区分けする def loop_zukei(sen) a=sen.shift renzoku=[a] begin b=sen.find{|item2| item2.x1==a.x2 && item2.y1==a.y2 or item2.x2==a.x2 && item2.y2==a.y2 } if b if renzoku[-1].x2==b.x1 && renzoku[-1].y2==b.y1 a=Sen.new(b.x1,b.y1,b.x2,b.y2) elsif renzoku[-1].x2==b.x2 && renzoku[-1].y2==b.y2 a=Sen.new(b.x2,b.y2,b.x1,b.y1) end sen.delete_if{|item2|item2==b} renzoku<<a end end while(b) begin a=renzoku[0] b=sen.find{|item2| item2.x1==a.x1 && item2.y1==a.y1 or item2.x2==a.x1 && item2.y2==a.y1 } if b if renzoku[0].x1==b.x1 && renzoku[0].y1==b.y1 a=Sen.new(b.x2,b.y2,b.x1,b.y1) elsif renzoku[0].x1==b.x2 && renzoku[0].y1==b.y2 a=Sen.new(b.x1,b.y1,b.x2,b.y2) end sen.delete_if{|item2|item2==b} renzoku.unshift(a) end end while(b) return renzoku end def sen_ue?(sen,ten) sen_l=hypot(sen.y2-sen.y1,sen.x2-sen.x1) sen_arg=atan2(sen.y2-sen.y1,sen.x2-sen.x1) ten_l=hypot(ten[1]-sen.y1,ten[0]-sen.x1) ten_arg=atan2(ten[1]-sen.y1,ten[0]-sen.x1) if ika3(sen_arg)==ika3(ten_arg) && sen_l>=ten_l return 1 elsif sen.x1==ten[0] && sen.y1==ten[1] return 1 else return 0 end end def arraysum(array) sum=0 array.each{|item| sum += item} return sum end def en_d_zahyo(x,y,r,arg,hen,ziku_arg) rx=r*cos(arg) ry=r*sin(arg)*hen l=hypot(ry,rx) arg1=atan2(ry,rx) x1=x+l*cos(arg1+ziku_arg) y1=y+l*sin(arg1+ziku_arg) return [x1,y1] end sen=[];hp=[] while ARGF.gets xy=$_.split if xy[0]=~/^hp\d/ hp<<[ika3(xy[1]),ika3(xy[2])] end if xy[0]=~/^\d|^-/ xy.collect!{|item|ika3(item)} sen<<Sen.new(xy[0],xy[1],xy[2],xy[3]) end if xy[0] =~ /^ci/ xy.collect!{|item|item.to_f} x,y,r=xy[1],xy[2],xy[3] if xy.size==4 sikaku,syukaku,hen,ziku=0,360,1,0 else sikaku,syukaku,hen,ziku=xy[4..-1] end if sikaku>syukaku sikaku -= 360 elsif sikaku==syukaku syukaku += 360 end n=20 d_kaku=(syukaku-sikaku)/n d_arg=d_kaku*PI/180 ziku_arg=ziku*PI/180 arg=sikaku*PI/180 n.times{ x1,y1=en_d_zahyo(x,y,r,arg,hen,ziku_arg) x2,y2=en_d_zahyo(x,y,r,arg+d_arg,hen,ziku_arg) arg += d_arg sen<<Sen.new(ika3(x1),ika3(y1),ika3(x2),ika3(y2)) } end end renzoku=loop_zukei(sen) flg=0 rensen=[] renzoku.each{|item| if sen_ue?(item,hp[0])==1 && sen_ue?(item,hp[1])==0 if flg==0 x1,y1,x2,y2=hp[0][0],hp[0][1],item.x2,item.y2 elsif flg==1 x1,y1,x2,y2=item.x1,item.y1,hp[0][0],hp[0][1] end l=hypot(y2-y1,x2-x1) if l>0 rensen<<Sen.new(x1,y1,x2,y2) flg += 1 end end if sen_ue?(item,hp[1])==1 && sen_ue?(item,hp[0])==0 if flg==0 x1,y1,x2,y2=hp[1][0],hp[1][1],item.x2,item.y2 elsif flg==1 x1,y1,x2,y2=item.x1,item.y1,hp[1][0],hp[1][1] end l=hypot(y2-y1,x2-x1) if l>0 rensen<<Sen.new(x1,y1,x2,y2) flg += 1 end end if sen_ue?(item,hp[0])==1 && sen_ue?(item,hp[1])==1 l=hypot(hp[1][1]-hp[0][1],hp[1][0]-hp[0][0]) if l>0 rensen<<Sen.new(hp[0][0],hp[0][1],hp[1][0],hp[1][1]) flg += 2 end end if sen_ue?(item,hp[0])==0 && sen_ue?(item,hp[1])==0 if flg==1 rensen<<item end end break if flg==2 } if flg==0 printf "h#線上の指示点がありません\n" exit end i=0 renzoku=[];a=hp[i] begin renzoku<<a b=rensen.find{|item|[item.x1,item.y1]==a or [item.x2,item.y2]==a} if b if renzoku[-1][0]==b.x1 && renzoku[-1][1]==b.y1 a=[b.x2,b.y2] elsif renzoku[-1][0]==b.x2 && renzoku[-1][1]==b.y2 a=[b.x1,b.y1] end rensen.delete_if{|item|item==b} end end while(b) dx=[0];dy=[0];larray=[0];l=0;n=0 while n<renzoku.size-1 lx=renzoku[n+1][0]-renzoku[n][0] ly=renzoku[n+1][1]-renzoku[n][1] lxy=hypot(lx,ly) dx<<lx/lxy dy<<ly/lxy larray<<lxy n+=1 end l=arraysum(larray) picth=l/(moji_a.size-1) yotyo=0;ruisin=0;s=0 puts "cc1" moji(renzoku[0][0],renzoku[0][1],dx[1],dy[1],moji_a[s]) m=1;l=0 s += 1 while m<larray.size if (larray[m]+yotyo)>=picth warisu=((larray[m]+yotyo)/picth).to_i n=1 warisu.times{ moji(renzoku[l][0]+(picth*n-yotyo)*dx[m],renzoku[l][1]+(picth*n-yotyo)*dy[m],dx[m],dy[m],moji_a[s]) n+=1;s+=1 } yotyo=(larray[m]+yotyo)-picth*warisu else yotyo += larray[m] end m+=1;l+=1 end moji(renzoku[-1][0],renzoku[-1][1],dx[-1],dy[-1],moji_a[-1]) |
kojimaさん;こんにちは、 あの後、直線でもできることに気付いた次第です。 曲線のとき、途中点を右クリックで拾えたのですが、文字が曲線に対して逆方向にしかならないので、自分でなんとかならないか、やっていたところでした。 (解読するのも、大変ですが、できた時には、感激!!、多少のことは、改変させて頂いて、個人利用させて頂いてます) 直線の線上点も拾えることも、確認しました。 お手上げ状態のところを手助け頂き、感謝です。 ありがとうございます。 |