#!/bin/bash SRC="tube.dat" DST="result.dat" DBG="debug.dat" IMG="debug.png" rm -f $DST rm -f $DBG rm -f $IMG awk -v DST=$DST -v DBG=$DBG ' function getSurface(s1,s2,s3, S) { S[A] = ((s2[Y]-s1[Y])*s3[Z]+(s1[Y]-s3[Y])*s2[Z]+(s3[Y]-s2[Y])*s1[Z]); S[B] = ((s1[X]-s2[X])*s3[Z]+(s3[X]-s1[X])*s2[Z]+(s2[X]-s3[X])*s1[Z]); S[C] = ((s2[X]-s1[X])*s3[Y]+(s1[X]-s3[X])*s2[Y]+(s3[X]-s2[X])*s1[Y]); S[D] = (s2[X]*s1[Y]-s1[X]*s2[Y])*s3[Z]+(s1[X]*s3[Y]-s3[X]*s1[Y])*s2[Z]+(s3[X]*s2[Y]-s2[X]*s3[Y])*s1[Z]; } function getLength(S,p) { a = (S[A]*p[X]+S[B]*p[Y]+S[C]*p[Z]+S[D]); b = sqrt(S[A]*S[A]+S[B]*S[B]+S[C]*S[C]); return a/b; } function solve(s1,s2,s3,s4,s5,s6, p1,p2, l,i) { getSurface(s1,s2,s3, S1); getSurface(s4,s5,s6, S2); l0=getLength(S1,p1); l1=getLength(S2,p1); l2=getLength(S1,p2); l3=getLength(S2,p2); ll[i+0] = l[i+0]; ll[i+1] = l[i+1]; l[i+0]=l0*l1; l[i+1]=l2*l3; cnt=cnth=0; if(l[i+0]<0) cnth++; if(l[i+1]<0) cnth++; if(l[i+0]<-1E-20) cnt++; if(l[i+1]<-1E-20) cnt++; if(cnt==2) return 1; if(cnt==1&&cnth==2) return 1; if(cnt>=1) { if(ll[i+0]<0) cnth++; if(ll[i+1]<0) cnth++; if(ll[i+0]<-1E-20) cnt++; if(ll[i+1]<-1E-20) cnt++; if(cnt>=2) return 1; if(cnt==1&&cnth>=2) return 1; } return 0; } BEGIN{ i=0;count=0; X=0;Y=1;Z=2; A=0;B=1;C=2;D=3; } /^#/{next} { if(NF!=20) next; if(i!=0) { s4[X]=$12-b1[X]; s4[Y]=$13-b1[Y]; s4[Z]=$14-b1[Z]; s5[X]=$15-b1[X]; s5[Y]=$16-b1[Y]; s5[Z]=$17-b1[Z]; s6[X]=$18-b1[X]; s6[Y]=$19-b1[Y]; s6[Z]=$20-b1[Z]; res = 0; res1=solve(s1,s2,s3,s4,s2,s3, s5,s6, l,0); res2=solve(s1,s2,s3,s1,s5,s3, s4,s6, l,2); res3=solve(s1,s2,s3,s1,s2,s6, s4,s5, l,4); res4=solve(s4,s5,s6,s1,s5,s6, s2,s3, l,6); res5=solve(s4,s5,s6,s4,s2,s6, s1,s3, l,8); res6=solve(s4,s5,s6,s4,s5,s3, s1,s2, l,10); if(res1||res4) res++; if(res2||res5) res++; if(res3||res6) res++; printf i " " $1 " " > DBG for(j=0;j<12;j++) printf l[j] " " > DBG print res > DBG if(res!=0) { count++; print i, $1, res > DST } } b1[X]=$12; b1[Y]=$13; b1[Z]=$14; s1[X]=$12-b1[X]; s1[Y]=$13-b1[Y]; s1[Z]=$14-b1[Z]; s2[X]=$15-b1[X]; s2[Y]=$16-b1[Y]; s2[Z]=$17-b1[Z]; s3[X]=$18-b1[X]; s3[Y]=$19-b1[Y]; s3[Z]=$20-b1[Z]; i++ } END{print "count:", count > DST} ' $SRC function paint() { W=$(tail -n 1 $DBG | awk '{print $1}') H=`awk 'BEGIN{max=0} END{print max/20} {cur=($2+$3+$4+$5+$6+$7)/6; if(max