直方体の他に、
- 円筒 (Cylinder)
- 円錐 (Cone)
- 球 (Sphere)
を追加しました。円筒・円錐それぞれのサポート写像には GJK アルゴリズムで使用するものをそのまま利用しています。 Gino van den Bergen 氏の著作が参考になります。
凸多面体同士の交差判定/接触点情報の算出を行う Minkowski Portal Refinement (MPR) アルゴリズム の実験プログラムです。
140文字を超える(Longer Than 140 symbols)文書を書きたくなった時に更新されます。 by vaiorabbit
Section "Module" Load "dbe" Load "extmod" Load "fbdevhw" Load "freetype" Load "type1" #Load "dri" Load "glx" # ←この行を追記 EndSection
[root@localhost ~] yum install freeglut ... [root@localhost ~] yum install freeglut-devel
[root@localhost tmp] wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.9.0-4.tar.bz2 ... [root@localhost tmp] tar xvjf ruby-1.9.0-4.tar.bz2 ... [root@localhost tmp] cd ruby-1.9.0-4 ... [root@localhost ruby-1.9.0-4] ./configure --program-suffix=19 ... [root@localhost ruby-1.9.0-4] make && make install
[root@localhost ~] gem19 install ruby-opengl
[lt140@localhost tmp] wget http://sites.google.com/site/ltsevenscore/archives/glxsruby-20091223.7z
... [lt140@localhost tmp] 7z x glxsruby-20091223.7z ... [lt140@localhost tmp] cd glxsruby ... [lt140@localhost glxsruby] ruby19 glxs.rb -s 9
id:5:initdefault:
id:3:initdefault:
[root@localhost tmp] wget http://prdownloads.sourceforge.net/fluxbox/fluxbox-1.0.0.tar.bz2 ... [root@localhost tmp] tar xvjf fluxbox-1.0.0.tar.bz2 ... [root@localhost tmp] cd fluxbox-1.0.0 ... [root@localhost fluxbox-1.0.0] ./configure ... [root@localhost fluxbox-1.0.0] make && make install ...
/usr/local/bin/fluxbox
[root@localhost ~] chkconfig --level 35 sendmail off ...
[root@localhost ~] chkconfig --level 35 NetworkManager off ... [root@localhost ~] chkconfig --level 35 NetworkManagerDispatcher off ...
[root@localhost ~]$ /usr/sbin/ps3-boot-game-os
D:\tmp>ruby -v ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mswin32_90]
D:\tmp\RubySDL\rubysdl-2.1.0\sample>ruby randrect.rb
#define WIN32_LEAN_AND_MEAN #include#define APP_NAME "UseRubyDLL.exe" #define RUBY_DLL_NAME "d:\\ruby19\\bin\\msvcr90-ruby190.dll" #define RUBY_SCRIPT_NAME "script.rb" HINSTANCE ruby_dll; /* from include/ruby/ruby.h */ void (*ruby_init)( void ); void (*ruby_sysinit)( int*, char*** ); void* (*ruby_options)( int, char** ); /* from include/ruby/intern.h */ void (*ruby_init_loadpath)( void ); int (*ruby_run_node)( void* ); void WinMainCRTStartup() { /* Dummy arguments for ruby_sysinit(). */ int sysinit_argc = 0; char** sysinit_argv = NULL; /* Manually construct interpreter arguments. */ int app_argc = 3; char* app_args[3]; char** app_argv = app_args; app_args[0] = APP_NAME; app_args[1] = RUBY_SCRIPT_NAME; app_args[2] = "See ya."; ruby_dll = LoadLibrary( RUBY_DLL_NAME ); if ( ruby_dll ) { ruby_sysinit = (void (*)( int*, char*** ))GetProcAddress( ruby_dll, "ruby_sysinit" ); ruby_init = (void (*)( void ))GetProcAddress( ruby_dll, "ruby_init" ); ruby_init_loadpath = (void (*)( void ))GetProcAddress( ruby_dll, "ruby_init_loadpath" ); ruby_options = (void* (*)( int, char** ))GetProcAddress( ruby_dll, "ruby_options" ); ruby_run_node = (int (*)( void* ))GetProcAddress( ruby_dll, "ruby_run_node" ); ruby_sysinit( &sysinit_argc, &sysinit_argv ); ruby_init(); ruby_init_loadpath(); ruby_run_node( ruby_options( app_argc, app_argv ) ); /* NOTE: After the execution, +ruby_run_node+ automatically calls +ruby_cleanup+. So there's no need to explicitly call Ruby's finalizer here(otherwise cause disaster). */ FreeLibrary( ruby_dll ); } }
require 'matrix' File.open( 'result.txt', 'w' ) do |f| f.puts Time.now f.puts Vector[rand,100*rand,10000*rand] f << ARGV end
$ ./UseRubyDLL
2008-08-03 18:52:16 +0900 Vector[0.434646515113465, 27.44515575993, 9534.51425972162] ["See ya."]
TARGET = UseRubyDLL.exe SRC = $(TARGET:exe=c) OBJ = $(TARGET:exe=o) CC = gcc -mno-cygwin -mwindows CFLAGS = -Wall -Os LDFLAGS = -lkernel32 -nostdlib all: $(TARGET) $(TARGET): $(OBJ) $(CC) -o $(TARGET) $< $(LDFLAGS) strip $(TARGET) clean: rm $(OBJ) $(TARGET) .c.o: $(CC) $(CFLAGS) -c $<
$ gcc --version gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. kazuwe@kazuwe-PC ~/UseRubyDLL $ ls -l UseRubyDLL.exe -rwxr-xr-x 1 kazuwe None 2560 Aug 3 18:58 UseRubyDLL.exe
C:\Windows\system32>d: D:\>cd cygwin D:\cygwin>
D:\cygwin>takeown /f * /r 成功: ファイル (またはフォルダ): "D:\cygwin\bin" は現在ユーザー "lt140-PC\lt140" によって所有されています。 成功: ファイル (またはフォルダ): "D:\cygwin\cygdrive" は現在ユーザー "lt140-PC\lt140" によって所有されています。 成功: ファイル (またはフォルダ): "D:\cygwin\Cygwin.bat" は現在ユーザー "lt140-PC\lt140" によって所有されています。 成功: ファイル (またはフォルダ): "D:\cygwin\Cygwin.ico" は現在ユーザー "lt140-PC\lt140" によって所有されています。 成功: ファイル (またはフォルダ): "D:\cygwin\dev" は現在ユーザー "lt140-PC\lt140" によって所有されています。 ...(以下略)
D:\cygwin>icacls D:\cygwin /grant lt140:F /t 処理ファイル: D:\cygwin\bin 処理ファイル: D:\cygwin\cygdrive 処理ファイル: D:\cygwin\Cygwin.bat 処理ファイル: D:\cygwin\Cygwin.ico 処理ファイル: D:\cygwin\dev 処理ファイル: D:\cygwin\etc 処理ファイル: D:\cygwin\lib 処理ファイル: D:\cygwin\setup.exe 処理ファイル: D:\cygwin\tmp ...(以下略)
Visual C++ ライブラリ DLL (MSVCR80.DLL など) に到達できた場合 (アプ リケーションのローカル フォルダまたはシステム フォルダにインストール されている場合など)、次のメッセージが表示されます。 R6034 An application has made an attempt to load the C runtime library incorrectly.
すべての DLL がバイナリに埋め込まれたマニフェストを持つようにすることを お勧めします。DLL が LoadLibrary 呼び出しで読み込まれる場合、外部マニフェストは 無視されます。
C/C++ アプリケーション (またはライブラリ) では、そのマニフェストを 最終的なバイナリに埋め込んでおくことをお勧めします。これにより、ほとんどの シナリオで実行時の適切な動作が保証されます。
$ gem.bat install wxruby Bulk updating Gem source index for: http://gems.rubyforge.org Building native extensions. This could take a while... Successfully installed wxruby-1.9.7-x86-mswin32-60 1 gem installed
$ ruby -rubygems d\:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.7-x86-mswin32-60/samples/minimal/minimal.rb
--------------------------- Microsoft Visual C++ Runtime Library --------------------------- Runtime Error! Program: d:\ruby\bin\ruby.exe R6034 An application has made an attempt to load the C runtime library incorrectly. Please contact the application's support team for more information. --------------------------- OK ---------------------------
d:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.7-x86-mswin32-60/lib/wxruby2.so: 1114: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。 - d:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.7-x86-mswin32-60/lib/wxruby2.so (LoadError) from d:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' from d:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.7-x86-mswin32-60/lib/wx.rb:12 from d:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in `gem_original_require' from d:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in `require' from d:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.7-x86-mswin32-60/samples/minimal/minimal.rb:8
$ cd d\:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.7-x86-mswin32-60/lib/ $ ls wx wx.rb wxruby2.exp wxruby2.lib wxruby2.so wxruby2.so.manifest
$ strings wxruby2.so | grep manifest $
Setting environment for using Microsoft Visual Studio 2008 x86 tools. D:\Programs\Microsoft Visual Studio 9.0\VC>cd D:\ruby\lib\ruby\gems\1.8\gems\wxruby-1.9.7-x86-mswin32-60\lib D:\ruby\lib\ruby\gems\1.8\gems\wxruby-1.9.7-x86-mswin32-60\lib>mt -manifest wxruby2.so.manifest -outputresource:wxruby2.so;2
$ strings wxruby2.so | grep manifest
$ ruby -rubygems d\:/ruby/lib/ruby/gems/1.8/gems/wxruby-1.9.7-x86-mswin32-60/samples/minimal/minimal.rb
$ ruby -rubygems menutest.rb
$ ruby -rubygems glwidget.rb
require 'qt' require 'opengl' class GLWidget < Qt::GLWidget signals 'xRotationChanged(int)' signals 'yRotationChanged(int)' signals 'zRotationChanged(int)' slots 'setXRotation(int)' slots 'setYRotation(int)' slots 'setZRotation(int)' def initialize super @object = 0 @xRot = 0 @yRot = 0 @zRot = 0 @lastPos = Qt::Point.new @trolltechGreen = Qt::Color::fromCmykF( 0.40, 0.0, 1.0, 0.0 ) @trolltechPurple = Qt::Color::fromCmykF( 0.39, 0.39, 0.0, 0.0 ) end def destroy makeCurrent() glDeleteLists( @object, 1 ) end def minimumSizeHint return Qt::Size.new( 50, 50 ) end def sizeHint return Qt::Size.new( 400, 400 ) end def setXRotation( angle ) normalizeAngle( angle ) if ( angle != @xRot ) @xRot = angle emit xRotationChanged( angle ) updateGL() end end def setYRotation( angle ) normalizeAngle( angle ) if ( angle != @yRot ) @yRot = angle emit yRotationChanged( angle ) updateGL() end end def setZRotation( angle ) normalizeAngle( angle ) if ( angle != @zRot ) @zRot = angle emit zRotationChanged( angle ) updateGL() end end def initializeGL qglClearColor( @trolltechPurple.dark() ) @object = makeObject() glShadeModel( GL_FLAT ) glEnable( GL_DEPTH_TEST ) glEnable( GL_CULL_FACE ) end def paintGL glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) glLoadIdentity() glTranslated( 0.0, 0.0, -10.0) glRotated( @xRot / 16.0, 1.0, 0.0, 0.0 ) glRotated( @yRot / 16.0, 0.0, 1.0, 0.0 ) glRotated( @zRot / 16.0, 0.0, 0.0, 1.0 ) glCallList( @object ) end def resizeGL( width, height ) # [NOTE] +qMin+ in the original code is a C++ Template Function. # Ref.: $(QTDIR)/src/corelib/global/qglobal.h # template# inline const T &qMin(const T &a, const T &b) { if (a < b) return a; return b; } side = [width, height].min glViewport( (width - side) / 2, (height - side) / 2, side, side ) glMatrixMode( GL_PROJECTION ) glLoadIdentity() glOrtho( -0.5, +0.5, +0.5, -0.5, 4.0, 15.0 ) glMatrixMode( GL_MODELVIEW ) end def mousePressEvent( event ) # event : Qt::MouseEvent @lastPos = event.pos end def mouseMoveEvent( event ) # event : Qt::MouseEvent dx = event.x - @lastPos.x dy = event.y - @lastPos.y if ( event.buttons() & Qt::LeftButton.to_i ) setXRotation( @xRot + 8 * dy ) setYRotation( @yRot + 8 * dx ) elsif ( event.buttons() & Qt::RightButton.to_i ) setXRotation( @xRot + 8 * dy ) setZRotation( @zRot + 8 * dx ) end @lastPos = event.pos end def makeObject list = glGenLists( 1 ) glNewList( list, GL_COMPILE ) glBegin( GL_QUADS ) x1 = +0.06 y1 = -0.14 x2 = +0.14 y2 = -0.06 x3 = +0.08 y3 = +0.00 x4 = +0.30 y4 = +0.22 quad( x1, y1, x2, y2, y2, x2, y1, x1 ) quad( x3, y3, x4, y4, y4, x4, y3, x3 ) extrude( x1, y1, x2, y2 ) extrude( x2, y2, y2, x2 ) extrude( y2, x2, y1, x1 ) extrude( y1, x1, x1, y1 ) extrude( x3, y3, x4, y4 ) extrude( x4, y4, y4, x4 ) extrude( y4, x4, y3, x3 ) num_sectors = 200 for i in 0...num_sectors do angle1 = (i * 2 * Math::PI) / num_sectors x5 = 0.30 * Math::sin( angle1 ) y5 = 0.30 * Math::cos( angle1 ) x6 = 0.20 * Math::sin( angle1 ) y6 = 0.20 * Math::cos( angle1 ) angle2 = ((i + 1) * 2 * Math::PI) / num_sectors x7 = 0.20 * Math::sin( angle2 ) y7 = 0.20 * Math::cos( angle2 ) x8 = 0.30 * Math::sin( angle2 ) y8 = 0.30 * Math::cos( angle2 ) quad( x5, y5, x6, y6, x7, y7, x8, y8 ) extrude( x6, y6, x7, y7 ) extrude( x8, y8, x5, y5 ) end glEnd() glEndList() return list end def quad( x1, y1, x2, y2, x3, y3, x4, y4 ) qglColor( @trolltechGreen ) glVertex3d( x1, y1, -0.05 ) glVertex3d( x2, y2, -0.05 ) glVertex3d( x3, y3, -0.05 ) glVertex3d( x4, y4, -0.05 ) glVertex3d( x4, y4, +0.05 ) glVertex3d( x3, y3, +0.05 ) glVertex3d( x2, y2, +0.05 ) glVertex3d( x1, y1, +0.05 ) end def extrude( x1, y1, x2, y2 ) qglColor( @trolltechGreen.dark(250 + (100 * x1).to_i) ) glVertex3d( x1, y1, +0.05 ) glVertex3d( x2, y2, +0.05 ) glVertex3d( x2, y2, -0.05 ) glVertex3d( x1, y1, -0.05 ) end def normalizeAngle( angle ) while ( angle < 0 ) do angle += 360 * 16 end while ( angle > 360 * 16 ) do angle -= 360 * 16 end end end # # Application starts here. # begin a = Qt::Application.new(ARGV) w = GLWidget.new w.show a.exec ensure w.destroy end
「仕様書」と呼ぶべきかどうかはともかくとして、Ruby自身の配布ファイル の中に"lib/rdocs/README"というのが含まれています。公式のドキュメントの中で は、これが一番良く書かれたものだと思います。
Rdoc is an application that produces documentation for one or more Ruby source files.
!0 == false
なのでした。$ irb.bat irb(main):001:0> some_value = 0 => 0 irb(main):002:0> !some_value => false irb(main):003:0> some_value==0 => true irb(main):004:0>
@f_angle = Array.new(10) { Array.new(10) { Array.new(10) { 0.0 } } } ... @f_angle[i][j][k] = (100*a + 10*b + c).to_f
ary = Hash.new ... ary[[i,j,k]] = ... # ここで [i,j,k] が Array。
> (1) 動的にデバッグモードに移るようなライブラリ関数はあります > でしょうか? ruby-breakpointはどうでしょうか? breakpointと書いた時点でirbに突入します。
ruby-breakpoint lets you inspect and modify state, diagnose bugs, patch applications and more all via IRB by simply doing a method call at the place you want to investigate. It is no longer being maintained. Please consider using ruby-debug instead.
連載第二回目です。今回も引き続きRubyとCursesを使ったコンソールプログラムを作っていきます。
major, minor, micro = RUBY_VERSION.scan( /\d+/ ) if ( major == "1" && minor == "8" ) # for Ruby 1.8. width = pow2( w[0].to_i - "0"[0].to_i ) height = pow2( h[0].to_i - "0"[0].to_i ) else # for Ruby 1.9. width = pow2( w[0].unpack("U")[0].to_i - "0"[0].unpack("U")[0].to_i ) height = pow2( h[0].unpack("U")[0].to_i - "0"[0].unpack("U")[0].to_i ) end
> more mkrf_conf.rb require 'mkrf' Mkrf::Generator.new( 'RMath' )
> ruby mkrf_conf.rb
> rake -T ← 定義済みタスクを確認 (in D:/RMath) rake RMath.so # Build this extension rake clean # Remove any temporary products. rake clobber # Remove any generated file. rake install # Install this extension > rake cl -nologo -MD -Zi -O2b2xty- -ID:/ruby19/include/ruby-1.9.0 -ID:/ruby19/incl ude/ruby-1.9.0/i386-mswin32_90 -ID:/ruby19/lib/ruby/1.9.0/i386-mswin32_90 -ID:/r uby19/lib/ruby/site_ruby/1.9.0 -I. -c RMathMtx3.c RMathMtx3.c ...
> mt -manifest RMath.so.manifest -outputresource:RMath.so;2 Microsoft (R) Manifest Tool version 5.2.3790.2075 Copyright (c) Microsoft Corporation 2005. ...