2008年10月31日金曜日

ActionScript 3.0でハロウィン

このブログ記事をはてなブックマークに追加

お菓子をくれなきゃ、いたずらするぞ! Trick or Treat!

ということで、ハロウィン。ActionScript 3.0を使って10分ほどで作成。カボチャをクリックすると色が変わる。

以下に、ソースコードを示す。

Halloween.as

// Halloween.as // by nox, 2008.10.31 package { import flash.display.*; import flash.text.*; import flash.events.*; import flash.utils.Timer; public class Halloween extends Sprite { // dafont.com http://www.dafont.com/ [Embed(systemFont="Halloween Borders", fontName="HalloweenFont", mimeType="application/x-font" )] private static const HalloweenFont:Class; private var txtHalloween:TextField = new TextField(); private var HalloweenStageWidth:int, HalloweenStageHeight:int; private var timer:Timer; private function ClickHandler(event:Event):void { var format:TextFormat = txtHalloween.getTextFormat(); format.color = Math.random() * 0xFFFFFF; txtHalloween.setTextFormat(format); } private function OnTick(event:TimerEvent):void { txtHalloween.x += (Math.random() - 0.5) * 2; txtHalloween.y += (Math.random() - 0.5) * 2; } private function Init():void { var format:TextFormat = new TextFormat(); with (format) { color = 0xCC0000; size = 144; align = TextFormatAlign.CENTER; font = "HalloweenFont"; } with (txtHalloween) { autoSize = TextFieldAutoSize.CENTER; selectable = false; x = HalloweenStageWidth / 2; embedFonts = true; defaultTextFormat = format; text = "e"; y = (HalloweenStageHeight - textHeight) / 2; } addChild(txtHalloween); txtHalloween.addEventListener(MouseEvent.CLICK, ClickHandler); timer = new Timer(10); timer.addEventListener(TimerEvent.TIMER, OnTick); timer.start(); } public function Halloween() { HalloweenStageWidth = stage.stageWidth; HalloweenStageHeight = stage.stageHeight; Init(); } } }

Halloween-config.xml

<flex-config> <output>Halloween.swf</output> <default-size> <width>150</width> <height>150</height> </default-size> <default-frame-rate>60</default-frame-rate> <default-background-color>0xFFFFFF</default-background-color> <use-network>false</use-network> </flex-config>

続きを読む...

2008年10月29日水曜日

ActionScript 3.0で少し早いクリスマス気分を味わう

このブログ記事をはてなブックマークに追加

クリスマスあたりを目処に簡単なゲームをActionScript 3.0で作ろうかと思って、その雛型を作ってみた。雛型なんでホントに形だけだけど。それでも赤と緑の色合いとクリスマスソングで気分だけはクリスマスっぽくなるなぁ。それにしても未だにActionScript 3.0の使い方がこんなんで良いのか疑問に思う。なんだか無駄の多いコードのような気がする。

以下のFlashコンテンツをマウスクリックなどでアクティブにして適当なキーを押すと始まる。MP3だけで2.5MBあるので少し重いかも。尚、音が鳴るので注意すること。因みに飛んでいる天使をクリックすると…。


BGMにtaitai studioフリーMp3素材集からHappy Christmas Partyを利用させてもらった。また、効果音は効果音gから。フォントについてはdafont.comからクリスマス関連のフォントを使用した。

以下、ソースコード。

ActionXmas.as

// ActionXmas.as // by nox, 2008.10.29 package { import flash.display.*; import flash.text.*; import flash.events.*; import flash.media.Sound; import flash.media.SoundChannel; import flash.utils.Timer; public class ActionXmas extends Sprite { // taitai studio http://www.taitaistudio.com/ // taitai studio フリーMp3素材集 http://www.taitaistudio.com/mp3/ [Embed(source="xmas.mp3")] private static const SoundXmas:Class; // 効果音g http://sfxg.bufsiz.jp/index.html [Embed(source="slap01.mp3")] private static const SoundSlap:Class; // dafont.com http://www.dafont.com/ [Embed(systemFont="KR Christmas Dings 2004 Four", fontName="StFont", mimeType="application/x-font" )] private static const StFont:Class; [Embed(systemFont="Kingthings Christmas ", fontName="XmasFont", mimeType="application/x-font" )] private static const XmasFont:Class; [Embed(systemFont="Faux Snow BRK", fontName="SnowFont", mimeType="application/x-font" )] private static const SnowFont:Class; private static const version:String = "0.01"; private var bgm:Sound = new SoundXmas() as Sound; private var ss:Sound = new SoundSlap() as Sound; private var channel:SoundChannel; private var txtTitle:TextField = new TextField(); private var txtSt:TextField = new TextField(); private var txtFadeSt:TextField = new TextField(); private var txtXmas:Array = new Array(); private var txtXmasList:Array; private var txtXmasLength:int; private var txtXmasWidth:Number; private var txtXmasMargin:Number; private var txtSnow:Array = new Array(); private var txtSnowList:Array; private var speedSnow:Array = new Array(); private var numTxtSnow:int = 30; private var txtSnowMargin:Number = 300; private var timer:Timer; private var delta_y_st:Number = 0.5; private var XmasStageWidth:int, XmasStageHeight:int; private function ClickHandler(event:Event):void { ss.play(); // fade flying angel FadeSt(); } private function OnTick(event:TimerEvent):void { var i:int; // flying angel if (txtSt.y > XmasStageHeight / 10 + 10) delta_y_st = -0.5; else if (txtSt.y < XmasStageHeight / 10 - 10) delta_y_st = 0.5; txtSt.y += delta_y_st; TickFadeSt(); // walking background characters for (i = 0; i < txtXmasLength; i++) { txtXmas[i].x += 1; if (txtXmas[i].x > txtXmasWidth - txtXmasMargin) txtXmas[i].x -= txtXmasWidth; } // fall snow for (i = 0; i < numTxtSnow; i++) { txtSnow[i].y += 1 * speedSnow[i]; txtSnow[i].x += (Math.random() - 0.5) * 2 + 1; if (txtSnow[i].x > XmasStageWidth + txtSnowMargin) txtSnow[i].x -= XmasStageWidth + txtSnowMargin * 2; if (txtSnow[i].y > XmasStageHeight) NewSnow(i); } } private function FadeSt():void { with (txtFadeSt) { defaultTextFormat = txtSt.defaultTextFormat; autoSize = TextFieldAutoSize.CENTER; selectable = false; text = txtSt.text; x = txtSt.x; y = txtSt.y; embedFonts = true; alpha = 1.0; } addChild(txtFadeSt); removeChild(txtSt); } private function TickFadeSt():void { txtFadeSt.alpha *= 0.95; txtFadeSt.x = txtSt.x; txtFadeSt.y = txtSt.y; } private function OnPlaybackComplete(event:Event):void { txtSt.removeEventListener(MouseEvent.CLICK, ClickHandler); timer.stop(); // ending var format_red:TextFormat = new TextFormat(); var format_small:TextFormat = new TextFormat(); format_red.color = 0xCC0000; format_small.size = 48; with (txtTitle) { text = "Fin\nHit Any Key!"; autoSize = TextFieldAutoSize.LEFT; x = XmasStageWidth / 10; y = XmasStageHeight / 5; for each (var n:int in [0, 4, 8, 12]) setTextFormat(format_red, n); setTextFormat(format_small, 4, 16); } addChild(txtTitle); stage.addEventListener(KeyboardEvent.KEY_UP, StartGame); } private function SetFlyingAngel():void { var format:TextFormat = new TextFormat(); var format_red:TextFormat = new TextFormat(); with (format) { color = 0x00CC00; size = 72; align = TextFormatAlign.CENTER; font = "StFont"; } format_red.color = 0xCC0000; with (txtSt) { defaultTextFormat = format; autoSize = TextFieldAutoSize.LEFT; selectable = false; x = XmasStageWidth * 3 / 5; y = XmasStageHeight / 10; embedFonts = true; text = "t"; } addChild(txtSt); } private function SetBackgroundCharacters():void { var format:TextFormat = new TextFormat(); var format_red:TextFormat = new TextFormat(); with (format) { color = 0x00CC00; size = 72; align = TextFormatAlign.CENTER; font = "StFont"; } format_red.color = 0xCC0000; with (txtXmas[0]) { embedFonts = true; defaultTextFormat = format; text = txtXmasList.toString(); } // length of background charactors txtXmasWidth = txtXmas[0].textWidth; txtXmasMargin = (txtXmasWidth - XmasStageWidth) / 2; for (var i:int = 0; i < txtXmasLength; i++) { with (txtXmas[i]) { autoSize = TextFieldAutoSize.CENTER; selectable = false; embedFonts = true; defaultTextFormat = format; text = txtXmasList[i]; x = i > 0 ? txtXmas[i-1].x + txtXmas[i-1].textWidth : -txtXmasMargin; y = XmasStageHeight * 2 / 3; } addChild(txtXmas[i]); } // red in background charactors txtXmas[0].setTextFormat(format_red); } private function SetSnow():void { var format:TextFormat = new TextFormat(); var format_size:TextFormat = new TextFormat(); with (format) { color = 0xFFFFFF; align = TextFormatAlign.LEFT; font = "SnowFont"; } for (var i:int = 0; i < numTxtSnow; i++) { format_size.size = 24 + Math.random() * 48; speedSnow[i] = 0.5 + Math.random() * 0.5; with (txtSnow[i]) { selectable = false; embedFonts = true; defaultTextFormat = format; text = txtSnowList[int(Math.random() * txtSnowList.length)]; x = Math.random() * (XmasStageWidth + txtSnowMargin * 2) - txtSnowMargin; y = -100; setTextFormat(format_size); alpha = 0.3 + Math.random() * 0.7; } addChild(txtSnow[i]); } } private function NewSnow(n:int):void { var format:TextFormat = new TextFormat(); var format_size:TextFormat = new TextFormat(); with (format) { color = 0xFFFFFF; align = TextFormatAlign.LEFT; font = "SnowFont"; } format_size.size = 24 + Math.random() * 48; speedSnow[n] = 0.5 + Math.random() * 0.5; with (txtSnow[n]) { selectable = false; embedFonts = true; defaultTextFormat = format; text = txtSnowList[int(Math.random() * txtSnowList.length)]; x = Math.random() * (XmasStageWidth + txtSnowMargin * 2) - txtSnowMargin; y = -100; setTextFormat(format_size); alpha = 0.3 + Math.random() * 0.7; } } private function StartGame(event:Event):void { removeChild(txtTitle); stage.removeEventListener(KeyboardEvent.KEY_UP, StartGame); txtSt.addEventListener(MouseEvent.CLICK, ClickHandler); channel = bgm.play(); channel.addEventListener(Event.SOUND_COMPLETE, OnPlaybackComplete); // show flying angel SetFlyingAngel(); // show background characters SetBackgroundCharacters(); // show snow SetSnow(); timer.start(); } private function InitGame():void { var format:TextFormat = new TextFormat(); var format_red:TextFormat = new TextFormat(); var format_small:TextFormat = new TextFormat(); var i:int; // opening (upper letters are red, others are green) with (format) { color = 0x00CC00; size = 72; align = TextFormatAlign.CENTER; font = "XmasFont"; } format_red.color = 0xCC0000; format_small.size = 48; with (txtTitle) { autoSize = TextFieldAutoSize.CENTER; selectable = false; x = XmasStageWidth / 2; y = XmasStageHeight / 3; embedFonts = true; defaultTextFormat = format; text = "ActionXmas\nHit Any Key!"; } for each (var n:int in [0, 6, 11, 15, 19]) txtTitle.setTextFormat(format_red, n); txtTitle.setTextFormat(format_small, 11, 23); addChild(txtTitle); txtXmasList = ["s", "k", "e", "h", "j", "r", "g", "x", "n", "i"]; txtXmasLength = txtXmasList.length; for (i = 0; i < txtXmasLength; i++) txtXmas[i] = new TextField(); txtSnowList = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; timer = new Timer(10); timer.addEventListener(TimerEvent.TIMER, OnTick); for (i = 0; i < numTxtSnow; i++) txtSnow[i] = new TextField(); } public function ActionXmas() { XmasStageWidth = stage.stageWidth; XmasStageHeight = stage.stageHeight; InitGame(); stage.addEventListener(KeyboardEvent.KEY_UP, StartGame); } } }

ActionXmas-config.xml

<flex-config> <output>ActionXmas.swf</output> <default-size> <width>350</width> <height>350</height> </default-size> <default-frame-rate>60</default-frame-rate> <default-background-color>0x000000</default-background-color> <use-network>false</use-network> <compiler> <fonts> <languages> <language-range> <lang>englishRange</lang> <range>U+0020-U+007E</range> </language-range> <language-range> <lang>otherRange</lang> <range>U+00??</range> </language-range> </languages> </fonts> </compiler> </flex-config>

続きを読む...

2008年10月22日水曜日

Processingで分子動力学計算

このブログ記事をはてなブックマークに追加

Processing面白いなぁ。以前はhttp://proce55ing.orgが公式サイトだったことから、Proce55ingとしても知られている。Java仕様のビジュアルデザイン用プログラミング言語なのだが、とても簡単に扱うことができる。プログラミングでアートする感じ。

そこで今回はなんちゃって分子動力学計算プログラムを作ってみた。もちろん原子をリアルタイムに計算しながら表示させている。ただし、コードを短くするために分子ではなく疑似原子単体同士の相互作用にしている。そのため計算している相互作用はvdW力とクーロン力のみだ。また特に工夫をしているわけでもなく全原子同士のすべての相互作用をそのまま計算している。分子動力学計算の詳細についてはPEACHによる生体分子の分子動力学シミュレーション(1)原理と方法あたりを参考にすると良いと思う。

実際のプログラムを以下に示す。num_atomsで原子数を指定しており、初期配置を比較的密集させてその状態で力を計算させている。また、左上にエネルギーを表示している。初期の高エネルギー状態から低エネルギー状態に安定化するのが見て取れる。その他の詳しいことは実際にソースコードを読めば分かると思う。短いしね。

This browser does not have a Java Plug-in.
Get the latest Java Plug-in here.



以下、ソースコード。

simple_md.pde

/** * Simple molecular dynamics by nox, 2008.10.21. * * Perform molecular dynamics for pseudo-atoms without internal * interactions, such as bonds, angles, dihedrals. Only vdW and * Coulomb interactions. */ final int num_atoms = 20; Atom[] atoms = new Atom[num_atoms]; void setup() { size(360, 360, P3D); noStroke(); // initialize positions of atoms int cnt = 0; int num_side = ceil(pow(num_atoms, 1.0 / 3.0)); for (int i = 0; i < num_side && cnt < num_atoms; i++) for (int j = 0; j < num_side && cnt < num_atoms; j++) for (int k = 0; k < num_side && cnt < num_atoms; k++) atoms[cnt++] = new Atom((i - num_side / 2) * 20, (j - num_side / 2) * 20, (k - num_side / 2) * 20); PFont font = createFont("Times New Roman", 32); textFont(font); } float calcDistance(int atom1, int atom2) { float distance, sum = 0.0; for (int i = 0; i < 3; i++) { distance = atoms[atom1].crd[i] - atoms[atom2].crd[i]; sum += distance * distance; } return sqrt(sum); } float calcDistanceXYZ(int atom1, int atom2, int xyz) { return atoms[atom1].crd[xyz] - atoms[atom2].crd[xyz]; } float calcEnergy(Atom[] atoms, int num_atoms) { float sum = 0.0; for (int i = 0; i < num_atoms; i++) sum += atoms[i].energy(); return sum / 2.0; } void draw() { background(0); lights(); float[] r = new float[num_atoms]; float[][] r_xyz = new float[num_atoms][3]; for (int i = 0; i < num_atoms; i++) { for (int j = 0; j < num_atoms; j++) { r[j] = calcDistance(i, j); for (int k = 0; k < 3; k++) r_xyz[j][k] = calcDistanceXYZ(i, j, k); } atoms[i].calculate(r, r_xyz, num_atoms); } for (int i = 0; i < num_atoms; i++) atoms[i].move(); text("Energy: " + calcEnergy(atoms, num_atoms), 10, 40); }

simple_atom.pde

class Atom { float[] crd, f, max_range; float ene; Atom() { this(0, 0, 0); } Atom(float x, float y, float z) { this.crd = new float[3]; this.f = new float[3]; this.crd[0] = x; this.crd[1] = y; this.crd[2] = z; for (int i = 0; i < 3; i++) this.f[i] = 0.0; this.max_range = new float[3]; this.max_range[0] = width / 2; this.max_range[1] = height / 2; this.max_range[2] = 200; } // Calculate energies and forces // Total energy = vdW + Coulomb // vdW // U = eps * [(Rij / r[i])^12 - 2 * (Rij / r[i]^6)] // F = -12 * eps / Rij * [(Rij / r[i])^13 - (Rij / r[i])^7] * r_xyz / r[i] // Coulomb // U = SUM_i>j qiqj / r[i] // F = SUM_j qiqj / r[i]^3 * r_xyz void calculate(float[] r, float[][] r_xyz, int num_atoms) { float[] delta_f = new float[3]; final float eps = 10.0; final float Rij = 10.0; final float q = 10.0; // qi*qj this.ene = 0.0; for (int i = 0; i < num_atoms; i++) { if (r[i] == 0.0) continue; final float R12 = pow(Rij / r[i], 12); final float R6 = pow(Rij / r[i], 6); this.ene += eps * (R12 - 2.0 * R6); this.ene += q / r[i]; for (int j = 0; j < 3; j++) { delta_f[j] += -(12 * eps / Rij) * (R12 * Rij / r[i] - R6 * Rij / r[i]) * r_xyz[i][j] / r[i]; delta_f[j] += q / pow(r[i], 3) * r_xyz[i][j]; } } for (int i = 0; i < 3; i++) this.f[i] += delta_f[i]; } float energy() { return this.ene; } void move() { pushMatrix(); for (int i = 0; i < 3; i++) { this.crd[i] += this.f[i]; if (this.crd[i] > max_range[i] || this.crd[i] < -max_range[i]) this.f[i] *= -1; } translate(max_range[0] + this.crd[0], max_range[1] + this.crd[1], -max_range[2] + this.crd[2]); sphere(20); popMatrix(); } }

続きを読む...

2008年10月19日日曜日

2D物理演算ソフトウェアPhunを楽しむ

このブログ記事をはてなブックマークに追加

2D物理演算ソフトウェアのPhunは楽しい。Phunと云う名前自体が、Physics(物理)+Fun(楽しむ)の造語であり、名が体を見事に表している。

物理演算と聞くとなにやら難しそうだが、このPhunは少しも難しくない。もちろん壮大な設計図のもと、緻密で複雑な機械を作ろうとすれば大変だろうが、とりあえず四角や丸の置物、バネや水を出してみたりといったことはマウス操作でちょちょいのちょいだ。3歳の子供だってできるのだから誰にだってできるだろう。



まずはここに掲載されているPhunの動画を見て欲しい。ちょっとばかり楽しい気分になれる。因みに自分はリトルビッグプラネットのβテストが終わってしまったので、発売日までそれに代わる類似ソフトを探していたところPhunを知った。もしPhunを少しでも楽しめたのならリトルビッグプラネットに嵌ることは間違いないと思う。

続きを読む...

2008年10月14日火曜日

ブルーレイディスクで録画データをバックアップ

このブログ記事をはてなブックマークに追加

自宅の居間に設置しているPCはほぼ録画専用になっていてHDD容量は500GBだ。しかし、この容量でも録画目的だと全然足りない。仕方がないので、MPEG-4に変換して保存したり、DVDにバックアップしてたりしたのだが、バックアップの手間が非常にかかるので、先日、ブルーレイディスク(BD)ドライブを購入した。

MPEG-4への変換は、Pythonスクリプトとmencoderを使って、タイトルから自動的にフォルダを割り振って変換するようにしてあるので、ある程度自動化できていたのだが、DVDへのバックアップについては、1枚4.8GBの容量では何度もドライブから出し入れしなくてはならず非常に厄介だった。BDだと一層で25GB、二層(DL)で50GBと、DVDに比べ容量が格段に大きいのでバックアップがとても楽になった。最近はBD-Rの値も下がり、一枚350円を切る値段になっていて、これなら許容できる。

と云うわけで、我が家では着々とBD化が進んでいる。そう言えば最近は市販のDVDはまったく購入しなくなってしまった。BDの画質を見た後だととてもDVDを購入する気にはなれないなぁ…。

続きを読む...

2008年10月8日水曜日

C言語で複数のアルゴリズムを使って円周率を求める

このブログ記事をはてなブックマークに追加

以前、大学でプログラミング実習を教えたときの課題だった、複数のアルゴリズムで円周率を求めるプログラムが出てきたのでここに書いておく。実行時間も測定している。これはCで書いたけど、使用言語はFortranでも可だったはず。

出力結果:

Machin's formula: 3.14159265358979 Time: 0.437000s (1000000 times) Gauss-Legendre : 3.14159265358979 Time: 0.219000s (1000000 times) Count points : 3.14552000000000 Time: 0.265000s (10 times) Monte Carlo : 3.14394000000000 Time: 0.594000s (10 times) Circumference : 3.14159265358979 Time: 3.047000s (1000000 times) Integral : 3.14159265393433 Time: 0.375000s (10 times)

Machin's formula, Gauss-Legendre, Circumferenceは100万回計算、Count points, Monte Carlo, Integralは10回計算して時間を測定している。それにしても、算術幾何平均を使ったガウス-ルジャンドルのアルゴリズムは速いなぁ。

以下、ソースコード。

/*======================================================= ratio of the circumference of a circle to its diameter =======================================================*/ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> /*------------------------------------------------------- Machin's formula: PI/4 = 4*arctan(1/5) - arctan(1/239) --------------------------------------------------------*/ double pi_machin(int dummy) { int k; double p, temp, last; p = 0.0; /* 4*arctan(1/5) */ k = 1; temp = 16.0 / 5.0; /* arctan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... */ do { last = p; p += temp / k; temp /= -5.0 * 5.0; k += 2; } while (p != last); /* arctan(1/239) */ k = 1; temp = 4.0 / 239.0; do { last = p; p -= temp / k; temp /= -239.0 * 239.0; k += 2; } while (p != last); return p; } /*------------------------------------------------------- Gauss-Legendre algorithm a[1] = 1, b[1]= 1/sqrt(2) arithmetic means: a[n+1] = (a[n] + b[n]) / 2 geometric means: b[n+1] = sqrt(a[n] * b[n]) PI[n] = 2*a[n+1]^2 / (1-SUM^n_k=0{2^k*(a[k]^2-b[k]^2)}) = 2*a[n+1]^2 / (1-SUM^n_k=0{2^k*(a[k]-a[k-1])^2}) PI[n->inf] -> PI --------------------------------------------------------*/ double pi_gauss_legendre(int dummy) { int i; double a, b, s, temp, last; a = 1.0; b = 1.0 / sqrt(2.0); s = 1.0; temp = 4; do { last = a; a = (a + b) / 2.0; /* arithmetic means */ b = sqrt(last * b); /* geometric means */ s -= temp * (a - last) * (a - last); temp *= 2.0; } while (a != last); return (a + b) * (a + b) / s; } /*------------------------------------------------------- Using count points in circle num: length of side -------------------------------------------------------*/ double pi_points(int num) { int i, j, hit; double x, y, p; hit = 0; for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { x = (double)i / num; y = (double)j / num; if (x * x + y * y < 1.0) hit++; } } p = (double)hit / (num * num); return p * 4.0; } /*------------------------------------------------------- Using Monte Carlo method num: number of random points -------------------------------------------------------*/ double pi_monte(int num) { int i, hit; double x, y, p; hit = 0; for (i = 0; i < num; i++) { x = (double)rand() / RAND_MAX; y = (double)rand() / RAND_MAX; if (x * x + y * y < 1.0) hit++; } p = (double)hit / num; return p * 4.0; } /*------------------------------------------------------- 2*PI <- length of side * N div: number of division on a side of hexagon -------------------------------------------------------*/ double pi_circumference(int div) { /* 2*PI = sin(theta) * 360.0 / theta */ int i; double a, b, multi; a = 1.0; multi = 1.0; for (i = 0; i < div; i++) { b = 1.0 - sqrt(1.0 - a * a / 4.0); a = sqrt(b * b + a * a / 4.0); multi *= 2.0; } return a * 6.0 * multi / 2.0; } /*------------------------------------------------------- x^2 + y^2 = 1, y = sqrt(1 - x^2) PI/4 = INT{y}dx div: number of division on integrals -------------------------------------------------------*/ double pi_integral(int div) { int i; double p, delta, y, a; y = 0.0; for (i = 0; i < div; i++) { a = (i + 0.5) / div; y += sqrt(1.0 - a * a); } return y / div * 4.0; } /*------------------------------------------------------- Measurement of time func: function of calculation of pi arg: argument of function num: number of repeats msg: message of output -------------------------------------------------------*/ void run(double (*func)(int), int arg, int num, char *msg) { clock_t start, finish; int i; start = clock(); for (i = 0; i < num - 1; i++) (*func)(arg); printf("%-16s: %16.14f\n", msg, (*func)(arg)); finish = clock(); printf("Time: %14.6fs (%d times)\n",(double)(finish - start) / CLOCKS_PER_SEC, num); printf("\n"); } int main() { srand((unsigned int)time(NULL)); run(pi_machin, 0, 1000000, "Machin's formula"); run(pi_gauss_legendre, 0, 1000000, "Gauss-Legendre"); run(pi_points, 1000, 10, "Count points"); run(pi_monte, 1000000, 10, "Monte Carlo"); run(pi_circumference, 50, 1000000, "Circumference"); run(pi_integral, 1000000, 10, "Integral"); return 0; }

続きを読む...

2008年10月7日火曜日

PS3:「リトルビッグプラネット」信じられない面白さ

このブログ記事をはてなブックマークに追加

1年以上前に「LittleBigPlanet」というエントリを書いた。そしてとうとうリトルビッグプラネット日本語版が10月30日に発売する。それに先駆けて、βテスターの募集があったのだが、運よく日本地域枠の2万人に入ったようでβテストに参加することができた。因みに、米国、欧州でそれぞれ2万人の枠があり、全部で6万人のβテスターがいることになる。

早速、PSN経由で1GB弱のファイルをダウンロード、インストールし、プレイしてみたのだが、予想以上に楽しい。本当に楽しい。誰にでもすぐにできる簡単操作、自由にコーディネートできる愛くるしいリビッツ人形、世界中の人とのオンラインプレイ、想像力を刺激するステージのクリエイトなど。これほど予想を上回るできのソフトはアンチャーテッド以来かなぁ。アンチャーテッドとはジャンルがぜんぜん違うけど。

百聞は一見にしかずということで、まずはトレイラー動画を観ていただきたい。



どうですか? 面白そうですか? 実は自分はそれほど面白そうだと思わなかった。もし、この時点で凄く楽しそうと感じたなら、即、購入で間違いない。

動画ではそれほど面白そうだとは思わなかったけど、確かに実写のようなプレイ画面や驚くほどリアルな物理演算処理は凄いと思ったので、βテストに応募してプレイしてみたのだが、このとき初めて自分の考えが誤っている事に気が付いた。これはプレイしないとその凄さが分からない。百見は一プレイにしかず、である。正直、このゲームの楽しさ、面白さは文章では伝わらないと思うので、これ以上の説明はしない。しかし、週末のプレイを楽しみにしていたところ、子供たちに見つかって占領されてしまい、自分はあまりプレイできなかったことからも、その楽しさが伝わるはずだ。

やっとPS3の性能をちゃんと使った、次世代機らしい、素晴らしいゲームソフトが出てきた。老若男女を問わずに遊べるので是非多くの人にプレイして欲しい。

続きを読む...