▼yamaさん:
>(Xn+1 - Xn-1)・Ynを電卓等で計算してみましたが、計算結果が微妙に違います。
>表示されている座標値は小数3桁ですが、その数値を使うと小数第2位で違って来る場合があります。
>座標計測で有効桁を"F"として、少数以下計算桁数を4、5、6桁として計算してみたのですが、結果の小数4位以下が合いません。
>多少違っても、実用上は問題ありませんが、結果が違うのは気持ちのよいものではありません。
>少数以下有効何桁で計算しているのでしょうか。
個人的には、そんな細かいことを気にしなくても? と思いますが。
(以下、修正版)
@REM 座標面積計算表の修正
@echo off
REM #jww
REM #cd
REM #ht10
REM #ht20
REM #ht30
REM #ht40
REM #h1
REM #hc座標面積計算表を範囲選択してください
REM #hp
REM #e
copy jwc_temp.txt temp.txt > nul
ruby -x %~f0 temp.txt > jwc_temp.txt
pause
goto end
#!ruby -Ks
x_array=[]#縦線x座標値の収集用
y_array=[]#横線y座標値の収集用
tatesen=[];yokosen=[]
ch=0
while ARGF.gets
xy=$_.split
if xy[0] =~ /^\d|^-/
xy.collect!{|item|item.to_i}
if xy[0]>xy[2]
xy[0],xy[2],xy[1],xy[3]=xy[2],xy[0],xy[3],xy[1]
elsif xy[0]==xy[2]
xy[1],xy[3]=xy[3],xy[1] if xy[1]>xy[3]
end
if xy[0]==xy[2]
x_array<<xy[0]#縦線x座標値の収集
tatesen<<xy
end
if xy[1]==xy[3]
y_array<<xy[1]#横線y座標値の収集
yokosen<<xy
end
end
ch +=1 if xy[0] =~ /^ch/
end
if ch==0
printf("h#文字が選択されていません\n")
exit
end
#x座標値を小さい順にソート
x_array.sort!{|a,b|a<=>b}
#y座標値を大きい順にソート
y_array.sort!{|a,b|b<=>a}
tatesen.sort!{|a,b|a[0]<=>b[0]}
yokosen.sort!{|a,b|b[1]<=>a[1]}
x_array.uniq!#重複する要素の削除
y_array.uniq!#重複する要素の削除
tatesen.uniq!
yokosen.uniq!
#配列(array)に枠(セル)の座標値[左下x,左下y,右上x,右上y]を収集
array=[]
0.upto(y_array.size-2){|i|
array2=[]
0.upto(x_array.size-2){|j|
array2<<[x_array[j],y_array[i+1],x_array[j+1],y_array[i]]
}
array<<array2
}
#表内文字の収集要配列(array2)の初期化
array2=[]
array.each{|item|
array3=[]
item.each{|item2|
x=item2[0]+(item2[2]-item2[0])/2
y=item2[1]+(item2[3]-item2[1])/2
array3<<[x,y,"","ch"]
}
array2<<array3
}
puts "hd"
#配列(array2)に表内文字の収集
mmx=0;mmy=0;tani="";zahyo=[]
open("temp.txt","r"){|f|
while line=f.gets
xy=line.split
if xy[0]=~/^hq/
elsif xy[0] =~ /^c[hv]/
moji=$'.chomp if $_ =~ /\"/
i=0;n=0
array.each{|item|
j=0
item.each{|item2|
if xy[1].to_f>item2[0] && xy[2].to_f>item2[1] && xy[1].to_f<item2[2] && xy[2].to_f<item2[3]
array2[i][j]=[xy[1].to_f,xy[2].to_f,moji,xy[0]]
n = 1
break
end
j += 1
}
break if n==1
i += 1
}
if xy[1].to_f>x_array[-2] && xy[1].to_f<x_array[-1] && xy[2].to_f<y_array[1] && xy[2].to_f>y_array[-1] or moji=~/m\^u2/
if moji=~/[^0-9]*m\^u2/
mmx=xy[1].to_f;mmy=xy[2].to_f;tani=$&
end
zahyo<<[xy[1].to_f,xy[2].to_f] if moji !~/m\^u2/
else
print $_
end
else
print $_
end
end
}
zahyo.sort!{|a,b|b[1]<=>a[1]}
x_m_a=[];y_m_a=[]
1.upto(array2.size-3){|i|
x_m_a<<array2[i][1][2]
y_m_a<<array2[i][2][2]
}
t_s=0
0.upto(y_m_a.size-1){|i|
if i==0
x1=x_m_a[-1].to_f
else
x1=x_m_a[i-1].to_f
end
if i==x_m_a.size-1
x2=x_m_a[0].to_f
else
x2=x_m_a[i+1].to_f
end
s=(x2-x1)*(y_m_a[i].to_f)
ms=sprintf("%.6f",s)
printf("ch %.11f %.11f 1 0 \"%s\n",zahyo[i][0],zahyo[i][1],ms)
t_s += ms.to_f
}
yh=array2[0][0][1]-array2[1][0][1]
printf("ch %.11f %.11f 1 0 \"%.6f\n",zahyo[-2][0],zahyo[-2][1],t_s)
printf("ch %.11f %.11f 1 0 \"%.6f\n",zahyo[-1][0],zahyo[-1][1],t_s/2)
#printf("ch %.11f %.11f 1 0 \"%.2f%s\n",mmx,mmy,t_s/2,tani) if mmx
t_s2=sprintf("%.2f",(t_s/2*100).floor/100.0)
printf("ch %.11f %.11f 1 0 \"%s%s\n",mmx,mmy,t_s2,tani) if mmx
__END__
:end