« 面スタイルからX線 | トップページ | 円弧ツールで花瓶 »

2008年4月15日 (火)

R面取り(3辺)

2本の平行線と直交線の3辺をR面取りする外部変形です。

080414_cnr 

平行線1 ⇒ 平行線2 ⇒ 直交線 の順に(L)クリックしてください。

平行線1の指示点から直交線側がトリムされ、平行線1の線色で作図されます。
平行線でない場合、直交線でない場合は、未実行になります。

--------------------
@REM R面取り(3辺)
@echo off
REM
REM #jww
REM #cd
REM #1ln 平行線1を指示してください
REM #2ln 平行線2を指示してください
REm #3ln 直交線を指示してください
REM #hr
REM #e
REM
jgawk -f corner.awk jwc_temp.txt>temp.txt
copy temp.txt jwc_temp.txt
del temp.txt
--------------------

<corner_awk>
--------------------
### R面取り(3辺)
###
###初期設定
BEGIN{pi=atan2(0,-1);k=10000}
###座標/角度取得
#指示点座標
/^hp1/{xx=$2;yy=$3}
#線色(平行線1)
/^#/,/^hhp1ln/{if(substr($1,1,2)=="lc"){lc=$1}}
#座標/角度(平行線1)
/^hhp1ln/,/^hhp2ln/{
if(NF==4){if($1>$3){x11=$3;y11=$4;x12=$1;y12=$2}else{x11=$1;y11=$2;x12=$3;y12=$4}}
if(x11==x12){if(y11>y12){y11=$4;y12=$2;ang1=90}else{ang1=90}}
if(y11==y12){ang1=0}
if(x11!=x12 && y11!=y12){a1=(y12-y11)/(x12-x11);b1=y11-a1*x11;an1=atan2(y12-y11,x12-x11);
ang1=an1*180/pi;ang1=ang1*k;ang1=rnd(ang1)/k}
}
#座標/角度(平行線2)
/^hhp2ln/,/^hhp3ln/{
if(NF==4){if($1>$3){x21=$3;y21=$4;x22=$1;y22=$2}else{x21=$1;y21=$2;x22=$3;y22=$4}}
if(x21==x22){if(y21>y22){y21=$4;y22=$2;ang2=90}else{ang2=90}}
if(y21==y22){ang2=0}
if(x21!=x22 && y21!=y22){a2=(y22-y21)/(x22-x21);b2=y21-a2*x21;an2=atan2(y22-y21,x22-x21);
ang2=an2*180/pi;ang2=ang2*k;ang2=rnd(ang2)/k}
}
#座標/角度(直交線)
/^hhp3ln/,/NF==0/{
if(NF==4){if($1>$3){x31=$3;y31=$4;x32=$1;y32=$2}else{x31=$1;y31=$2;x32=$3;y32=$4}}
if(x31==x32){if(y31>y32){y31=$4;y32=$2;ang3=90}else{ang3=90}}
if(y31==y32){ang3=180}
if(x31!=x32 && y31!=y32){a3=(y32-y31)/(x32-x31);b3=y31-a3*x31;an3=atan2(y32-y31,x32-x31);
ang3=an3*180/pi;ang3=ang3*k;ang3=rnd(ang3)/k}
}
#水平方向
{if(x31==x32){xc=x31;yc1=y11;yc2=y21;yc=(yc1+yc2)/2;r=abs(yc1-yc2)/2}
if(xx>xc){x0=xc+r;y0=yc;
xs1=x0;ys1=y11;xe1=x12;ye1=y11;
xs2=x0;ys2=y21;xe2=x22;ye2=y21;
ths=90;the=270}
if(xx<xc){x0=xc-r;y0=yc;
xs1=x0;ys1=y11;xe1=x11;ye1=y11;
xs2=x0;ys2=y21;xe2=x21;ye2=y21;
ths=270;the=90}
}
#垂直方向
{if(y31==y32){yc=y31;xc1=x11;xc2=x21;xc=(xc1+xc2)/2;r=abs(xc1-xc2)/2}
if(y31==y32 && yy>yc){x0=xc;y0=yc+r;
xs1=x11;ys1=y0;xe1=x11;ye1=y12;
xs2=x21;ys2=y0;xe2=x21;ye2=y22;
ths=180;the=0}
if(y31==y32 && yy<yc){x0=xc;y0=yc-r;
xs1=x11;ys1=y0;xe1=x11;ye1=y11;
xs2=x21;ys2=y0;xe2=x21;ye2=y21;
ths=0;the=180}
}
#任意角度
{if(x31!=x32 && y31!=y32){
xc1=(b3-b1)/(a1-a3);yc1=a1*xc1+b1;
xc2=(b3-b2)/(a2-a3);yc2=a2*xc2+b2;
D2=(xc1-xc2)^2+(yc1-yc2)^2;D=sqrt(D2);r=D/2;
xc=(xc1+xc2)/2;yc=(yc1+yc2)/2;
dx=r*cos(an1);dy=r*sin(an1)}
if(x31!=x32 && y31!=y32 && xx>xc1){x0=xc+dx;y0=yc+dy;
xs1=xc1+dx;ys1=yc1+dy;xe1=x12;ye1=y12;
xs2=xc2+dx;ys2=yc2+dy;xe2=x22;ye2=y22;
ths=ang1+90;the=ang1+270}
if(x31!=x32 && y31!=y32 && xx<xc1){x0=xc-dx;y0=yc-dy;
xs1=xc1-dx;ys1=yc1-dy;xe1=x11;ye1=y11;
xs2=xc2-dx;ys2=yc2-dy;xe2=x21;ye2=y21;
ths=ang1+270;the=ang1+90}
}
###作図
END{
dth=abs(ang3-ang1);
if(ang1!=ang2 || dth!=90){print "hq";exit};
print "hd";
print lc;
printf "%.15g %.15g %.15g %.15g\n",xs1,ys1,xe1,ye1;
printf "%s %.15g %.15g %.15g %.15g %.15g %d %d\n","ci",x0,y0,r,ths,the,1,0;
printf "%.15g %.15g %.15g %.15g\n",xs2,ys2,xe2,ye2
}
###定義関数
#絶対値
function abs(x){if(x<0){return -x}{return x}}
#四捨五入
function rnd(x){if(x>=0){return int(x+0.5)}else{return -int(-x+0.5)}}

|

« 面スタイルからX線 | トップページ | 円弧ツールで花瓶 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/94529/40883411

この記事へのトラックバック一覧です: R面取り(3辺):

« 面スタイルからX線 | トップページ | 円弧ツールで花瓶 »