2009-04-18[n年前へ]
■RubyのArrayクラスに法線・法線角度・ヒストグラム算出メソッドを追加する 
体を使った運動では、運動をしない期間が続くと、必ず体を思うように動かすことができなくなります。それと同じように、頭を使った運動でも、(自分自身の頭と”手を”動かすような)運動をしない期間が生じると、悲しいほどに「頭の運動能力・バランス感覚」が劣化してしまうものです。逆にいえば、「頭の運動能力・バランス感覚」を保てるかどうかは、自分自身の頭と”手を”動かし続けているか否か、だと思っています。
ふと気づくと、Rubyのコードを1月くらい書いていません。そこで、RubyのArrayクラスで法線・法線角度・ヒストグラムを算出することができるメソッド・コードを書いてみました。たとえば、下のようなコードを書くと、二次元配列を表面形状と考えた上で(XYのメッシュ間隔は horizontal_resolution により定義します)、その法線が天頂となす角度を計算し、さらに0~90度までのヒストグラムを作成し、出力することができます。Rubyで法線算出などをしたいという人は少ない(というよりほとんどいない)とは思いますが、ニッチということは希少ということでもあるわけで、参考までにここに書いておきます。
require 'pp'
a=[[0,0,0],
[0,1,0],
[0,0,0]]
pp a.normalVector(1).slopeDegree.histogram
ソースコードは下のようになります。不具合などありましたら、教えて頂ければ幸いです。
class Array
# jun hirabayashi jun@hirax.net
# http://www.hirax.net/
# 2009.04.19
include Math
def normalVector(horizontal_resolution)
# horizontal_resolution=size of xy mesh
normal_vector=[]
ysize=self.length
xsize=self[1].length
(ysize-1).times{|y|
normal_vects_line=[]
(xsize-1).times{|x|
v1=[0,horizontal_resolution,
self[y+1][x].to_f-self[y][x].to_f]
v2=[horizontal_resolution,0,
self[y][x+1].to_f-self[y][x].to_f]
a_norml_vec=[(v1[1]*v2[2]-v1[2]*v2[1]),
(v1[2]*v2[0]-v1[0]*v2[2]),
-(v1[0]*v2[1]-v1[1]*v2[0])]
length=sqrt(a_norml_vec[0]*a_norml_vec[0]+
a_norml_vec[1]*a_norml_vec[1]+
a_norml_vec[2]*a_norml_vec[2])
a_norml_vec=[a_norml_vec[0]/length,
a_norml_vec[1]/length,
a_norml_vec[2]/length]
normal_vects_line<<a_norml_vec
}
normal_vector<<normal_vects_line
}
return normal_vector
end
def slopeDegree
slope_degrees=[]
self.each{|line|
slope_degrees_line=[]
line.each{|val|
theta=1.0*val[2]*360.0/(2.0*PI)
slope_degrees_line<<theta
}
slope_degrees<<slope_degrees_line
}
return slope_degrees
end
def histogram
histo=Array.new(90){0}
self.each{|line|
line.each{|val|
deg=val.to_i
if 0<=val && val<90
histo[deg]+=1
end
}
}
return histo
end
end
■Powered
by yagm.net