anonymous No title
No License Ruby
2020年07月09日
Copy Clone
@REM jww 外部変形
@REM 円外消去.BAT
@REM ruby 1.8.7 に対応
@REM 文字列を処理
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht20
REM #ht40
REM #zz
goto %1
REM #hm【円外消去】 |円外消去|等倍複写|2倍複写|N倍複写|回転複写|
REM #:1
REM #h2
REM #hc  【円外消去】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【円外消去】円を指示
REM #e
REM #:2
REM #h2
REM #hc  【等倍複写】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【等倍複写】円を指示
REM #0%d 【等倍複写】複写先指示
REM #e
REM #:3
REM #h2
REM #hc  【2倍複写】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【2倍複写】円を指示
REM #0%d 【2倍複写】複写先指示
REM #e
REM #:4
REM #h2
REM #hc  【N倍複写】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【N倍複写】円を指示
REM #0%d 【N倍複写】複写先指示
REM #c   【N倍複写】倍率指定(無指定:1) : /_N
REM #e
REM #:5
REM #h2
REM #hc  【回転複写】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【回転複写】円を指示
REM #0%d 【回転複写】複写先指示
REM #c   【回転複写】倍率指定(無指定:1) : /_N
REM #e

:1
:2
:4
:5
copy jwc_temp.txt jwc_bak.txt
rubyw -x %~f0 %1 %2
GOTO  END
:3
copy jwc_temp.txt jwc_bak.txt
rubyw -x %~f0 %1 N2
GOTO  END

【円外消去】指定した円の外側を消去
【等倍複写】指定した円の外側を消去して複写
【2倍複写】倍率2倍
【N倍複写】倍率N倍
【回転複写】意味はないけどランダムに回転させてみる

#! ruby
# encoding: SJIS

# 座標値を取り込む際に円の中心からの相対座標に直す
# 座標値を出力する際
# 【円外消去】では座標を元に戻す
# 他は行列を使って倍率をかけたり回転させたり

include Math
require 'matrix'

$stdout=open("jwc_temp.txt","w")
$stderr=open("tmp_err.txt","w")

def kouten(a,c,b,d) #外積を使って二線(ab,cd)の交点を求める
	a=Vector.elements(a.to_a)
	b=Vector.elements(b.to_a)
	c=Vector.elements(c.to_a)
	d=Vector.elements(d.to_a)
	#cp1=(d-b).cross(b-a)[2]
	#cp2=(d-b).cross(c-b)[2]
	cp1=(d-b)[0]*(b-a)[1]-(d-b)[1]*(b-a)[0]
	cp2=(d-b)[0]*(c-b)[1]-(d-b)[1]*(c-b)[0]
	k=cp1/(cp1+cp2)
	p=(c-a)*k+a
end

class Vector
	def dot(a)
		self[0]*a[0]+self[1]*a[1]
	end
end

opt=ARGV[0].to_i #1:【円外消去】
jwc=open("jwc_bak.txt").read
n=ARGV.grep(/^N/)[0].to_s.gsub(/^N/,"").to_f
n=1.0 if n==0
mx=Matrix[[n,0],[0,n]]
rd=(opt==5 ? rand(360.0) :0)
mk=Matrix[[cos(rd*PI/180.0),-sin(rd*PI/180.0)],
	[sin(rd*PI/180.0),cos(rd*PI/180.0)]] #回転用行列
mx=mk*mx
vo=Vector[0,0]

cir=jwc.match(/hhp9ci\nci (-?[\d.]+) (-?[\d.]+) (-?[\d.]+)/m).
	to_a.map{|e| e.to_f}[1..3]
v0=Vector.elements(cir[0..1])
r1=cir[2]
hcw,hch,hcd,hcc=[],[],[],[]
fcw,fch,fcd,fcc=0,0,0,0
jwc.split("\n").each{|jw|
	if jw.match(/^hq/)
		puts "hd" if opt==1
	elsif jw.match(/^hc[whdc]/)
		hcw=jw.split(" ").map{|e| e.to_f} if /^hcw/=~jw
		hch=jw.split(" ").map{|e| e.to_f} if /^hch/=~jw
		hcd=jw.split(" ").map{|e| e.to_f} if /^hcd/=~jw
		hcc=jw.split(" ").map{|e| e.to_f} if /^hcc/=~jw
		puts jw
	elsif jw.match(/^cn0 (.*)/)
		fcw,fch,fcd,fcc=$1.split(" ").map{|e| e.to_f}
		puts jw
	elsif jw.match(/^cn([1-9]0?)/)
		cn=$1.to_i
		fcw,fch,fcd,fcc=hcw[cn],hch[cn],hcd[cn],hcc[cn]
		puts jw
	elsif jw.match(/^pt (.*)/) #点の処理
		vp=Vector.elements($1.split(" ").map{|f| f.to_f})
		vp=vp-v0
		if vp.r<r1
			vpn=(opt==1 ? vp+v0 : mx*vp)
			puts "pt "+vpn.to_a.join(" ")
		end
	elsif jw.match(/^( -?[\d.]+){4}/) #線の処理
		vs,ve=$&.split(" ").map{|e| e.to_f}.
			each_slice(2).map{|e| Vector.elements(e)}
		vs,ve=vs-v0,ve-v0
		vs,ve=ve,vs if vs.r>ve.r
		vb=Matrix[[0,-1],[1,0]]*(ve-vs) #90°回転
		vh=kouten(vo,vb,vs,ve) #円の中心から線への垂点
		if vh.r<r1
			vp=(ve-vs)*sqrt(r1**2-(vh.r)**2)*(1.0/(ve-vs).r)+vh
			vq=(vs-ve)*sqrt(r1**2-(vh.r)**2)*(1.0/(ve-vs).r)+vh
			if opt==1
				vsn,ven,vpn,vqn=vs+v0,ve+v0,vp+v0,vq+v0
			else
				vsn,ven,vpn,vqn=mx*vs,mx*ve,mx*vp,mx*vq
			end
			if vs.r<r1 && ve.r<r1 #始点と終点が円内
				puts " "+(vsn.to_a+ven.to_a).join(" ")
			elsif vs.r<r1 #始点が円内
				puts " "+(vsn.to_a+vpn.to_a).join(" ")
			elsif (vq-vs).dot(ve-vs)>0 && (vp-vs).dot(ve-vs)>0 #円を横切る
				puts " "+(vqn.to_a+vpn.to_a).join(" ")
			end
		end
	elsif jw.match(/^ci (.*)/) #円の処理
		ci=$1.split(" ").map{|f| f.to_f}
		cc=Vector.elements(ci[0,2])
		cc=cc-v0								#円弧中心
		r2=ci[2]								#半径
		d=cc.r									#円と円の距離
		ch=(ci[5] ? ci[5] :1.0)	#扁平率
		cj=(ci[6] ? ci[6] :0.0)	#軸角
		ccn=(opt==1 ? cc+v0 : mx*cc)
		if d>r1+r2 #円が離れている場合
			next
		elsif d<r1-r2 or (cc.r==0 && r1==r2)		#円の中に円がある又は円が同一
			if ci[3] #円弧か楕円
				puts "ci "+ccn.to_a.join(" ")+" #{r2*n} "+
					ci[3..5].join(" ")+" #{(cj+rd)%360.0}"
			else
				puts "ci "+ccn.to_a.join(" ")+" #{r2*n}"
			end
		else #交点が存在する場合
			if ch<1.0 #楕円の場合はそのまま出力
				puts "ci "+ccn.to_a.join(" ")+" #{r2*n} "+
					ci[3..5].join(" ")+" #{(cj+rd)%360.0}"
			else
				rad=acos((d**2+r1**2-r2**2)/(2*d*r1)) #余弦定理
				ma=Matrix[[cos(rad),sin(rad)],[-sin(rad),cos(rad)]]
				mb=Matrix[[cos(rad),-sin(rad)],[sin(rad),cos(rad)]]
				vp=ma*cc*(r1/d) #交点1
				vq=mb*cc*(r1/d) #交点2
				vc=Vector[r2,0]
				dp=atan2((vp-cc)[1],(vp-cc)[0])*180/PI
				dq=atan2((vq-cc)[1],(vq-cc)[0])*180/PI
				dp,dq=(dp+360.0)%360.0,(dq+360.0)%360.0
				dp,dq=[dp,dq].sort
				if ci.size==3 #円の場合
					dp,dq=dq,dp if (vc+cc).r<r1 #0°の点が円の外
					puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{dp} #{dq} 1.0 #{rd}"
				else #円弧の場合
					ds,de=ci[3]+cj,ci[4]+cj #始角と終角
					de=(de-ds<0 ? de-ds+360.0 : de-ds)
					dp,dq=[dp,dq].map{|e| e-ds<0 ? e-ds+360.0 : e-ds}.sort
					ms=Matrix[[cos(ds*PI/180),-sin(ds*PI/180)],[sin(ds*PI/180),cos(ds*PI/180)]]
					if dq<de #交点が2つ
						if (ms*vc+cc).r<r1 #始点が円内
							dp,dq,de=[dp,dq,de].map{|e| (e+ds)%360}
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{ds} #{dp} 1.0 #{(cj+rd)%360.0}"
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{dq} #{de} 1.0 #{(cj+rd)%360.0}"
						else
							dp,dq,de=[dp,dq,de].map{|e| (e+ds)%360}
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{dp} #{dq} 1.0 #{(cj+rd)%360.0}"
						end
					elsif dp<de #交点が1つ
						dp,dq,de=[dp,dq,de].map{|e| (e+ds)%360}
						if (ms*vc+cc).r<r1 #始点が円内
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{ds} #{dp} 1.0 #{(cj+rd)%360.0}"
						else
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{dp} #{de} 1.0 #{(cj+rd)%360.0}"
						end
					else de<dp #円弧が円内
						dp,dq,de=[dp,dq,de].map{|e| (e+ds)%360}
						if (ms*vc+cc).r<r1 #始点が円内
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{ds} #{de} 1.0 #{(cj+rd)%360.0}"
						end
					end
				end
			end
		end
	elsif jw.match(/^(c[hvsrptkz2])/) #文字列処理
		#円の内外に関わらず文字列を削除したい場合は
		#次の行の先頭の#を削除してコメントアウトを解除する
		#next
		jch=jw.split(" ")
		vs,ve=jch[1..4].map{|e| e.to_f}.
			each_slice(2).map{|e| Vector.elements(e)}
		vs=vs-v0
		jc0,jc5=jch[0],jch[5][1..-1]
		vb=Matrix[[0,-1],[1,0]]*ve #90°回転
		vh=kouten(vo,vb,vs,vs+ve) #円の中心から線への垂点
		if vh.r<r1
			vp= ve*sqrt(r1**2-(vh.r)**2)*(1.0/ve.r)+vh
			vq=-ve*sqrt(r1**2-(vh.r)**2)*(1.0/ve.r)+vh
			dq,dp,jc5n=0,0,""
			if vs.r<r1 && (ve-vs).r<r1 #始点と終点が円内(q,s,e,p)
				jc5n=jc5
				vsn=vs
			elsif vs.r<r1 #始点が円内(q,s,p,e)
				jc5.each_char{|e|
					if (vp-vs).r>dp
						dp+=(e.bytesize==1 ? fcw*0.5+fcd*0.5 : fcw+fcd)
						jc5n+=e
					end}
				vsn=vs
			elsif (ve-vs).r<r1 #終点が円内(s,q,e,p)
				jc5.each_char{|e|
					if (vq-vs).r>dq
						dq+=(e.bytesize==1 ? fcw*0.5+fcd*0.5 : fcw+fcd)
					else
						jc5n+=e
					end}
				vsn=vs+ve*dq/ve.r
			elsif ve.dot(vq-vs)>0 && ve.dot(vp-vs)>0 #始点と終点が円を横切る(s,q,p,e)
				jc5.each_char{|e|
					if (vq-vs).r>dq
						dq+=(e.bytesize==1 ? fcw*0.5+fcd*0.5 : fcw+fcd)
						dp=dq
					elsif (vp-vs).r>dp
						dp+=(e.bytesize==1 ? fcw*0.5+fcd*0.5 : fcw+fcd)
						jc5n+=e
					end}
				vsn=vs+ve*dq/ve.r
			end
			if vsn #円外の文字は書き出さない
				if opt==1
					vsn,ven=vsn+v0,mk*ve
				else
					vsn,ven=mx*vsn,mx*ve
				end
				puts "cn0 #{fcw*n} #{fch*n} #{fcd*n} #{fcc.to_i}" unless n==1.0
				puts %Q|#{jc0} #{vsn[0]} #{vsn[1]} #{ven[0]} #{ven[1]} "#{jc5n}|
			end
		end
	else
		puts jw
	end}
__END__

:END
@REM jww 外部変形
@REM 円外消去.BAT
@REM ruby 1.8.7 に対応
@REM 文字列を処理
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht20
REM #ht40
REM #zz
goto %1
REM #hm【円外消去】 |円外消去|等倍複写|2倍複写|N倍複写|回転複写|
REM #:1
REM #h2
REM #hc  【円外消去】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【円外消去】円を指示
REM #e
REM #:2
REM #h2
REM #hc  【等倍複写】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【等倍複写】円を指示
REM #0%d 【等倍複写】複写先指示
REM #e
REM #:3
REM #h2
REM #hc  【2倍複写】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【2倍複写】円を指示
REM #0%d 【2倍複写】複写先指示
REM #e
REM #:4
REM #h2
REM #hc  【N倍複写】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【N倍複写】円を指示
REM #0%d 【N倍複写】複写先指示
REM #c   【N倍複写】倍率指定(無指定:1) : /_N
REM #e
REM #:5
REM #h2
REM #hc  【回転複写】処理範囲を指定してください
REM #g1
REM #bz
REM #9ci 【回転複写】円を指示
REM #0%d 【回転複写】複写先指示
REM #c   【回転複写】倍率指定(無指定:1) : /_N
REM #e

:1
:2
:4
:5
copy jwc_temp.txt jwc_bak.txt
rubyw -x %~f0 %1 %2
GOTO  END
:3
copy jwc_temp.txt jwc_bak.txt
rubyw -x %~f0 %1 N2
GOTO  END

【円外消去】指定した円の外側を消去
【等倍複写】指定した円の外側を消去して複写
【2倍複写】倍率2倍
【N倍複写】倍率N倍
【回転複写】意味はないけどランダムに回転させてみる

#! ruby
# encoding: SJIS

# 座標値を取り込む際に円の中心からの相対座標に直す
# 座標値を出力する際
# 【円外消去】では座標を元に戻す
# 他は行列を使って倍率をかけたり回転させたり

include Math
require 'matrix'

$stdout=open("jwc_temp.txt","w")
$stderr=open("tmp_err.txt","w")

def kouten(a,c,b,d) #外積を使って二線(ab,cd)の交点を求める
	a=Vector.elements(a.to_a)
	b=Vector.elements(b.to_a)
	c=Vector.elements(c.to_a)
	d=Vector.elements(d.to_a)
	#cp1=(d-b).cross(b-a)[2]
	#cp2=(d-b).cross(c-b)[2]
	cp1=(d-b)[0]*(b-a)[1]-(d-b)[1]*(b-a)[0]
	cp2=(d-b)[0]*(c-b)[1]-(d-b)[1]*(c-b)[0]
	k=cp1/(cp1+cp2)
	p=(c-a)*k+a
end

class Vector
	def dot(a)
		self[0]*a[0]+self[1]*a[1]
	end
end

opt=ARGV[0].to_i #1:【円外消去】
jwc=open("jwc_bak.txt").read
n=ARGV.grep(/^N/)[0].to_s.gsub(/^N/,"").to_f
n=1.0 if n==0
mx=Matrix[[n,0],[0,n]]
rd=(opt==5 ? rand(360.0) :0)
mk=Matrix[[cos(rd*PI/180.0),-sin(rd*PI/180.0)],
	[sin(rd*PI/180.0),cos(rd*PI/180.0)]] #回転用行列
mx=mk*mx
vo=Vector[0,0]

cir=jwc.match(/hhp9ci\nci (-?[\d.]+) (-?[\d.]+) (-?[\d.]+)/m).
	to_a.map{|e| e.to_f}[1..3]
v0=Vector.elements(cir[0..1])
r1=cir[2]
hcw,hch,hcd,hcc=[],[],[],[]
fcw,fch,fcd,fcc=0,0,0,0
jwc.split("\n").each{|jw|
	if jw.match(/^hq/)
		puts "hd" if opt==1
	elsif jw.match(/^hc[whdc]/)
		hcw=jw.split(" ").map{|e| e.to_f} if /^hcw/=~jw
		hch=jw.split(" ").map{|e| e.to_f} if /^hch/=~jw
		hcd=jw.split(" ").map{|e| e.to_f} if /^hcd/=~jw
		hcc=jw.split(" ").map{|e| e.to_f} if /^hcc/=~jw
		puts jw
	elsif jw.match(/^cn0 (.*)/)
		fcw,fch,fcd,fcc=$1.split(" ").map{|e| e.to_f}
		puts jw
	elsif jw.match(/^cn([1-9]0?)/)
		cn=$1.to_i
		fcw,fch,fcd,fcc=hcw[cn],hch[cn],hcd[cn],hcc[cn]
		puts jw
	elsif jw.match(/^pt (.*)/) #点の処理
		vp=Vector.elements($1.split(" ").map{|f| f.to_f})
		vp=vp-v0
		if vp.r<r1
			vpn=(opt==1 ? vp+v0 : mx*vp)
			puts "pt "+vpn.to_a.join(" ")
		end
	elsif jw.match(/^( -?[\d.]+){4}/) #線の処理
		vs,ve=$&.split(" ").map{|e| e.to_f}.
			each_slice(2).map{|e| Vector.elements(e)}
		vs,ve=vs-v0,ve-v0
		vs,ve=ve,vs if vs.r>ve.r
		vb=Matrix[[0,-1],[1,0]]*(ve-vs) #90°回転
		vh=kouten(vo,vb,vs,ve) #円の中心から線への垂点
		if vh.r<r1
			vp=(ve-vs)*sqrt(r1**2-(vh.r)**2)*(1.0/(ve-vs).r)+vh
			vq=(vs-ve)*sqrt(r1**2-(vh.r)**2)*(1.0/(ve-vs).r)+vh
			if opt==1
				vsn,ven,vpn,vqn=vs+v0,ve+v0,vp+v0,vq+v0
			else
				vsn,ven,vpn,vqn=mx*vs,mx*ve,mx*vp,mx*vq
			end
			if vs.r<r1 && ve.r<r1 #始点と終点が円内
				puts " "+(vsn.to_a+ven.to_a).join(" ")
			elsif vs.r<r1 #始点が円内
				puts " "+(vsn.to_a+vpn.to_a).join(" ")
			elsif (vq-vs).dot(ve-vs)>0 && (vp-vs).dot(ve-vs)>0 #円を横切る
				puts " "+(vqn.to_a+vpn.to_a).join(" ")
			end
		end
	elsif jw.match(/^ci (.*)/) #円の処理
		ci=$1.split(" ").map{|f| f.to_f}
		cc=Vector.elements(ci[0,2])
		cc=cc-v0								#円弧中心
		r2=ci[2]								#半径
		d=cc.r									#円と円の距離
		ch=(ci[5] ? ci[5] :1.0)	#扁平率
		cj=(ci[6] ? ci[6] :0.0)	#軸角
		ccn=(opt==1 ? cc+v0 : mx*cc)
		if d>r1+r2 #円が離れている場合
			next
		elsif d<r1-r2 or (cc.r==0 && r1==r2)		#円の中に円がある又は円が同一
			if ci[3] #円弧か楕円
				puts "ci "+ccn.to_a.join(" ")+" #{r2*n} "+
					ci[3..5].join(" ")+" #{(cj+rd)%360.0}"
			else
				puts "ci "+ccn.to_a.join(" ")+" #{r2*n}"
			end
		else #交点が存在する場合
			if ch<1.0 #楕円の場合はそのまま出力
				puts "ci "+ccn.to_a.join(" ")+" #{r2*n} "+
					ci[3..5].join(" ")+" #{(cj+rd)%360.0}"
			else
				rad=acos((d**2+r1**2-r2**2)/(2*d*r1)) #余弦定理
				ma=Matrix[[cos(rad),sin(rad)],[-sin(rad),cos(rad)]]
				mb=Matrix[[cos(rad),-sin(rad)],[sin(rad),cos(rad)]]
				vp=ma*cc*(r1/d) #交点1
				vq=mb*cc*(r1/d) #交点2
				vc=Vector[r2,0]
				dp=atan2((vp-cc)[1],(vp-cc)[0])*180/PI
				dq=atan2((vq-cc)[1],(vq-cc)[0])*180/PI
				dp,dq=(dp+360.0)%360.0,(dq+360.0)%360.0
				dp,dq=[dp,dq].sort
				if ci.size==3 #円の場合
					dp,dq=dq,dp if (vc+cc).r<r1 #0°の点が円の外
					puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{dp} #{dq} 1.0 #{rd}"
				else #円弧の場合
					ds,de=ci[3]+cj,ci[4]+cj #始角と終角
					de=(de-ds<0 ? de-ds+360.0 : de-ds)
					dp,dq=[dp,dq].map{|e| e-ds<0 ? e-ds+360.0 : e-ds}.sort
					ms=Matrix[[cos(ds*PI/180),-sin(ds*PI/180)],[sin(ds*PI/180),cos(ds*PI/180)]]
					if dq<de #交点が2つ
						if (ms*vc+cc).r<r1 #始点が円内
							dp,dq,de=[dp,dq,de].map{|e| (e+ds)%360}
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{ds} #{dp} 1.0 #{(cj+rd)%360.0}"
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{dq} #{de} 1.0 #{(cj+rd)%360.0}"
						else
							dp,dq,de=[dp,dq,de].map{|e| (e+ds)%360}
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{dp} #{dq} 1.0 #{(cj+rd)%360.0}"
						end
					elsif dp<de #交点が1つ
						dp,dq,de=[dp,dq,de].map{|e| (e+ds)%360}
						if (ms*vc+cc).r<r1 #始点が円内
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{ds} #{dp} 1.0 #{(cj+rd)%360.0}"
						else
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{dp} #{de} 1.0 #{(cj+rd)%360.0}"
						end
					else de<dp #円弧が円内
						dp,dq,de=[dp,dq,de].map{|e| (e+ds)%360}
						if (ms*vc+cc).r<r1 #始点が円内
							puts "ci "+ccn.to_a.join(" ")+" #{r2*n} #{ds} #{de} 1.0 #{(cj+rd)%360.0}"
						end
					end
				end
			end
		end
	elsif jw.match(/^(c[hvsrptkz2])/) #文字列処理
		#円の内外に関わらず文字列を削除したい場合は
		#次の行の先頭の#を削除してコメントアウトを解除する
		#next
		jch=jw.split(" ")
		vs,ve=jch[1..4].map{|e| e.to_f}.
			each_slice(2).map{|e| Vector.elements(e)}
		vs=vs-v0
		jc0,jc5=jch[0],jch[5][1..-1]
		vb=Matrix[[0,-1],[1,0]]*ve #90°回転
		vh=kouten(vo,vb,vs,vs+ve) #円の中心から線への垂点
		if vh.r<r1
			vp= ve*sqrt(r1**2-(vh.r)**2)*(1.0/ve.r)+vh
			vq=-ve*sqrt(r1**2-(vh.r)**2)*(1.0/ve.r)+vh
			dq,dp,jc5n=0,0,""
			if vs.r<r1 && (ve-vs).r<r1 #始点と終点が円内(q,s,e,p)
				jc5n=jc5
				vsn=vs
			elsif vs.r<r1 #始点が円内(q,s,p,e)
				jc5.each_char{|e|
					if (vp-vs).r>dp
						dp+=(e.bytesize==1 ? fcw*0.5+fcd*0.5 : fcw+fcd)
						jc5n+=e
					end}
				vsn=vs
			elsif (ve-vs).r<r1 #終点が円内(s,q,e,p)
				jc5.each_char{|e|
					if (vq-vs).r>dq
						dq+=(e.bytesize==1 ? fcw*0.5+fcd*0.5 : fcw+fcd)
					else
						jc5n+=e
					end}
				vsn=vs+ve*dq/ve.r
			elsif ve.dot(vq-vs)>0 && ve.dot(vp-vs)>0 #始点と終点が円を横切る(s,q,p,e)
				jc5.each_char{|e|
					if (vq-vs).r>dq
						dq+=(e.bytesize==1 ? fcw*0.5+fcd*0.5 : fcw+fcd)
						dp=dq
					elsif (vp-vs).r>dp
						dp+=(e.bytesize==1 ? fcw*0.5+fcd*0.5 : fcw+fcd)
						jc5n+=e
					end}
				vsn=vs+ve*dq/ve.r
			end
			if vsn #円外の文字は書き出さない
				if opt==1
					vsn,ven=vsn+v0,mk*ve
				else
					vsn,ven=mx*vsn,mx*ve
				end
				puts "cn0 #{fcw*n} #{fch*n} #{fcd*n} #{fcc.to_i}" unless n==1.0
				puts %Q|#{jc0} #{vsn[0]} #{vsn[1]} #{ven[0]} #{ven[1]} "#{jc5n}|
			end
		end
	else
		puts jw
	end}
__END__

:END
anonymous
Anonymous
2021年04月14日
Medicine information sheet. What side effects can this medication cause? generic flomax https://flomax4u.top in Canada All what you want to know about medicine. Read here.
anonymous
Anonymous
2021年04月19日
Medication prescribing information. Cautions. <a href="https://toplyrica.top">how can i get cheap pregabalin pills</a> in US Some what you want to know about medicines. Get here.
anonymous
Anonymous
2021年04月29日
Pills information leaflet. Effects of Drug Abuse. <a href="https://lyricainfo.top">order lyrica no prescription</a> in Canada Some about drug. Read information here.
anonymous
Anonymous
2021年04月30日
tadalafil vs cialis <a href="https://mycialistabs.com/">is there a generic cialis available in the us</a> prescription free cialis
anonymous
Anonymous
2021年04月30日
canadian pharmacy online cialis <a href="https://mycialistabs.com/">liquid cialis</a> purchase cialis online
anonymous
Anonymous
2021年05月02日
does cialis lower blood pressure <a href="https://toptadalafiltabs.com/">buying tadalafil online</a> how long does 5mg cialis last
anonymous
Anonymous
2021年05月03日
cialis tablet <a href="https://toptadalafiltabs.com/">cialis com</a> where to get cialis
anonymous
Anonymous
2021年05月04日
how to write a film title in an essay <a href="https://topessaywriterfas.com/">write my essay online</a> write an essay about how the literature of america has changed over time
anonymous
Anonymous
2021年05月05日
help me write an essay <a href="https://topessaywriterfas.com/">college essay introduction</a> how to write an essay in french
anonymous
Anonymous
2021年05月06日
best essay writking service <a href="http://writemyessayslfd.com/">write essays for me</a> criterion online essay evaluation service
anonymous
Anonymous
2021年05月06日
roman viagra <a href="https://mrviagrashop.com">herbal viagra</a> canada viagra
anonymous
Anonymous
2021年05月07日
common app community service essay <a href="http://writemyessayslfd.com/">what to write about in a college essay</a> essay academic service
anonymous
Anonymous
2021年05月07日
sildenafil 50 mg <a href="https://mrviagrashop.com">viagra alternative</a> where to buy viagra
anonymous
Anonymous
2021年05月07日
cheap viagra <a href="https://mysildenafilkr.com/">generic viagra</a> viagra alternative
anonymous
Anonymous
2021年05月07日
female viagra pills <a href="https://mysildenafilkr.com/">20 mg sildenafil</a> viagra 100mg street price
anonymous
Anonymous
2021年05月11日
cialis over the counter <a href="http://tadalafilled.com/">no prescription cialis</a> cheapest cialis 20 mg
anonymous
Anonymous
2021年05月11日
resume skills and abilities <a href="http://coverletterforresumetop.com/">resume consultant near me</a> job skills for resume
anonymous
Anonymous
2021年05月12日
cheap cialis 20mg <a href="http://tadalafilled.com/">does cialis make you bigger</a> where to buy cialis online
anonymous
Anonymous
2021年05月12日
law school resume <a href="http://coverletterforresumetop.com/">professional resume and cover letter services</a> pharmacist cover letter
anonymous
Anonymous
2021年05月12日
data scientist resume <a href="https://writingacoverletteronline.com/">resume help services</a> resume download
anonymous
Anonymous
2021年05月13日
marketing manager resume <a href="https://writingacoverletteronline.com/">i need help with my resume</a> attorney resume
anonymous
Anonymous
2021年05月13日
womens viagra <a href="https://edviagramaster.net/">herb viagra for sale</a> sildenafil 100
anonymous
Anonymous
2021年05月14日
sildenafil <a href="https://edviagramaster.net/">generic viagra price</a> womens viagra
anonymous
Anonymous
2021年05月15日
female viagra <a href="https://sildenafilviagratop.com">viagra cock</a> viagra for sale
anonymous
Anonymous
2021年05月15日
cialis 40 mg <a href="https://cialisortadalafil.com/">discount cialis</a> does daily cialis lower blood pressure
anonymous
Anonymous
2021年05月16日
viagra strain <a href="https://sildenafilviagratop.com">sildenafil 100mg online</a> viagra cock
anonymous
Anonymous
2021年05月16日
when to take cialis <a href="https://cialisortadalafil.com/">tadalafil 5 mg</a> does medicare cover cialis
anonymous
Anonymous
2021年05月16日
viagra vs. cialis <a href="https://topcialistabs.com/">buy tadalafil</a> how to get cialis prescription
anonymous
Anonymous
2021年05月17日
cialis price per pill <a href="https://topcialistabs.com/">what is the difference between viagra and cialis</a> purchasing cialis
anonymous
Anonymous
2021年05月18日
Medicine information. Effects of Drug Abuse. <a href="https://topregabalin.top">generic pregabalin no prescription</a> in US Best news about meds. Read information now.
anonymous
Anonymous
2021年05月21日
<a href="https://5bz.ru/">базы предприятий россии +по отраслям скачать бесплатно</a>
anonymous
Anonymous
2021年06月01日
Drug information leaflet. Generic Name. <a href="https://tizanidine4u.top">generic tizanidine no prescription</a> in Canada All information about meds. Get here.
Output