「日記2010年9月その3」の編集履歴(バックアップ)一覧に戻る

日記2010年9月その3 - (2010/10/04 (月) 14:52:44) の編集履歴(バックアップ)


2010/9/22


ソーマキューブというパズルの問題。
7つのピースを使ってこの形を作れるかな。

十字架。




もう少し犬っぽい形があるような気がする。







2010/9/30


水彩画風フィルタの失敗作
ソースコードは下記。
C#。
フォームにボタンを3つ、ピクチャボックスを2つ置いて使用。
配置したボタンのボタン2とボタン3で画像をピクチャボックスに表示してから、実行。
単なる試作品の上に失敗作。




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;
public delegate void ExampleCallback(Bitmap outBit, PictureBox p1);

namespace WindowsFormsApplication2
{
   public partial class Form1 : Form
   {
       int tc = 0;
       //Bitmap lastB;
       public Form1()
       {
           InitializeComponent();

       }

       private void Form1_Load(object sender, EventArgs e)
       {
           pictureBox2.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/tumblr_l0771pDcX01qbq8jdo1_500.jpg");
       }

       private void button1_Click(object sender, EventArgs e)
       {
           Bitmap b2 = new Bitmap(pictureBox1.Image);
           Bitmap b1 = new Bitmap (pictureBox1.Image); 
           pictFilter PTC1 = new WindowsFormsApplication2.pictFilter();
           //pictureBox1.Image=PTC1.HSVColorRound(b1, 30); 
           
           //pictureBox2.Image =PTC1.Laplacian2(b1,  PTC1.Laplacian(3,  PTC1.GrayImage(b1)));
           pictureBox2.Image =  PTC1.Laplacian(3, PTC1.GrayImage(b2));
           pictureBox2.Image = PTC1.Laplacian2 (b1,b2) ;

       }
       public static void ResultCallback(Bitmap outBit, PictureBox p1)
       {
           p1.Image = outBit;

       }


       private void pictureBox1_Click(object sender, EventArgs e)
       {
           tc++;
           pictureBox1.Top = 0;
           pictureBox1.Left = 0;

       }

       private void button2_Click(object sender, EventArgs e)
       {
           OpenFileDialog ofd = new OpenFileDialog();
           ofd.Filter = "画像ファイル(*.jpeg;*.jpg;*.gif)|*.jpeg;*.jpg;*.gif|すべてのファイル(*.*)|*.*";
           if (ofd.ShowDialog() == DialogResult.OK)
           {
               pictureBox2.Image = Image.FromFile(ofd.FileName); 
           }
       }

       private void button3_Click(object sender, EventArgs e)
       {
           OpenFileDialog ofd = new OpenFileDialog();
           ofd.Filter = "画像ファイル(*.jpeg;*.jpg;*.gif)|*.jpeg;*.jpg;*.gif|すべてのファイル(*.*)|*.*";
           if (ofd.ShowDialog() == DialogResult.OK)
           {
               pictureBox1.Image = Image.FromFile(ofd.FileName);
           }
       }

   }
   class pictFilter
   {




       public Bitmap HSVColorRound(Bitmap b1, int r)
       {
           Color C1;
           String s;
           Bitmap b2 = new Bitmap(b1.Width, b1.Height);
           HSV HSV1;
           double d;
           double MaxS=0;
           double d2=0;
           for (int i = 0; i < b1.Width; i++)
           {
               for (int j = 0; j < b1.Height; j++)
               {
                   C1 = b1.GetPixel(i, j);
                   HSV1 = HSVConvert.RGB2HSV(C1);

                   //d = (double)(HSV1.H + r) / 360.0;
                   //HSV1.H =(int) Math.Round (d*(1-d)*4.0*360.0) % 360;
                   //HSV1.H =( HSV1.H +r) % 360;
                   HSV1.H = (HSV1.H + r) % 360;
                   //d2=HSV1.S/255.0;
                   //HSV1.S = (int)Math.Floor(d2 * (1.0 - d2) * 4.0 * 255.0);
                   //HSV1.S /= 2;

                   //s = HSV1.ToString();
                   b2.SetPixel(i, j, HSVConvert.HSV2RGB(HSV1.H, HSV1.S, HSV1.V));
               }
           }
           return b2;
       }
       
       
       
       
       
       public Bitmap Laplacian2(Bitmap bBitmap,Bitmap b2)
       {

           int i, j;
           double count;
           int tempR;
           int tempG;
           int tempB;
           double tempR2, tempG2, tempB2;
           double tempRGB;
           Color C1, C2,C3;
           Bitmap b3=new Bitmap (bBitmap.Width ,bBitmap.Height);
           // 変数の宣言 iFilter : ラプラシアンフィルタ




           // 画像に対するフィルタ処理
           int size=4;
           int size2 = (2 * size + 1) * (2 * size + 1);
           double hiritu;
           double a;
           for (i = size; i < b2.Width - size; i++)
           {

               for (j = size; j < b2.Height - size; j++)
               {
                   count = 0;
                   for (int k = -size; k < size+1; k++)
                   {

                       for (int l = -size; l < size+1; l++)
                       {
                           tempR = b2.GetPixel(i + k, j + l).R;
                           if (tempR > 128)
                           {
                               count++;
                           }
                       }
                   }
                   /*
                   
                   a= (size2 - count) / (size2 * (size2 - 1));
                   tempR2 =tempG2 =tempB2 = 0;
                   hiritu = count / size2;
                   double b=a*(size2-1) + hiritu;
                   for (int k = -size; k < size+1; k++)
                   {

                       for (int l = -size; l < size+1; l++)
                       {
                           C3 = bBitmap.GetPixel(i + k, j + l);
                           if (k == 0 && l == 0)
                           {
                               tempR2 += (double)C3.R * hiritu ;
                               tempG2 += (double)C3.G * hiritu ;
                               tempB2 += (double)C3.B * hiritu;
                           }
                           else
                           {
                               tempR2 += (double)C3.R * a;
                               tempG2 += (double)C3.G * a;
                               tempB2 += (double)C3.B * a;
                           }

                       }
                   }
                   tempR =(int)Math.Floor ( tempR2);
                   tempG =(int) Math.Floor(tempG2);
                   tempB = (int)Math.Floor(tempB2);

                   C3 = Color.FromArgb(tempR, tempG, tempB);
                   b3.SetPixel(i, j, C3);
                   */
                   
                   
                   tempRGB=Math.Pow ((count) / ((2*size+1)*(2*size+1)),2);
                   // フィルタ処理
                   C1 = bBitmap.GetPixel(i, j);
                   C2 = b2.GetPixel(i, j);

                   tempR = (int)(Math.Floor(CutNum((double)C1.R * (1 - tempRGB ) + (double)255 *  tempRGB)));
                   tempG = (int)(Math.Floor(CutNum((double)C1.G * (1 - tempRGB ) + (double)255  * tempRGB)));
                   tempB = (int)(Math.Floor(CutNum((double)C1.B * (1 - tempRGB ) + (double)255  * tempRGB)));
                
                   
                   C3=Color.FromArgb(tempR, tempG, tempB);
                   b3.SetPixel(i, j, C3);
                   

               }
           }
           // フィルタ処理の結果の出力
           return b3;
           //pictureBox1.Image = bBitmap;    // 変更結果の設定

       }







       private double CutNum(double x){
           if (x > 255)
           {
               x = 255;
           }
           if (x < 0)
           {
               x = 0;
           }
           return x;
       }






       public Bitmap Laplacian(int iAmp,Bitmap  bBitmap)
           
{

   int        i, j, iColorValue;    // 変数の宣言 iColorValue : RGB平均値

   // 変数の宣言 iFilter : ラプラシアンフィルタ

   int[]    iFilter = new int[]{-1, -1, -1, -1, 8, -1, -1, -1, -1};

   // 変数の宣言 iArrayValue : ピクセル色情報の配列        

   int[,] iArrayValue = new int[bBitmap.Width, bBitmap.Height];

   Color[]    cArrayColor = new Color[9];    // 変数の宣言 cArrayColor : 色情報の配列

   Color    cSetColor;        // 変数の宣言 cSetColor   : 設定する色

   // 画像に対するフィルタ処理

   for(i = 1; i < bBitmap.Width - 1; i++)

       for(j = 1; j < bBitmap.Height - 1; j++)

       {
           for(int k=-1;k<2;k++){
               for(int l=-1;l<2;l++){
                   cArrayColor[(k + 1) * 3 + l + 1] = bBitmap.GetPixel(i+k,j+l);
               }
           }
           // フィルタ処理

iColorValue =

iFilter[0]*cArrayColor[0].R + iFilter[1]*cArrayColor[1].R +

iFilter[2]*cArrayColor[2].R + iFilter[3]*cArrayColor[3].R +

iFilter[4]*cArrayColor[4].R + iFilter[5]*cArrayColor[5].R +

iFilter[6]*cArrayColor[6].R + iFilter[7]*cArrayColor[7].R +

iFilter[8]*cArrayColor[8].R;

           iColorValue = iAmp*iColorValue;    // 出力レベルの設定

           // iColorValue が負の場合

           if(iColorValue < 0)

               iColorValue = -iColorValue;    // 正の値に変換

           // iColorValueが255より大きい場合

           if(iColorValue > 255)

               iColorValue = 255;    // iColorValue を 255 に設定

           iArrayValue[i, j] = iColorValue;// iColorValue の設定

       }

   // フィルタ処理の結果の出力

   for (i = 1; i < bBitmap.Width - 1; i++)

       for (j = 1; j < bBitmap.Height - 1; j++)

{


cSetColor = Color.FromArgb(iArrayValue[i, j],

iArrayValue[i, j],iArrayValue[i, j]);


bBitmap.SetPixel(i, j, cSetColor);

}
   return bBitmap; 
   //pictureBox1.Image = bBitmap;    // 変更結果の設定

}




       public   Bitmap GrayImage (Bitmap  bBitmap)

{

   int iRed, iBlue, iGreen;
   int iAverage;
   Color cSetColor;
   Color cColor;


   // 画像のグレースケールへの変換

   for (int i = 0; i < bBitmap.Width; i++)

       for (int j = 0; j < bBitmap.Height; j++)
       {    

           cColor = bBitmap.GetPixel(i, j);    // ピクセルの色の取得

           iRed = cColor.R;            // Red 値の設定

           iBlue = cColor.B;            // Blue 値の設定

           iGreen = cColor.G;            // Green 値の設定

           iAverage = (iRed + iBlue + iGreen) / 3;// RGB の平均値を算出

           // iAverage 値による色の設定

           cSetColor = Color.FromArgb(iAverage, iAverage, iAverage);

           bBitmap.SetPixel(i, j, cSetColor);    // ピクセルの色の設定

       }
   return bBitmap;
   //pictureBox1.Image = bBitmap;    // 変更結果の設定
}












       struct HSV
       {
           public int H;
           public int S;
           public int V;
       }

       class HSVConvert
       {
           //RGBをHSVに変換  
           public static HSV RGB2HSV(Color RGB)
           {
               HSV hsv = new HSV();

               double max = Math.Max(Math.Max(RGB.R, RGB.G), RGB.B);
               double min = Math.Min(Math.Min(RGB.R, RGB.G), RGB.B);

               //Vを求める  
               hsv.V = (int)max;

               //RGBすべてが同じ場合 HとSは0     
               if (max == min)
               {
                   hsv.H = 0;
                   hsv.S = 0;
               }
               else
               {
                   //Sを求める  
                   hsv.S = (int)(((max - min) * 255) / max);

                   //Hを求める  
                   hsv.H = 0;

                   if (max == RGB.R)
                   {
                       hsv.H = (int)(60 * (RGB.G - RGB.B) / (max - min));
                       if (hsv.H < 0) hsv.H += 360;
                   }
                   else if (max == RGB.G)
                   {
                       hsv.H = (int)(60 * (2 + (RGB.B - RGB.R) / (max - min)));
                       if (hsv.H < 0) hsv.H += 360;
                   }
                   else if (max == RGB.B)
                   {
                       hsv.H = (int)(60 * (4 + (RGB.R - RGB.G) / (max - min)));
                       if (hsv.H < 0) hsv.H += 360;
                   }
               }


               return hsv;
           }

           //HSVをRGBに変換  
           public static Color HSV2RGB(int H, int S, int V)
           {

               if (H == 360) H = 0;
               int Hi = (int)Math.Floor((double)H / 60) % 6;

               float f = ((float)H / 60) - Hi;
               float p = ((float)V / 255) * (1 - ((float)S / 255));
               float q = ((float)V / 255) * (1 - f * ((float)S / 255));
               float t = ((float)V / 255) * (1 - (1 - f) * ((float)S / 255));

               p *= 255;
               q *= 255;
               t *= 255;

               Color rgb = new Color();

               switch (Hi)
               {
                   case 0:
                       rgb = Color.FromArgb(V, (int)t, (int)p);
                       break;
                   case 1:
                       rgb = Color.FromArgb((int)q, V, (int)p);
                       break;
                   case 2:
                       rgb = Color.FromArgb((int)p, V, (int)t);
                       break;
                   case 3:
                       rgb = Color.FromArgb((int)p, (int)q, V);
                       break;
                   case 4:
                       rgb = Color.FromArgb((int)t, (int)p, V);
                       break;
                   case 5:
                       rgb = Color.FromArgb(V, (int)p, (int)q);
                       break;
               }


               return rgb;
           }
       }
   }
}















2010/10/1

歩兵FPSゲーム初心者教習講座Madムービー企画書 Ver企画書試作品。


BGM クラシック
語り口調 礼儀作法や研修用ビデオのノリで作る



1
学校で習いましたね。
道路を横切るときは必ず左右確認忘れずに。
道路に限らず開けた場所は、絶好のスナイプポイント。
運を天にまかして開けた場所に出るのは、道路の左右確認もしないで道に飛び出すのと同じ。
よく注意しましょう。
ナレーションは、道路を渡るときは左右を確認しましょうという小学生向けの道路安全講座風味のノリで。




建物に入るとき、出来るだけ手榴弾や閃光弾を投げ入れれましょう。
それが戦場での礼儀です。
(ナレーションや文章は礼儀作法のビデオのノリで)



狙撃地点への通り道は格好の待ち伏せ場所。
狙撃地点へ向かう敵のルートを予想し逆に待ち伏せするのが吉。
ナレーションは客をキャッチセールスするとき、客をどう捕まえるかの研修用ビデオ風味のノリで


4
戦車、乗り物の操縦方法
(車の教習講座風味のノリでナレーションを入れる)


5
茂みやヘコミは、敵の来る方向が制限される安全地帯。
むやみに動かず凹みに隠れへこみの前を敵が通るのを待つのはとても良い選択です。
(ナレーションは)



以下このノリで展開される初心者向けMAD映像を作りたい。

  • 目標
内容がくだらないので目標1000アクセス越え程度を目指す。














2010/10/1

今日の嘘日記。
人口200万を数える県庁所在地加古川。
加古川では最近複合コンビニが増えている。

回転寿司がコンビニの中央に鎮座し、壁際に商品だなが置かれている回転寿司コンビニ。
漫画喫茶に近い、雑誌を座って読めるコーナーのアルコンビニ。
商品だなは畳張り、壁際は障子に和格子、天蓋には手水に日本庭園のミニチュアが置かれた完全和風の店内。
オーナーの趣味、店内をジオラマつき鉄道模型が走り回るジオラマコンビニ。
ハイテク完全自動、アシモ6号量産型の働く全自動コンビニ。
店員が全員メイドコスプレのメイドコンビニ。
熱血店長が君に熱血魂を注入してくれる熱血コンビニ。
コンビニ激戦区加古川では多種多様なコンセプトのコンビニが生まれては消えている。


そのほかに
怪奇現象と心霊現象多発、店員はヴァンパイアとの噂のあるホラーコンビニ。
謎の大手、異世界に出張所を持ち異世界の技術で作られた品があるロー○ソンコンビニ。
魔法使い向け商品最大手の経営する、魔術商品充実の魔法コンビニ。
異世界への入り口が開いていて国境機能バリケードのある、異世界コンビニ、異世界の商品を無税で買える。
契約済み地獄の魔物を店員として働かさせている。

などがあり、コンビには加古川の一大観光産業を形成している。




  • 嘘日記2
加古川のタクシーは過激だ。
スポーツカー使用、ごてごて飾り立てた暴走族使用、警察とのカーチェイスは日常茶飯事。
客を一分一秒でも早く送り届けるために、交通マナーは最悪。
込んでる日には歩道を走る車があるほどだ。





























2010/10/2

彼女は待っている。彼を待っている。
 彼女と彼が初めて出会ったのは、今から約3年前。
 その時も調度今日の様に、彼女は待っていた。
 彼女に名前は無い。
 彼女は“人”ではない。
 彼女の目の前に、彼は立った。
 彼の知るかぎり、彼女は始めから、そこに居た。
 彼女がどこから来たのかも、彼は知らない。
 彼女は始めから、そこに居た。
 彼女は彼に言った。
「貴方が私のユーザーですか?」
 彼は答えた。
「そうだ」と。
 会議室の扉が開いた。
 疲れた表情の将校達に混じり、部屋から出るグラム。






勝手に文章推敲。
ここ違和感の塊になっているから修正しないといけないのは明白。
原作の設定を知らない俺がどう修正すればいいんだ?
自分の作品ならまだしも人の作品だしなぁ。
耽美系とか、中二病全開のなんだか格好よさそうに見えるだけの恥ずかしい文章を並べてみようかな。
小学生には読めないし、中学高校生の時には格好良く感じて、年取ったらあまりのナルシスト文章に逆に恥ずかしくて読めない。
そういう感じで攻めてみよう。
とりあえず今日は5分だけ推敲。
明日ちゃんとしたの書こう。
って人の作品弄るって結構難しいじゃないか、書けない。






会議室の外では一人の女性が待っていた。
イクサミコ。
滑らかな肌、機械と直通する接続コード、チタン配合の伝達速度が強化された神速のインパルス。
女性の姿をしたHMAの戦術戦闘補佐として作られた生体パーツ。
HMAを駆るグラムとともに、幾多の戦場を駆け抜けてきたいける伝説。

この気持ちを恋慕と呼ぶなら。

グラムには記憶がない。
二人で戦いに赴いた日々。
陰に陽に、日常で
今では、二人は互いを


彼女は彼の前に立ち、二人が初めてであったあの日の様に、彼の瞳を見つめた。





















2010/10/4

ある種のシンプルなアクションゲームから、アクションゲームの本質を抽象化する話。


平らかなところで左右に動く、一定のジャンプするというゲームにおける動きの模式図。
この図は全てのジャンプの軌跡をユーザーが選択できるということを表現している。
このように全ての動きの中からユーザーが自分の動きを選択するということがアクションゲームの一つの本質を表現している。



敵の配置や動きやオブジェは、この動きの自由度に制限を加えることとなる。
ユーザーは可能な動きの中から正解の動きの組を選択することを迫られる。
するとここにゲーム性が生まれる。
この正しい動きのセットをどこまで多様に演出出来るかが、このシンプルなアクションゲームのアクションの可能性を表現している。

敵や敵の攻撃などを考慮して制限された動き、動きのサブセット。
このサブセットこそが、ゲームとしての深みの多様性を表現しているわけだ。


サブセットには余裕がなくてはいけない。
例えば敵の弾を避けるときなど、可能な回避の動きは非情に幅が広くなくてはいけない。
そうでないとゲームがシビアになりすぎるから。



  • 本質
斜面やジャンプの角度を調整できいるようになっても、2段ジャンプが出来るようになっても本質は同じ。
他のゲームでも、可能な動きから選択するということでは同じである。

ちなみにマリオカートなどはよく出来ていると思う。
マップの上で可能な動きの全てをあらわした抽象的な模式図の中から、タイムアップに繋がる動き、繋がらない動きというのが複雑に絡み合って設計されている。
ミスがダメージになるアクションゲームと反対。
良い動きがタイムアップに繋がるという報酬系の世界。
この点も非常によくできている。