OpenFileDialog,SaveFileDialogは共にSystem::Windows::Forms名前空間にある。
プロジェクトの初期設定によってはSystem.Windows.Forms.dllを明示的に#usingしなければならないかもしれない。
OKボタンが押されたかの判定はOK定数を使うが、System::Windows::Forms::DialogResult::OKでenum classされている。場所がわからないと詰まるので注意したい。
またこれらの関数はアプリケーションのカレントディレクトリを変更してしまうので、カレントディレクトリを維持したい場合はRestoreDirectory = trueを指定する。
using namespace System; //本来これが必要。コンソールプロジェクトの場合は明示する必要がある #using <System.Windows.Forms.dll> ///////////////////////////////////////////////// //ファイルを開くダイアログ void Open_File_Dialog(){ System::Windows::Forms::OpenFileDialog^ ofd = gcnew System::Windows::Forms::OpenFileDialog(); ofd->Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*"; ofd->FilterIndex = 1;//初期状態でtxtが選択される ofd->Title = "テキストファイルを開く";//ダイアログのタイトル ofd->RestoreDirectory = true;//ダイアログの使用によってカレントディレクトリが変更されないようにする if (ofd->ShowDialog() == System::Windows::Forms::DialogResult::OK){ Console::WriteLine( ofd->FileName ); } } ///////////////////////////////////////////////////////////////////////// //ファイルを保存ダイアログ void Save_FileDialog(){ System::Windows::Forms::SaveFileDialog^ sfd = gcnew System::Windows::Forms::SaveFileDialog(); sfd->FileName = "default.jpg"; sfd->InitialDirectory = "C:\\"; sfd->Filter = "PNGファイル(*.png)|*.png|JPGファイル(*.jpeg;*.jpg)|*.jpeg;*.jpg|すべてのファイル(*.*)|*.*"; sfd->FilterIndex = 2;//初期状態でjpgが選択される sfd->Title = "画像ファイルを保存";//ダイアログのタイトルを設定する sfd->RestoreDirectory = true;//ダイアログの使用によってカレントディレクトリが変更されないようにする //ダイアログを表示する if (sfd->ShowDialog() == System::Windows::Forms::DialogResult::OK) { //OKボタンがクリックされたとき、選択されたファイル名を表示する Console::WriteLine(sfd->FileName); } } /////////////////////////////////////////////////// //エントリーポイント [STAThread] int main(array<System::String ^> ^args) { Open_File_Dialog(); Save_FileDialog(); Console::Read();//待機 return 0; }
・三人称
・~た
・推理小説風のファンタジー系
・ページ数:254
・小林泰三
本作は推理小説風のファンタジーである。現実からは飛躍した世界観で行われる犯罪には、科学や常識の知識は全く役に立たない。
主な舞台は「不思議の国のアリス」の不思議の国で、それ及びそれに類する物語の登場人物も多く登場する。不思議の国のアリスの兎や帽子屋は割と有名だと思うが、有名どころから少し外れたキャラクターに関しても押さえておくとなお良い。特にハンプティーダンプティーだけは知っておいた方がいい。知らなくても何の支障も無いが知っておいた方がイメージしやすい。
小林泰三なのでグロテスクな描写が所々にある。常識の範囲内だとは思うが、もし臓物の描写が全くだめなら注意する必要がある。
そしてこの作品の魅力は世界観、トリックももちろんなのだが、論理的でありながら前提が間違っている会話だ。しかし完全に混沌としているわけではなく、そして一見哲学的でありながら全くそうではない。
P79 - P80
「わたしはあの場所にいなかった」
「そんなに言うのなら、証明して見せてくれ」
「確信があるのなら、今すぐわたしを逮捕しないのはなぜ?」
「泳がせてるのさ」三月兎が言った。「余罪の証拠が摑めるかもしれないし」
「余罪って?」
「取り調べ中の罪とは別の罪のことだよ」
「単語の意味を知りたいんじゃなくて、余罪ってグリフォン殺しのことかって訊いているの」
「えっ。あんた、グリフォンを殺ったのか?!」
三月兎の目が飛び出した
「だから、殺ってないって」
「でも、いま確かに余罪はグリフォン殺しだって言ったよ」三月兎が食い下がった。
「えっ?自白したのか?!」頭のおかしい帽子屋が歓声を上げた。「これで見事事件解決だ!!」
「そんなこと言ってないわ。私はハンプティ・ダンプティもグリフォンも殺してない!」
「これじゃあ、堂々巡りだ。もう観念したら?」三月兎がぼやいた。
「やってもいない罪を告白するなんてまっぴらごめんよ」
「事態を打開しなくちゃ」ビルが言った。
「難しい言葉を使っちゃった? かっこいい? それからいまの使い方合ってた?」
「合ってるけど、言うだけじゃ何も進展しないわ」
ダイアログを作った後、呼び出し元に処理が戻るモーダレスダイアログ(モードレスダイアログ)を作成する。
プロジェクトを右クリック→[追加]→[リソース...]を選択し、リソースの種類(T)で[Dialog]を選択し、[新規作成]ボタンを押すことでリソースを追加する。
#include "resource.h"//IDD_DIALOG1の定義が入っている
ダイアログプロシージャは普通のウィンドウプロシージャと似ているが、戻り値がINT_PTRとなっている。
この関数では、メッセージを処理した場合はTRUEを、処理しなかった場合はFALSEを返す必要がある。
注意:DefWindowProcで返してはならない。挙動がおかしくなる。
モーダルダイアログの時と概ね同じだが、ウィンドウの破棄には(EndDialogではなく)DestroyWindowを使う。下コードではPostQuitMessageもしているが、これはこのサンプルの都合である。
INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { INT_PTR ret = FALSE; switch (msg) { case WM_COMMAND: switch (wp) { case IDOK: MessageBox(hWnd, _T("IDOK"), 0, 0); DestroyWindow(hWnd); PostQuitMessage(0); ret = TRUE; break; case IDCANCEL: MessageBox(hWnd, _T("IDCANCEL"), 0, 0); DestroyWindow(hWnd); PostQuitMessage(0); ret = TRUE; break; } break; case WM_CLOSE: DestroyWindow(hWnd); PostQuitMessage(0); ret = TRUE; break; } return ret; }
CreateDialog関数 https://msdn.microsoft.com/ja-jp/library/cc410690.aspx
第二引数は「ダイアログボックステンプレートの名前(文字列)」か「リソース識別子(数値)」を渡す。後者の場合、MAKEINTRESOURCEで変換する。
第三引数はダイアログを呼び出す親ウィンドウのハンドル(HWND)を渡す。この例では親ウィンドウを作っていないのでNULLを渡す。
CreateDialog関数は、DialogBox関数と違い、ダイアログを表示した後すぐにウィンドウハンドルを返しに戻ってくる。
そのため、すぐにプログラムが終了しないようにメッセージループに入っている。上記ダイアログプロシージャの中でPostQuitMessageをしているのは、ダイアログが閉じたときに本体も終了させないと、終了させる手段がなくなってしまうからだ。
ちなみにこの関数で作成したダイアログは初期状態で非表示なので、ShowWindowを使って表示させる必要がある。
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc); ShowWindow(hDlg, SW_SHOW); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
#include <Windows.h> #include "resource.h" //IDD_DIALOG1の定義が入っている #include <tchar.h> //ダイアログプロシージャ INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { INT_PTR ret = FALSE; switch (msg) { case WM_COMMAND://ボタンが押された場合、WM_COMMANDのwParamにボタンのIDが入っている switch (wp) { case IDOK://IDOK(値1),IDCANCEL(値2)は初めから定義されている(WinUser.h) MessageBox(hWnd, _T("IDOK"), 0, 0); DestroyWindow(hWnd);//ダイアログを閉じる。(プログラム終了ではない。それは下のPostQuitMessageがやっている) PostQuitMessage(0); ret = TRUE; break; case IDCANCEL: MessageBox(hWnd, _T("IDCANCEL"), 0, 0); DestroyWindow(hWnd); PostQuitMessage(0);//プログラム終了 ret = TRUE; break; } break; case WM_CLOSE: DestroyWindow(hWnd); PostQuitMessage(0); ret = TRUE; break; } return ret; } //エントリーポイント int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc); ShowWindow(hDlg, SW_SHOW); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
呼び出したら、OKやキャンセルボタンを押すまで処理が返ってこないウィンドウをモーダルダイアログと言う。
プロジェクトを右クリック→[追加]→[リソース...]を選択し、リソースの種類(T)で[Dialog]を選択し、[新規作成]ボタンを押すことでリソースを追加する。
#include "resource.h" //IDD_DIALOG1の定義が入っている
ダイアログプロシージャは普通のウィンドウプロシージャと似ているが、戻り値がINT_PTRとなっている。
この関数では、メッセージを処理した場合はTRUEを、処理しなかった場合はFALSEを返す必要がある。
注意:DefWindowProcで返してはならない。挙動がおかしくなる。
また、モーダルダイアログ呼出中は呼出元は停止しているので、この関数のどこかでEndDialogをしてダイアログを終了しなければならない。
INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ INT_PTR ret = FALSE; switch (msg) { case WM_COMMAND: switch(wp){ case IDOK: EndDialog( hWnd , (INT_PTR)IDOK ); ret = TRUE; break; case IDCANCEL: EndDialog( hWnd , (INT_PTR)IDCANCEL ); ret =TRUE; break; } break; case WM_CLOSE: EndDialog( hWnd , (INT_PTR)WM_CLOSE ); ret =TRUE; break; } return ret; }
DialogBox関数:https://msdn.microsoft.com/ja-jp/library/cc410759.aspx
第二引数は「ダイアログボックステンプレートの名前(文字列)」か「リソース識別子(数値)」を渡す。後者の場合、MAKEINTRESOURCEで変換する。
第三引数はダイアログを呼び出す親ウィンドウのハンドル(HWND)を渡す。この例では親ウィンドウを作っていないのでNULLを渡す。
INT_PTR d = DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),nullptr,(DLGPROC)DlgWndProc );
DialogBox関数の戻り値は、EndDialog関数の第二引数である。INT_PTRにキャストして正常に返せるのならどんな値でもいいが、用途としてはどのボタンで閉じられたかが思いつく。あるいはダイアログ側で設定したデータを収めた構造体のインスタンスへのポインタなどが良いかもしれない。
switch(d){ case IDOK: MessageBox(nullptr,_T("IDOK"),0,0); break; case IDCANCEL: MessageBox(nullptr,_T("IDCANCEL"),0,0); break; case WM_CLOSE: MessageBox(nullptr,_T("WM_CLOSE"),0,0); break; } PostQuitMessage(0);
#include <Windows.h> #include "resource.h" //IDD_DIALOG1の定義が入っている #include <tchar.h> //ウィンドウプロシージャ INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { INT_PTR ret = FALSE; switch (msg) { case WM_COMMAND://ボタンが押された場合、WM_COMMANDのwParamにボタンのIDが入っている switch (wp) { case IDOK://IDOK(値1),IDCANCEL(値2)は初めから定義されている(WinUser.h) EndDialog(hWnd, (INT_PTR)IDOK); ret = TRUE; break; case IDCANCEL: EndDialog(hWnd, (INT_PTR)IDCANCEL);//ダイアログを閉じる。IDOK,IDCANCELはそれぞれ1と2なので、INT_PTRへキャストできる ret = TRUE; break; } break; case WM_CLOSE: EndDialog(hWnd, (INT_PTR)WM_CLOSE); ret = TRUE;//このメッセージを処理したのでTRUEを返す break; } return ret; } //エントリーポイント int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { //ダイアログ表示 INT_PTR d = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, (DLGPROC)DlgWndProc); switch (d) { //ダイアログの戻り値の確認 case IDOK: MessageBox(nullptr, _T("IDOK"), 0, 0); break; case IDCANCEL: MessageBox(nullptr, _T("IDCANCEL"), 0, 0); break; case WM_CLOSE: MessageBox(nullptr, _T("WM_CLOSE"), 0, 0); break; } PostQuitMessage(0); return 0; }
第1部 コンピュータグラフィックスの基礎
第1章 プログラミングの準備
1.1 Visual Studioを用いたプログラム開発
1.1.1 コンソールアプリケーションの作成
1.1.2 設定の変更
1.2 glutとOpenGLの利用
1.3 freeglutのインストール
1.4 freeglutを利用したプログラミング
この章で学んだOpenGLとglut関数
第2章 OpenGLとglutを用いた2次元コンピュータグラフィックス
2.1 2次元コンピュータグラフィックスのプログラミング
2.1.1 図形の指示
2.1.2 座標の指示
2.1.3 図形の色分け
2.2 座標の投影とビューポート変換
2.2.1 正投影の導入による表示範囲の拡大
2.2.2 ウィンドウとビューポート変換
2.2.3 アスペクト比の変更
2.2.4 図形中心の表示
参考文献
この章で学んだOpenGLとglut関数
第3章 3次元コンピュータグラフィックスへの拡張
3.1 正投影
3.1.1 視点の変更
3.1.2 視体積の範囲決め
3.1.3 方位角と仰角の利用
3.1.4 マウス操作による視点の変更
3.2 ポリゴンの描画
3.2.1 隠面消去
3.2.2 シェーディング
この章で学んだOpenGLとglut関数
第二部 OpenGLを用いた並列図形処理
第4章 ボロノイ図の生成
4.1 ボロノイ図とは
4.2 ボロノイ図の画像生成
4.3 実装の準備
4.4 円錐形状の描画
4.5 画像の取得と利用
参考文献
この章で学んだOpenGLとglut関数
第5章 オフセット平面の生成
5.1 デプスバッファを用いたオフセット面の計算
5.2 STLフォーマット
5.3 STLファイルの読み込み用関数
5.4 ポリゴンモデルの表示用関数
5.5 オフセットプログラムの準備
5.6 オフセット処理の実現
5.6.1 球、円筒形、スラブ形状の描画
5.6.2 オフセット面の取得
5.6.3 オフセット面の描画
5.7 プログラムの完成
参考文献
この章で学んだOpenGL関数
第3部 CUDAの導入とOpenGLとの併用
第6章 CUDAの導入
6.1 CUDAのインストール
6.2 Visual StudioによるCUDAプログラムの開発
6.3 CUDA処理の基本的な考え方
6.3.1 典型的な処理の流れ
6.3.2 GPUの並列処理アーキテクチャ
6.3.3 スレッドによる並列処理
6.3.4 ブロックとグリッド
6.4 CUDA関数の紹介
6.4.1 メモリ管理
6.4.2 データ転送
6.4.3 ブロックとグリッドの定義
6.4.4 カーネル関数
6.4.5 デバイス関数
6.5 プログラム例
6.5.1 CPU処理の実装例
6.5.2 CUDAによる実装
6.5.3 シェアードメモリの利用
参考文献
この章で学んだCUDA関数
第7章 粒子解析とアニメーション表示
7.1 粒子解析法
7.2 粒子解析法アルゴリズムの実装
7.2.1 CPU処理による実装
7.2.2 GPU処理による実装
7.3 VBOの導入
7.3.1 VBOを用いた図形描画
7.3.2 VBOによる粒子群の表示
7.4 CUDAとVBOの併用
参考文献
この章で学んだOpenGL関数
この章で学んだCUDA関数
第8章 拡散方程式の数値解法とアニメーション表示
8.1 差分法による拡散方程式の数値解法
8.2 差分法アルゴリズムの実装
8.2.1 CPU処理による実装
8.2.2 GPU処理による実装
8.2.3 シェアードメモリの利用
8.2.4 テクスチャメモリの利用
8.3 PBOの導入
参考文献
この章で学んだOpenGL関数
この章で学んだCUDA関数
第4部 CUDAによる複雑な図形処理
第9章 メタボール法
9.1 粒子群の濃度場
9.2 ソートによる粒子群のセルへの割り当て
9.3 実装の準備
9.4 基本的なデバイス関数の定義
9.5 カーネル関数の定義
9.6 thrustライブラリ
参考文献
この章で学んだglut関数
この章で学んだCUDA関数
第10章 マーチングキューブ法
10.1 マーチングキューブ法
10.2 アルゴリズムの概要
10.3 実装の準備
10.4 テクスチャメモリの利用
10.5 カーネル関数の定義
10.6 Metaball.cppの修正
参考文献
この章で学んだOpenGL関数
第11章 包含立体の利用
11.1 包含ボックス
11.2 ボックス定義の準備
11.3 AABBとOBBの定義
11.3.1 AABBの定義
11.3.2 OBBの定義
11.4 包含ボックスに関する計算
11.4.1 点と包含ボックス間の距離
11.4.2 包含ボックス間の交差判定
11.5 階層的な包含ボックス
11.6 プログラムの利用法
参考文献
第12章 立体間の衝突検出
12.1 階層的な包含ボックスによる絞り込み
12.2 ポリゴン間の並列交差判定
12.3 撃力ベース法
12.4 実装の準備
12.5 階層的な包含ボックスによる絞り込み
12.6 撃力ベース法による衝突の解消
12.7 衝突判定
12.8 デバイス関数
12.9 カーネル関数
12.10 プログラムの利用法
参考文献
この章で学んだOpenGL関数
あとがき
サンプルプログラムの使い方
索引
第1部、第2部はOpenGLの導入となっている。
例えば第2章の「この章で学んだOpenGLとglut関数」は、
・glMatrixMode
・glOrtho
・glViewport
・glBegin
・glEnd
・glColor3f
・glVertex3*
・glutInitWindowSize
・glutInitWindowPosition
・glutReshapeFunc
となっている。本のタイトルに忠実ではあるが、この辺りは読み飛ばしてもおおむね問題ない人が多いだろう。
全部読んだわけではないが、印象として○○アルゴリズムをCとCUDAで実装しながら勉強するタイプの本。なのでCUDA文法やGPUの構造に関してはあまり踏み込んでいる印象がない。
作りながら覚えるならちょうどいい印象を受けたが、CUDAの辞書として使いたいならお薦めできない。あくまで画像処理の本である。
huluに来ていたので久しぶりに見た。
※ちなみに私は原作を知らない。原作派からすれば存在自体が許せない作品なのかもしれないが、ここでは考慮しない。というかできない。
私は日本のドラマ・映画はあまり見ない。そんな中、この作品がなぜ面白いのか。
それはそもそもの題材が、どうやってもシリアス展開にしようが無いふざけた作品であり、故にギャグに割り切った一直線な作品で、そしてそう作ることが完全に自然だからだろう。
例えば別の作品では、「GANTZ」の冒頭で電車に轢かれるシーンで、ホームに降りて(はいけないのはこの際許すが)暢気に酔っ払いを起こしているシーンを見ると「危機感なさ過ぎて冷め」てしまう。
しかしHKは違う。脚本や役者や映像に強烈な多少の無理違和感を覚えても、「まあギャグだし」と思えば全てが許せてしまう。演出や品質以前に設定がぶっ壊れているのだ。何が来ようとかまわん。
ただ私は「登場人物が変な格好をしている」事で面白みを感じることがほぼ皆無で、だから顔芸で売っている芸人とかは悉くだめだ。多分そういうので笑える人ならさらに面白いだろう。
注意点は二つ。まずいわゆる学芸会系の作品で、全編通してコントとか漫才のノリなので、割り切れないなら拷問である。約二時間の映画風長編コントと思えばいい。
※余談だが、いま見ていてラバーガールの大水洋介が出ていたことを初めて知った。多分他のキャラも何かしら役者以外の背景があるのだろう。ラバーガールはとても落ち着いたコントを見せてくれるので、本作を見る前に一本見ておくといいかもしれない
次に表現がいささか過激なことだ。いまGoogleアドセンスの導入ができないか考えているのだが、女性の水着写真がグレーゾーンだというので、変態仮面なんか確実にアウト間違いない。だから画像が貼れない(著作権はまた別)。
なんせことあるごとに男性の股間がアップされる映像作品である。ヒロインが思わず目を背けるシーン。気持ちわかるぞ。これ女性でやったら放映できないだろ。
改めてみるとローズってかなりクレイジーなキャラクタだと思う。なんかドクターとテンションが近い。
そして第二話にして五十億年後 地球最後の日。こういう、普通の作品なら長編とか劇場版とかに使いそうなショッキングなイベントを何の躊躇もなくシーズン1第二話に持ってくる。
金持ちが地球最後の日を眺めて楽しむというくそったれ優雅なイベントということで、この作品の未来観がわかる。資本主義続くんだね、あと50億年。ちなみに、資本主義の終焉についてはシーズン10第五話で言及している。イギリスの価値観の変化だろうか。
フェイスオブボー。初期の頃は本当に伏線の入れ方が良かった。最近のシリーズはそんな狡猾さが失われている気がする。
太陽がオレンジ色に光ってるのは演出でもおかしいと思ったらサンフィルタがかかってた。なるほどね。でもローズ、いくら直接当たらなくても見ただけで絶対に失明すると思うんだが・・・
あらためて見ると青い宇宙人も死んでいたらしい。救いたい対象が殆ど全滅することもあるからまだ犠牲は少ない方なんだよな。そうそう平和には終わらない。総じてドクターの中では失敗したケースの方が多い計算になってるんじゃないだろうか。
最後、ドクターは自分の星は焼けてしまったと言うけど、未だによくわからない。結局ギャリフレイはタイムロックされたのか、焼けたのか。実際ずっと「みんな死んでしまった」っていってたのに正確には「事実上死んだも同じ」だったわけだし。「ドクターの日」の兵器の説明も全てを滅ぼすみたいな漠然とした説明しかされて無いし、わかりづらい。
ストーリー展開上最後のタイムロードにした方が色々都合が良かったけど、人気出たから続けたい→12人の制約が→タイムロード復活以外に回避策がない
みたいな都合で復活したんだと思う。
プログラムが極めて楽で、ファイルを目視できるPPMテキストを書き出すプログラムを書いた。
//! @brief PPM(RGB各1byte,カラー,テキスト)を書き込む //! @param [in] fname ファイル名 //! @param [in] vmax 全てのRGBの中の最大値 //! @param [in] width 画像の幅 //! @param [in] height 画像の高さ //! @param [in] p 画像のメモリへのアドレス //! @details RGBRGBRGB....のメモリを渡すと、RGBテキストでファイル名fnameで書き込む void pnmP3_Write(const TCHAR* const fname, const int vmax, const int width, const int height, const unsigned char* const p) { // PPM ASCII FILE* fp = _tfopen(fname, _T("wb")); fprintf(fp, "P3\n%d %d\n%d\n", width, height, vmax); size_t k = 0; for (size_t i = 0; i < (size_t)height; i++) { for (size_t j = 0; j < (size_t)width; j++) { fprintf(fp, "%d %d %d ", p[k * 3 + 0], p[k * 3 + 1], p[k * 3 + 2]); k++; } fprintf(fp, "\n"); } fclose(fp); }
恐らく最も何も考えなくても使え、少なくとも結果確認には最良の選択のPNM形式のうち、カラーが扱えるPPMの、吐き出すのが比較的楽そうなP6について、読み込みコードを書いた。
//! @brief PPM(RGB各1byte,カラー,バイナリ)を読み込む //! @param [in] fname ファイル名 //! @param [out] vmax 全てのRGBの中の最大値 //! @param [out] width 画像の幅 //! @param [out] height 画像の高さ //! @param [in] 画像を読み込んだメモリアドレスを返すためのポインタへのポインタ //! @retval true 成功 //! @retval false 失敗 //! @warning RGBが各1byteでないと動作しない //! @details ファイルを読み込み、width*height*3のメモリを確保したうえでRGBをそこへ格納する bool pnmP6_Read(TCHAR* fname, int* vmax, int *width, int *height, unsigned char** p) { // PPM BINARY *width = -1; *height = -1; *vmax = -1; FILE* fp; fp = _tfopen(fname, _T("rb")); char tmp[2048]; char c; while ( c=fgetc(fp)) { if (isspace(c)) continue; if (c == 'P') { //フォーマットを特定する c = fgetc(fp) - '0'; if (c != 6) { fclose(fp); return false; } continue; } if (c == '#') { //コメントを読み飛ばす while (c != '\r' && c != '\n') c = fgetc(fp); continue; } if (*width < 0) { int s = 0; while(1) { if (isdigit(c)) { tmp[s++] = c; c = fgetc(fp); } else { tmp[s] = '\0'; *width = atoi(tmp); break; } } continue; } if (*height < 0) { int s = 0; while (1) { if (isdigit(c)) { tmp[s++] = c; c = fgetc(fp); } else { tmp[s] = '\0'; *height = atoi(tmp); break; } } continue; } if (*vmax < 0) { int s = 0; while (1) { if (isdigit(c)) { tmp[s++] = c; c = fgetc(fp); } else { tmp[s] = '\0'; *vmax = atoi(tmp); break; } } break; } else { break; } } if (*width < 0 || *height < 0 || *vmax < 0) { return false; } const size_t maxsize = *width* *height; unsigned char r, g, b; *p = new unsigned char[maxsize * 3]; for (size_t i = 0; i < maxsize; i++) { fread(&r, 1, 1, fp); fread(&g, 1, 1, fp); fread(&b, 1, 1, fp); (*p)[i * 3 + 0] = r; (*p)[i * 3 + 1] = g; (*p)[i * 3 + 2] = b; } fclose(fp); return true; }
Doctor Who (新シリーズ)
シーズン1 第一話
なぜか気になって見直しを始めた。
新シリーズの開始が2005年。
第一話。この話は敵がマネキンで、ラスボスがちょっと液体的なのが最後に出るだけ。
2005年といえばスター・ウォーズ エピソード3の頃。映画のCGも既にかなりこなれている時代。
しかしドクターフーは旧シリーズ(~1989)があったとはいえ世代も変わり新ドラマ扱いしてもいい。
既にドル箱となってしまった2018年現在とは全く違う雰囲気を感じる。
(この作品は定期的に雰囲気を変えることで長寿化を実現しているので当たり前なんだが・・・)
それにしても、ローズは美人なのに、いつ見てもローズのママはブスだ。。。女手一つで娘育ててるから苦労してるんだろうけど。
この作品、シリーズ通して母を悪く書いてるなとふと思う。あ、エイミーは違うか。美人だし。
そしてこの頃のドクターは過激。
ビルの屋上にあるプラスティックの遠隔装置を爆弾で吹っ飛ばす。全くじゃないけど、爆発物つかうのは珍しい展開。頭使えよ、賢いんだから。屋上の装置壊すには火薬多すぎるし。
でもシーズン4「運命の左折」ではやり過ぎて死んでたし、やっぱり”暴走を止める誰か”がいないとだめなんだろう。
コンパニオン候補が道で暢気に歩きながらドクターに質問する。このシーンもなんとなく珍しい。マーサとは月で、ドナはテレポーテーションして、エイミーは12後のカウントダウンで、クララは・・・ごめんどれが最初なんだ。とにかくいつも余裕がない。
ドクターを探すシーン。いまは懐かしいCRTディスプレイがつながったパソコンでDoctorを検索。
Doctor
Doctor Living Plastic
Doctor Blue Box
やっと見つかったがなんと9代目ドクターの写真が貼ってある。少なくとも13人いる中のよくその顔で写真を撮られたな。
そしてミッキーが入れ替わって、ドクターが解説し、ローズが謎を解き、ドクターがドジって、ローズが助けて・・・、とドクター・フーっぽくなっていく。
そして最後、ローズはドクターとの動向を一度断り、「タイムトラベルもできるけど?」と再度誘われてコンパニオンに。
そりゃやっとの思いで断ったんだから、二回目は無理だよね。
総評。懐かしい。そして作品自体が初々しい。まだ方向性が定まってない感じがして新鮮。