@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_x1en[1]+r* cos(kakudo1+sen_kakudo2) or sen_y1en[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_x1en[2]+r* sin(kakudo2+sen_kakudo2) && sen_y10 return zahyo else return nil end end #tenの位置がenの内(true)か、外(false)かを判定 def area(en,ten) zahyo=[] zahyo<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<