OFとC++初心者の日記

OpenFrameworks と C++をハローワルドする日記

【processing】フレームレートや動画サイズなどの基本情報

こんにちは。kyonです。 今日はフレームレートや動画サイズなどの基本情報について忘れないように記述したいと思います。

フレームレート

フリッカー融合

50~60fpsあたりが、人間の眼がフレームを見ているのがわからなくなる限界

現在主に利用されているフレームレート

■テレビ
一般的には、30fps
テレビ自体は60fpsか、120fpsまでのフレームレートで表示できるので、監督が決める。
スポーツなどの動きが早いものは60fpsを利用することも多い。

■映画
24fpsが映画風に見えるので人気。

画面の大きさ

16:9の下記のサイズが一般的
1920×1080
1280×720

最近4Kが始まって
3840×2160
の映像もではじめている

【processing】ジェネラティブアート

ジェネラティブアートの勉強も始めました。
3つの本を読みながら勉強しようと思っています。
本には色々な参考サイトが書いてあるので、すぐに調べたり、参考にできるようまずはまとめたいと思います。

私が選択した本は、下記の3つの本です。

参考文献

【BOOK1】Nature of Code -Processingではじめる自然現象のシミュレーション

f:id:kyon_ha:20160717011659j:plain

本に関する情報

■英語版のサイト
The Nature of Code

ソースコード
GitHub - shiffman/The-Nature-of-Code: Repository for The Nature of Code book


【BOOK2】[普及版]ジェネラティブ・アート―Processingによる実践ガイド

f:id:kyon_ha:20160717011457j:plain

本に関する情報

■下記のサイトでプログラムコートやPDF版をダウンロードできます↓
[普及版]ジェネラティブ・アート:ダウンロードページ | 株式会社ビー・エヌ・エヌ新社

■マット・ピアソン(著者)のソースコードなど
Generative Art - AbandonedArt.org

■マット・ピアソン(著者)のブログ
http://zenbullets.com/blog/?p=1995

■processing
Processing.org

■Author Online オンラインフォーム
Manning | Generative Art

■良く利用するリファレンス ビデオ関係
Video \ Libraries \ Processing.org

画像関係

/*screenshot*/
void keyPressed(){
  if(keyCode == ENTER){
    saveFrame("screeen-###.jpg");
  }
}
本書で紹介されている参考サイト

■HTMLによるジェネラティブアート
CBCNET » HTML5でのジェネラティブ・アート[Processing、JavaScript、チュートリアル] (『ジェネラティブ・アート』の未刊の章)

■1936年 ベンヤミン 複製技術の時代における芸術作品
Walter Benjamin

■FORM+CODE デザイン・アート・建築における、かたちとコード
Processingの創始者の一人であるケイシー・リース
FORM+CODE - デザイン/アート/建築における、かたちとコード(BNN新社)

■ビジュアルコンプレキシティ 情報パターンのマッピング
マニュアル・リマ

visualcomplexity.com | A visual exploration on mapping complex networks

■ジェネレイティブアートとデザインのためのプラットフォームGenerator.x(マリウス・ワッツ)

Generator.x: Software and generative strategies in art and design

■マリウス・ワッツ
Marius Watz | Artist archive

■ロバート・ホジンのブログ
Robert Hodgin

■FutureDeluxe
FutureDeluxe | Design, Technology & Moving Image 詳細 vimeo.com vimeo.com

■REZA
REZA ALI

■What is Generative Art?Complexity Theory as a Context for Art Theory
http://philipgalanter.com/downloads/ga2003_paper.pdf

■ガランダ−教授のサイト

http://philipgalanter.com/

■盲目の時計職人
遺伝的アルゴリズムについて記載されている

■パーリンノイズ

Ken Perlin's homepage

本書で紹介されているプログラミングツール

openFrameworks
Context Free Art
Structure Synth
NodeBox | NodeBox
vvvv - a multipurpose toolkit | vvvv


【BOOK3】Generative Design ―Processingで切り拓く、デザインの新たな地

f:id:kyon_ha:20160717011923j:plain

About - GENERATIVE GESTALTUNG

(追記します)

【C++】ファイル構成・ポインタ・thisについて

ハローkyonです

今日は

http://download.bnn.co.jp/download/beyond_interaction/BNN_BeyondInteraction.pdf

のp145から勉強したよ^^

今日はファイルの構成とポインタとthisについて勉強します

ファイル構成について

ーーー
【.h ヘッダーファイル】
他のファイルでも利用できるように定義を記述します
例:クラスの定義が入っています
下記のようなものです

class testApp : public ofBaseApp {
public:
void setup();
void update();
void draw();
float phase; //位相
float frequency; //周波数
};
#endif

ちなみにクラスには、void update();のような関数と
float phase;のような変数でできています。
float phase;のようなクラスの変数一つ一つをフィールドといいます

【.cpp 実装コード】
例:下記のようなクラスの実装コードが入っている

void testApp::setup(){
sampleRate = 44100; //サンプリング周波数
amp = 0.5; //音量
pan = 0.5; //左右の定位
phase = 0; //位相
frequency = 440; //周波数
152 | 153
ofSoundStreamSetup(2, 0, this); //サウンドストリームの準備、左右2ch
}

ーーー

これを念頭に置かないとわからなくなりますね

続いて

ポインタについて

p145ページに

main.cpp

#include "ofMain.h"
#include "testApp.h"
#include "ofAppGlutWindow.h"
int main(){
ofAppGlutWindow window;
ofSetupOpenGL(&window, 1024,768, OF_WINDOW);
testApp* test2 = new testApp();
ofRunApp(test2);
}

というコードがあります。
ポインタの説明をわかりやすくするために

testApp* test2 = new testApp();
ofRunApp(test2);

を書き換えました。
newの返り値は、必ずtestApp*のように、hogehoge*になります。
なので、変数を定義するときの型はhogehoge*になります。
*はポインタを表しています

ここで、疑問が。。。new testApp()って何だ?
これが何かを理解するためには、ポインタを理解する必要があります。

■ポインタとは
ポインタはメモリを参照している変数で
普通の変数には、インスタンスが入っていますが、
ポインタにはインスタンスのメモリ上の場所が入っています。

ちなみに、インスタンスとはクラスを利用する時に作るものです。
インスタンスを作るとクラスで定義したフィールドがメモリ上で確保されます。

わかりにくいので例えば下記のようなコードの場合の
メモリとポインタの関係について具体的に説明します

int main(){
 testApp test1;//test1はtestAppのスタック上のインスタンス
 testApp* test2 = new testApp();//test2はtestAppのヒープ上のインスタンス
 testApp* test3 = &test1;
ofRunApp(test2);
}


まず、メモリにはStackとHeapがあります

f:id:kyon_ha:20160619190114j:plain

■Stack
testApp test1;のように記載する場合です
関数が呼び出された時に自動的に用意されるメモリです。
関数が呼び出された時に自動的に追加され終わるときに消えます。
下から順番に追加されます。

■Heap
testApp* test2 = new testApp();のように記載する場合です
自分でメモリを確保できます。
確保するには、下記のように記載します

new testApp();

メモリリーク
スタックと違いnewで作ったもの(Heapでメモリ領域を確保したもの)は必ず

delete test2;

このように消さないと残ってします。 Stack内のポインタが消えたけど、Heapの領域が残ったままで参照もできない状態をメモリリークといいます。
メモリリークが多すぎるとそのままメモリの使用量が増え、パソコンのメモリが足りなくなってプログラムがクラッシュします

new testApp();

ちなみに、この場合だと
メモリは確保されるけど、ポインタがないから利用できないのでメモリリークですね

■StackでのインスタンスとHeapのインスタンスの使い分けについて

これまで説明してきたように、インスタンスには2種類の作り方があります
Stackでのインスタンスでも利用できるし、
Heapのインスタンスも利用できます。

 testApp test1;//test1はtestAppのスタック上のインスタンス
 testApp* test2 = new testApp();//test2はtestAppのヒープ上のインスタン

Stackのパフォーマンスが高いからできるだけStackを利用したいですが、
たとえば今の関数が終わってからでもそのインスタンスを利用したい場合に、Heapのインスタンスを作ります。

thisとポインタの関係について

ちなみに、P154にこのようなコードがあります。

testApp.cpp

#include "testApp.h"
void testApp::setup(){//testAppというクラスのsetupという関数
sampleRate = 44100; //サンプリング周波数
amp = 0.5; //音量
pan = 0.5; //左右の定位
phase = 0; //位相
frequency = 440; //周波数
152 | 153
ofSoundStreamSetup(2, 0, this); //サウンドストリームの準備、左右2ch
}

この「this」は何を表しているのでしょう

ofSoundStreamSetup(2, 0, this); //サウンドストリームの準備、左右2ch

thisの意味は今のインスタンスへのポインターという意味です。
例えば、

#include "testApp.h"
main(){
 testApp test1; 
 test1.setup();
}

まず、test1はtestAppのインスタンスです

この場合、setupの中のthis
つまり上記のコードの
ofSoundStreamSetup(2, 0, this); がtestAppのインスタンス(test1)へのポインタになります。
ポインターは、そのもののインスタンスへのポインターとしても利用できるし、
その先祖クラスのインスタンスのポインタとしても利用できます

ofSoundStreamSetup(《出力チャンネル数》,《入力サンプル数》,
《ofSimpleAppへのポインタ》)

このコードの場合は、おそらくtestAppの祖先クラスがofSimpleAppなので、コードはこのようにかけるわけです。
(このコードのofBaseApp の定義をみないとわからない)

ネームスペースとは何だ?!

ハロー^^kyonです。
今日も少し勉強したよ^^

yoppa.org こちらのP137の勉強したメモです。

下記のコードが本文に記載されています。

#include <iostream>
using namespace std;
class Dog { // Dogクラスの定義
}; //Dogクラスの定義終了 (最後に";"が入るのに注意)
int main (int argc, char * const argv[]) { //メイン関数
}

ここで疑問が

「using namespace std;」とは何だ?!

■using namespace std;
標準の関数がこの「std」というネームスペースの中にあり、コードの中で簡単に利用するために「using namespace std;」と記載する。
(標準の関数とは、例えば、上記のコードに記載されている<iostream>のファイルの中にある「cout」や、vectorやmapなどがある)

#include <vector>

の場合も、ネームスペースはstdに設定されている。
そのため、「using namespace std;」を記載することにより「std::」の省略が可能になる。

具体的には下記の通りである。

using namespace std;を書かない場合

#include <iostream>
std::cout << "Hello, world!" << std::endl;

using namespace std;を書いた場合

#include <iostream>
using namespace std;
cout << "Hello, world!" << endl;

このように「std::」を書く必要がなくなる。

で、そもそも

「ネームスペース」とは何か

C++では、例えば、複数のファイルに同じ名前の関数を記載する場合に、重複しないように名前をつけたネームスペースに入れる必要がある。
主にヘッダーファイルで利用する。

具体的にはこのようにかく

// 名前空間 seal を定義する
namespace seal
{
    // ここに宣言する
    int foo()
    {
        // int foo()の定義
        ....
    }
    ...
};

上記の書籍のP144のコードの場合

#include <iostream>
using namespace std;
class Dog { // Dogクラスの定義
public:
string name; //犬の名前 (状態)
void bark(); //犬が吠える (動作)
}; //Dogクラスの定義終了 (最後に";"が入るのに注意)

は重複しない場合はこのままで良いが、

#include <iostream>
using namespace std;

namespace animals{
 class Dog { // Dogクラスの定義
 public:
 string name; //犬の名前 (状態)
 void bark(); //犬が吠える (動作)
 }; //Dogクラスの定義終了 (最後に";"が入るのに注意)
}

とかいたら他のファイルでも違うネームスペースでclass Dogを記載することができる。

ちなみに、呼び出す場合は

animals::Dog dog;
dog.bark();

または、

using namespace animals;
Dog dog;
dog.bark();

ちなみに、pyrhonの場合はファイルがそのままnamespaceになるから、自分で定義する必要がない。

namespace を参考に勉強させていただきました^^

またねーーー♡

【C++】.hpp .hファイルって何だ?!

OFの勉強を始めるにあたって

下記の書籍を参考にさせていただきました。 yoppa.org

今日は、p133からのC++の部分を読みながら、勉強した内容をメモします。 勉強を始めたばかりなので、間違えていたら教えてください。

■ヘッダーファイル
他のファイルでも使えるような定義を入れる .hppや.hというファイル形式で保存

■.hppと.hの違い
.hpp はC++が入っているという意味
.h はC言語C++で利用することもある)

 ■ヘッダーガード
複数のファイルから同じヘッダーファイルがincludeされた場合、コンパイル中に作成される定義が重複したら困るので、ヘッダーガードが存在する。 (コンパイルの際の動きとしては、複数のファイルを別々にコンパイルしてから、まとめて一つの実行ファイルを作成する。)

ヘッダーガードをするために、下記の3つのコードを記載する。

#ifndef  //ヘッダーファイルを作るときに先頭に記載する
#define //変数を定義
#endif //ヘッダーファイルを作るときの最後に記載する

これら3つのコマンドでヘッダーファイルが一回のみ読み込まれる。
1回目の読み込み → #ifndef の中に入り、ifndef 以下のコードを読む。
2回目以降→ コンパイル中にすでに定義されている状態になり読み込まない。

■#include について

#include <iostream>
//iostreamはC++のファイルの読み込みなどができるライブラリ
//ちなみにincludeは、ファイルの中身を全部コピペしている。
//例えば<iostream>の場合はiostreamをばっと全部コピーしている

サンプルコード

#ifndef Test_hpp //ヘッダーファイルを作るときに先頭に記載するもの
#define Test_hpp //変数を定義
 
#include <iostream>

using namespace std;

class Test { // Testクラスの定義
 public:
     string name; //名前 (状態)
}; //Testクラスの定義終了 (最後に";"が入るのに注意)

#endif /* Test_hpp */ //ヘッダーファイルを作るときの最後

じゃーねぇ(^^)