hirax.net::Keywords::「ソースコード」のブログ



2009-04-18[n年前へ]

ソースコード(実体参照)変換フォーム 

 ソースコードをHTMLとして貼り付けるときに便利な、ソースに含まれる「<」・「>」・「"」などの記号を実体参照に一括変換してくれる「ソースコード(実体参照)変換フォーム

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

2009-04-26[n年前へ]

win32GuiTest.rb にコマンドプロンプトを閉じる関数を追加する 

Windows上のRubyで、さまざまな(雑多な)GUI関係の操作を簡単に行うことができるライブラリ、win32GuiTest.rbに、ひとつ関数を増やしておきました。増やした関数は"closeComandWindowLikeName"という名前の、指定した文字列が含まれるコマンドプロンプトのWindowをすべて閉じる、というものになります。

 たとえば、下記のようなスクリプトを書けば、Windowタイトル中に"mongrel"という文字列を含むコマンドプロンプトをすべて閉じ・終了させます。

require 'win32GuiTest'
gui=Win32GuiTest.new
gui.closeComandWindowLikeName('mongrel')
 ちなみに、closeComandWindowLikeName('mongrel',3)と書けばウィンドゥを閉じるための毎キー操作につき、3秒の時間間隔を使います。何も指定しなければ、キー操作の時間間隔は2秒になります。

 この程度の機能であれば自分で作る人の方が多いでしょうし、そもそもこんな機能を使うという人がいるかどうかは…怪しいところですが、とりあえず、何かの役に立つかもしれませんのでライブラリとしてソースコードを置いておくことにします。

2009-07-31[n年前へ]

アポロ11号のソースコード 

 「アポロ11号のソースコード

 このソースコードには,オリジナルのアセンブリコードに記されていたラベルやコメントまでしっかり転記されている。それらの記述に目を通していると,そのコードを書いた人の考えや気持ちが伝わってくるようで面白い。

2010-02-02[n年前へ]

数種の言語による「粒子法のサンプル・プログラム」 

 数種の言語による「粒子法のプログラム

 粒子法のプログラムを実装しようとしたのですが、論文や本だと数式レベルでしか説明がなく、それをプログラムにして動くようにするまで苦労しました。数式をプログラムに落とすこと自体は簡単なのですが、各定数の値が分からなかったりして、粒子が上手く動いてくれるまで大変でした。
 なので、同じところでつまづく人も多いのではと思い、自分が書いた粒子法のプログラムを紹介しようと思います。下の動画を作ったときのプログラムです。ry版のコードがあります)



■Powered by yagm.net