<   2011年 04月 ( 13 )   > この月の画像一覧

flydrawなるものがありました。
いわにぃのブログ
http://blog.livedoor.jp/ti5942/archives/cat_125503.html?p=5
ここでは、おもしろい試みをやってます。
かなり参考になります。
texとか色々なものを組み合わせて、キレイな日本語pdfをめざしてるみたいです。
そこで紹介しているflydrawでやってみます。
flydrawでは、関数の曲線がかけます。
rcairoでは、できません。
まずは
sudo apt-get install flydraw
で、これです。
irbにプログラム全部のコピペで簡単に試せます。

#!usr/bin/env ruby

require 'rubygems'
require 'sdl'
require 'stringio'

eval = <<EOF
new 400,400
range -5,5,-20,20
arrow -5,0,5,0,10,black
arrow 0,-20,0,20,10,black
linewidth 2
plot black,pow(x,3)-12*pow(x,1)
text red,-0.4,0,huge,O
text red,-2.2,0,huge,-2
text red,1.9,1.9,huge,2
text red,0,17,huge,16
text red,-0.8,-15,huge,-16
linewidth 10
point -2*sqrt(3),0,red
point 0,0,red
point 2*sqrt(3),0,red
point -2,16,red
point 2,-16,red
linewidth 1
dline -2,0,-2,16,red
dline -2,16,0,16,red
dline 2,0,2,-16,red
dline 2,-16,0,-16,red
EOF
IO.popen("flydraw","r+") do |io|
io.write(eval)
io.close_write
@image = io.read
end
StringIO.open(@image){|s| @surface = SDL::Surface.loadFromIO(s)}
@surface.saveBMP("/tmp/image.bmp")
`display /tmp/image.bmp`
[PR]
by gaziya | 2011-04-14 11:32
SDL::Surfaceの様子をチェックする度にSDLのプログラムを書くのが面倒になってきた。
それで、SDL::Surface#save_bmpを使って、displayで表示する方法にしたよ。
surface.save_bmp("/tmp/image.bmp")
`display /tmp/image.bmp`
この2行で済む。
もっと、早くにやれってかんじだが、頭がうまくついてかないよ。
下のプログラムを簡単に試すなら、
irbを立ち上げて、プログラム全部のコピペでOKです。

#!usr/bin/env ruby

require 'rubygems'
require 'sdl'
require 'cairo'

image = Cairo::ImageSurface.new(300, 200)
context = Cairo::Context.new(image)
context.set_source_rgb(1, 1, 1)
context.rectangle(0, 0, 300, 200)
context.fill
context.set_source_rgb(1, 0, 0)
context.arc(150, 100, 67, 0, 2 * Math::PI)
context.fill
surface = SDL::Surface.new_from(image.data,image.width,image.height,32,image.stride,0x00FF0000,0x0000FF00,0x000000FF,0xFF000000)
surface.save_bmp("/tmp/image.bmp")
`display /tmp/image.bmp`
[PR]
by gaziya | 2011-04-14 10:12
SDL::Surface.loadFromIO が、あることに気づいた。
と、言うことは、convart が、いらないと言うことだ。
また、遠回りしました。
url = "http://cairographics.org/cairo-banner.png"
data = `wget -q -O - #{url}`
StringIO.open(data){|s| @surface = SDL::Surface.loadFromIO(s)}
これで、いいみたい。
だけど、 SDL::Surface.load_from_io を使うと
undefined method `load_from_io' for SDL::Surface:Class (NoMethodError)
と、エラーでる。
load_from_io の書き方が、好みなので残念。
ちょっと前に書いたやつを、なおしてみた。

#!usr/bin/env ruby

require 'rubygems'
require 'sdl'
require 'stringio'

class Canvas
def initialize(screen)
@screen = screen
eval = <<EOF
digraph sample1 {
node1 -> node2;
node1 -> node3;
node2 -> node3;
node3 -> node4;
}
EOF
data = `echo '#{eval}' | dot -Tpng`
StringIO.open(data){|s| @surface = SDL::Surface.loadFromIO(s)}
end

def update
@screen.put(@surface,0,0)
end
end

class Phase
def initialize(screen)
@screen = screen
@canvas = Canvas.new(@screen)
end

def update
@canvas.update
end

def handling(e)
exit if e.kind_of?(SDL::Event::Quit) || (e.kind_of?(SDL::Event::KeyDown) && e.sym == SDL::Key::ESCAPE)
end

def run
loop do
while e=SDL::Event.poll
handling(e)
end
update
@screen.flip
SDL.delay(50)
end
end
end

width,height = 160,350
SDL.init(SDL::INIT_VIDEO)
screen = SDL::Screen.open(width,height,SDL::Screen.info.bpp,SDL::SWSURFACE)
Phase.new(screen).run
[PR]
by gaziya | 2011-04-13 22:11