ぬの部屋(仮)
nu-no-he-ya
  •      12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
         12
    3456789
    10111213141516
    17181920212223
    2425262728  
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
       1234
    567891011
    12131415161718
    19202122232425
    26272829   
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728     
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28      
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
    1234567
    891011121314
    15161718192021
    22232425262728
           
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
         12
    3456789
    10111213141516
    17181920212223
    242526272829 
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
        123
    45678910
    11121314151617
    18192021222324
    25262728   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    15161718192021
    293031    
           
         12
    3456789
    10111213141516
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728     
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
          1
    2345678
    9101112131415
    16171819202122
    232425262728 
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
  • 石割桜

    KONICA MINOLTA DIGITAL CAMERA

     

    2015/04/19 岩手県盛岡市 石割桜。

    見る機会は10回以上あったきがするが、ちょうどいい満開に遭遇したのはこれが初めてかもしれない。

    花自体はとても見事に咲いているのだが、支えの棒がこうもたくさんあっては、老体を無理矢理酷使させられているように見えて哀れに思えてくる。いい加減休ませてやったらどうか。

     

     

    ngPlantで木を作る(3)

     

    ngPlantで木を作る作業の続きで、今日は枝に葉っぱをつける。

    葉はテクスチャでつけるので、まずは葉の画像を用意する。gimpなどで葉っぱっぽい何かを描いて、.tga .jpg .pngのいずれかの形式で保存する。別にペイントでもいいが、背景を透明にできないのでせめてアルファを使えるソフトがいい。

     

    早速やってみよう。

     

     

     

     

     

    ・・・できただろうか。

    leaf

     

     

    まずngPlantを起動し、葉っぱが生える枝を用意する。

    今回は説明のために主幹をそのまま使用。

    ① 葉っぱをつけたいBranchを右クリック→[append branch]→[New branch]で枝を追加する。
    74_leaf_addbranch

    ② 追加されたBranchを右クリック→[Stem model]→[Quad]を選択。
    75_leaf_quad

    ③ 見づらいので、まず[Stem]のLengthを大きくする。

    ④ このままWidthを大きくすると重なってしまうので、[Branching]へ行きLimit maxをOnし、Max. numberを3程度にする。これで枝から生えている葉っぱは三枚となる(はず)。

    ⑤ [Stem]に戻りWidthを大きくする。少し細長い四角形にする。

    ⑥ [Material]タブへ移動

    62_Branch3_Material

     

     

    Base color
    葉の色。テクスチャを使う場合は
    あまり関係がないが、そうでない場合は
    ここの色を緑色などにするだけでも
    葉ができてしまう。

    63_Material_BaseColor1

    Dif ... diffuse(拡散光)
    細かいことは気にせず、
    葉のテクスチャはここに設定する
    Nor ... Normal(法線)
    光が反射する時の計算に使う
    法線マップを設定する。なくてもいい
    Aux ... 不明

    このボタンは、③の?をクリックしたときに、
    Difを設定するか、Norを設定するか ...
    を指定するので、クリックしただけでは
    何も起こらない

    Texture
    テクスチャの設定ボタン兼プレビュー。
    大きな赤い?をクリックすると、
    ファイル読み込みダイアログが表示
    されるので、テクスチャファイルを
    読み込む。
    読み込んだ後小さな×印をクリック
    すると、テクスチャを解除できる
    右図は、
    左が自作した葉を設定した例
    右はngPlantが用意したfernleaf.tga
    を設定した例
    背景は黒く表示されているが、
    実際には透過色。

    65_Material_Texture1 66_Material_Texture2

    注意:テクスチャファイルは、
    [File]-[Preferences]の[Tex. locations]
    で設定したディレクトリ内のファイルしか
    扱えない

    double-sided
    ngPlantのデフォルトでは、
    ポリゴンの片面しか表示されない。
    (見る方向によって葉が消える)
    葉の時は大抵はこれでは困るので、
    チェックを入れてどちらから見ても
    葉が表示されるようにする。
    右図は左がチェックなし、
    右がチェックあり。
    67_Material_DoubleSide1 68_Material_DoubleSide2
    Transparent
    葉の透明色を反映させるかどうか。
    透明色を使用している場合、
    チェックを入れる
    右図は左がチェックなし
    右がチェックあり
    69_Material_Transparent1 70_Material_Transparent2
    Billboard mode
    葉をビルボード状態にする。
    Disabledでoff。
    Disabled以外では、
    どの方角から見ても
    面が正面を向いている状態を保つ
    右図は左がDisabled
    中央がSpherical
    右がCylindrical
    71_Material_Billboard1 72_Material_Billboard2 73_Material_Billboard3

    Control enabled
    調査中

     
    Fade-in
    調査中
     
    Fade-out
    調査中
     

     

     

     

    手品のタネ的な何か(C++)

    解説:

    ① Sampleはメンバ変数A,Bを持つ
    ② SampleのインスタンスはA=1,B=2で初期化される
    ③ showA,showBはA,Bを画面に表示する
    ④ A,Bはprivateで、setもfriend関数も用意していない。従ってA,Bを書き換える方法は存在しない

     

    class Sample{
    int A;
    int B;
    public:
    	Sample(){
    		A=1;
    		B=2;
    }
    void showA(){	std::cout << "A = " << A << std::endl;	}
    void showB(){	std::cout << "B = " << B << std::endl;	}
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Sample instance;
    
    	instance.showA();
    	instance.showB();
    int k;
    	std::cin >> k;
    return 0;
    }
    

     

    はずなんだが、Sampleに一切手を加えないでA,Bを編集することができる。

     

    int _tmain(int argc, _TCHAR* argv[])
    {
    	Sample instance;
    int* magicA = (int*)(&instance);
    int* magicB = magicA + 1;
    *magicA = 10;
    *magicB = 20;
    	instance.showA();
    	instance.showB();
    int k;
    	std::cin >> k;
    return 0;
    }
    

    意図してこれをやる人間はそうそういないと思うが、間違ってこうなっしまうケースは結構頻繁にある。そして謎の理屈でポインタがだめなやつだという烙印を押されるのである。

     

     

     

    ngPlantで木を作る(2)

    というわけでngPlantの続き。主幹に枝を追加した後、枝振りを作っていく。

     26_Branch2_Branching

     

     

     ①

    Density
    枝が生える密度を指定。
    例えば、
    Dencityが大きいと、
    Length=15の幹から10本の枝、
    Dencityが小さいと、
    Length=15の幹から5本の枝、
    というように変化する。
    本数で指定したい場合は
    ③,④,⑤で設定する。

    右図はそれぞれDensity=
    0.3 , 1.0 , 2.5

     26_density_0.3 27_density_1.0  28_density_2.5  
     ②  Variation
    不明
     
     ③  Min.number
    枝の最小の本数。
    Densityが小さかったり、
    元の幹が短かったりすると、
    どう設定しても枝が表示されないことがある。
    ここで設定すると、必ずこの本数だけは
    枝が生成される
    右図はDensity=0.01における
    Min.Number=
    0 , 3 , 10
     29_min.number1_density0.01 30_min.number3_density0.01 31_min.number10_density0.01
     ④  Limit max
    ⑤Max.numberを有効にするかどうか。
    無効の場合Densityなどの設定によって
    枝がいくらでも増えるようになる。
    右図はMax.number=3でLimit maxを
    Off(左)及びOn(右)
    Offの状態では、Max.numberより多くの
    枝が生えてしまっている。
     32_Branch2_LmitmaxOff 33_Branch2_LmitmaxOn
     ⑤  Max.number
    幹の長さやDensityによっては、
    枝がもの凄く多くなることがある。
    この値を設定しておくと、最大でも
    この数しか枝が増えなくなる。
     ④ ↑ 参照
     ⑥  Multiplicity
    同じ場所から枝が指定した本数だけ生える。
    枝を各方向に伸ばす場合、
    大抵は沢山生やしてRevAngleで
    巻くように生やすが、それでは同じ場所から
    枝が出てこない。
    右図は左からそれぞれMultiplicity=
    1,3,7
     34_Branch2_Multiplicity1 35_Branch2_Multiplicity3 36_Branch2_Multiplicity7
     ⑦  Min. offset
    枝が生え始める、根元側の位置を指定。
    右図は左からMin.offset=
    0.00 , 0.50 , 0.90
     37_Branch2_minoffset000 38_Branch2_minoffset050  39_Branch2_minoffset090
     ⑧  Max offset
    枝が生え終わる、先端側の位置を指定。
    右図は左からMax.offset=
    1.00 , 0.50 , 0.10
     40_Branch2_maxoffset100 41_Branch2_maxoffset050 42_Branch2_maxoffset010
     ⑨

     Start RevAngle
    RevAngleを指定するときの初期位置。
    RevAngleは一番下(地面側)の枝から
    何度回転という計算をするので、
    一番下の枝が幹のどの方向に
    ついているのかを決定する。

    いわゆる「正面」が変わる。

     43_Branch2_Start_RevAngle_044_Branch2_Start_RevAngle_45

    45_Branch2_Start_RevAngle_0_top46_Branch2_Start_RevAngle_45_top   

     ⑩  RevAngle
    枝が生える方向を角度で指定。
    特にこだわりがなければ137.5度(黄金角)
    にしておくと自然に見える。
    右図はRevAngleを137度にした例。
    ngPlantのRevAngleは小数点以下を
    指定できない点に注意。
     47_Branch2_RevAngle_137 48_Branch2_RevAngle_137_top
     ⑪  Variation
    (予測)RevAngleが機械的すぎるので、
    枝が生える方向にばらつきを持たせる(?)
    右図は
    Variation=0.0(左)と
    Variation=0.9(右)
     49_Branch2_Variation_0.0 50_Branch2_Variation_0.9
     ⑫  RotAngle
    枝そのものが回転する。
    枝に対してStemのAxis variationなどを
    指定しているとわかりやすい。
     51_Branch2_RotAngle_0 52_Branch2_RotAngle_15 53_Branch2_RotAngle_45 54_Branch2_RotAngle_200
     ⑬  Declination
    枝が生える上下方向の角度を指定。
    左右の赤点を上下に動かして指定する。

    55_Branch2_Declination_156_Branch2_Declination_258_Branch2_Declination_4

    57_Branch2_Declination_359_Branch2_Declination_560_Branch2_Declination_6

     Variation
    枝が上に伸びるか、下に伸びるかに
    ばらつきを持たせる
    右図は
    Variation=0.0(左)
    Variation=0.5(右)
     61_Branch2_Variation_0.0 61_Branch2_Variation_0.5

     

     

     

    ngPlantで木を作る(1)

    で、ngPlantは、木をポリゴンで作成するツールだ。

    1_first_status

    初期状態の画面はこうなっている。左側がビューで、円筒がこれから作成する木のべーすとなる。

    この画面での右側の上の方は使わない。

    重要なのは、右下の、図の赤枠で囲った部分。ここから、どの幹や枝を編集対象にするかを選択する。

    まず、最初は[Plant]が選択されているので、[Branch-1]をクリックし選択する。選択された枝は太文字になる。

    2_Branch-1_selected     3_Branch_Edit_number

    枝が選択されると、右上の画面がその枝の編集画面に変わる。ここからその枝の調整をしていく。

    ちなみに以下、サムネイル画像を貼り付けたところ本来の画像から上下が切れてしまった。クリックするとフルで見られる。意外と上下を見ないと理解できない画像があったりする。遠い未来に直すかもしれない。

    Length: 幹・枝の長さを調節。
    数字が大きくなるほど高く(長く)なる

    図は
    左がLength=15 ,
    右がLength=30

    4_Branch1_Length15 5_Branch1_Length30

    Variation:

    今、枝(幹)が一本しかない。
    こういうときは意味をなさないので
    後回しにする。

     

    Offset influence:

    これも一本しかないときは
    意味がないので後回し。

     

    Resolution:
    枝の長さ方向の分割数を指定。
    Altキーを押すと、ビューにポリゴン
    (三角形)を示す線が現れる。
    これで分割状態が変化することが
    確認できる。
    右図では左から20,5,1。
    枝が曲がる関節となるので、
    この値が小さいと思った形に
    ならないことがある

    8_Branch1_Resolution20 6_Branch1_Resolution5 7_Branch1_Resolution1

    Axis variation:

    枝をぐねぐね曲げる。
    (他に良い表現が思いつかない)。
    Resolutionが1だと変化がないので
    注意。
    右図はResolution=10で
    Axis variation=0.40のとき。

    10_Branch1_AxVar_R10A040_ue 9_Branch1_AxVar_R10A040_yoko

    Radius:枝の太さを指定。
    数字が大きくなるほど太くなる。

    右図はRadius=4とRadius=1

    12_Branch1_Radius4 11_Branch1_Radius1

    Profile:枝の太さの細かい指定

    右側の赤い点を小さくすると、
    頭頂部の径が小さくなる。
    左側の赤い点を小さくすると、
    根元が細くなる。
    右図
    右側の点を中間に置いた場合と、
    そこに点を一つ追加した場合。
    点の追加は線の上をクリックして行う

    14_Branch1_profile2 13_Branch1_profile1

    Resolution:枝の幅方向の分割数
    この値が小さいと角錐に近く、
    大きいと円錐に近くなる。
    小さい方がデータ量が小さくなる。

    右図はResolution=20及び8

     16_Branch1_Resolution20 15_Branch1_Resolution8
     Distribution
    枝を曲げる。あるいは垂れさせる。
    Axis variationと違って、一方向にしか曲がらない。
    右の赤い点を小さくすると頭頂部から垂れ、
    左の赤い点を小さくすると根本から垂れる。
    右図はLength=30で、各点を指定した場合。
    この曲がり具合もResolutionに依存するので注意。
     18_Branch1_Distribution2 19_Branch1_Distribution3 17_Branch1_Distribution1

     

    次に、枝を追加してみる。

     20_Branch1_next 21_Branch2_all

     [Branch-1]を右クリックし、[Append branch]→[New branch]を選択。

    くしのように新しい枝が生える。右下に表示されている新しい枝[Branch-1-1]が選択(強調表示)されていることを確認して、右上をもう一度見てみる。

    大体は同じで、違いは、主幹一本の時と違い、枝がたくさんあるときは各パラメータが影響を与えるのはその階層の枝全てだと言うこと。例えば、Axis Variationの数字をあげると、横に伸びている枝全てが複雑に折れ曲がる。

     22_Branch2_test

     

    Axis Variationは0にしておくとして、この状態で、先ほど飛ばしたVariationとOffset influenceについてみてみる。

    Variation
    枝が複数あるとき、長さにばらつきを与える
    23_Branch2_variation
    Offset influence
    枝が複数あるとき、長さを
    曲線的に変化させる
    24_Branch2_influence1 25_Branch2_influence2 

     

     

     

     

     

     

     

     

     

     

    std::removeの挙動

    俺がstd::removeを理解できないのはどう考えても仕様が悪い。

    というわけで、std::removeの挙動の再確認。

    std::removeは、第一引数から第二引数までのコンテナ内の、第三引数で指定された値を削除する(嘘)、STLの関数だ。

     

    今回使うのは以下。removeのためにalgorithm。iteratorはstd::beginを気分で使う。

    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <iterator>

     

     

     

    まず配列を用意して初期化する。

    std::vector<int> vec = { 1, 2, 3, 2 , 4, 2 , 5 };
    
    for (auto i = std::begin(vec); i != std::end(vec); i++){
    	std::cout << *i << std::endl;
    }

    結果は、

    1
    2
    3
    2
    4
    2
    5

     

     

     

     次に、この配列の値2に対してstd::removeをかける

    auto end = std::remove(std::begin(vec), std::end(vec), 2);
    
    for (auto i = std::begin(vec); i != std::end(vec); i++){
    	std::cout << *i << std::endl;
    }
    

     結果は、

    1
    3
    4
    5
    4
    2
    5

     

     

     

    さあ、もう訳がわからない。消えたはずの2は残っていてその割に個数は減っていてその上位置まで変わっていて、さらにいじったつもりのない4と5が増えている。

     

     

    Erase-Removeエディオムというのがあり、eraseと併用すれば消える。

    vec.erase(
    	std::remove(
    		std::begin(vec),
    		std::end(vec),
    		2
    	),
    	std::end(vec)
    );
    
    for (auto i = std::begin(vec); i != std::end(vec); i++){
    	std::cout << *i << std::endl;
    }

     

     

     

    これはつまりこういうことだ。

     

    std::removeは、指定した削除対象の値以外のものを配列の左側に再配置する。

    そして戻り値として、必要なデータが入っている領域の次の値へのイテレータを返す。

    std::removeが行うのはコンテナの中の値の書き換えだけなので、高速だが、そのままではいわば「破棄推奨領域」が生じてしまう

    (※) end2 = std::remove(begin,end,value);というようにして、以後の処理を begin~end2の範囲に対して行うようにすれば、消えたものとして処理できる。

    この破棄推奨領域を削除する行為は、確保されているメモリ領域の変更なのでstd::eraseを用いる必要がある。

    removeerase

     

    一才桜(2015/03/07)

     

     

     

     

    今年の冬はかなり暖かかったようで、部屋の中が氷点下になることはなかったように思う。

    その甲斐あってか、まだ3月だというのに部屋に入れておいた桜がほんのりと咲き始めた。買って三年ぐらいだろうか。まだ選定をしたことがない。今年あたりやってみようと思う。

     

    issai_zakura_2015_03_08

     

     

    旅のラゴス

     

     

     

    ・「おれ」の一人称。

    ・~た。

    ・超能力系のSF

    ・ページ数:250

    ・筒井康隆

     

    一度文明が滅んだ世界で、主人公ラゴスの旅の最中に起こった様々な事件が、一話完結で12ほど納められている。

    一話完結とはいえ前後のつながりはちゃんとあるので順番に読むべき。

     

    きわめて哲学要素が強い作品。超能力もたいしたものはなく、人や他の生物と共感するとか、壁抜け(ただしすごく時間がかかる)とか、そんな類で、あくまでも世界観としての立ち位置に忠実。戦闘ものではないため戦いのシーンはほぼ出てこない。そういう意味ではアクション性はない。ただし馬で盗賊から逃げたりはする。

    笑い所はないが作品としてはとても「きれい」な類で、落ち着いて読める。

     

     

     

     

    -------------------------------------------------------------------------

    遅い夕食は夫人と令嬢の吟味によるまさに貴族の晩餐と呼ぶにふさわしいもので、それはただのホテルの宿泊客に出す料理のようではなく、その上その食事はたったひとりの客であるおれと、主人のドリド氏との会食であり、夫人と令嬢の給仕によるものであった。夫人と令嬢はこの上なく高貴であり、令嬢の愛らしさは例えようがなかった。おれは夢見心地で食べ続けた。

    -------------------------------------------------------------------------

    「ラゴスさん、あんた石火箭が扱えるかね」

    おれはそのことばで一も二もなくとび起きた。「襲撃だな。盗賊団か」

    身支度するおれにシャクロは揉み手を続けながら説明した。「奴隷狩りだよ。この町の南西二百キロのところに銀山があって採掘業者が銀鉱を開いているのだが、鉱夫を傭わずに奴隷を使っている。その奴隷の数が少なくなると近くの村へ出かけて奴隷狩りをやるのだが、まさかこんな大きな町を襲うとは思わなかった。奴隷の数がよほど不足しているんだろう」

    「連中、どれぐらいいるんだ」

    「朝がた、見張りの傭兵が城壁の上から見たところでは、約八十人が町を取り囲んでいるそうだ」

    「こっちの傭兵の数は」

    「二十人とちょっと、それに警備隊員が予備役も入れて二十五人前後」

    「そいつはえらいことだな」

     ------------------------------------------------------------

    C++のソースコードに二進数を書くテンプレートを自作

    
    ///////////////////////////////////////////////////////////////
    	
    //頭に0がついて8進数表記になったときに呼び出される
    //第一テンプレート引数:二進数に直したい数(8進数表記で渡された)
    //第二テンプレート引数:何桁シフトするか(演算に使用・呼び出し時は0)
    //第三テンプレート引数:何桁の二進数が入力されたか
    
    template <int N,int shift,int digit>
    struct ToDec8toBin{
    	enum {
    		Val = ( ToDec8toBin<N/8,shift+1,digit>::Val ) +  ( N % 2 << shift ), 
    	};
    };
    
    template <int N,int digit>
    struct ToDec8toBin<N,digit,digit>{
    	enum {
    		Val = 0,
    	};
    };
    
    /////////////////////////////////////////////////////////////
    //頭に0がつかず10進数表記になったときに呼び出される
    template <int N, int shift, int digit>
    struct ToDec10toBin{
    	enum {
    		Val = (ToDec10toBin<N / 10, shift + 1, digit>::Val) + (N % 2 << shift),
    	};
    };
    
    template <int N, int digit>
    struct ToDec10toBin<N, digit, digit>{
    	enum {
    		Val = 0,
    	};
    };
    
    
    
    /////////////////////////////////////////////////////////////
    //C++で二進数表記をするための関数・エントリポイント
    template <bool Cond,int N,int digit>
    struct ToDecCore;
    
    //頭に0がついて8進数になっているときはこちらを呼び出す
    template <int N, int digit>
    struct ToDecCore<true, N,digit>{
    	enum {	Val = ToDec8toBin<N,0,digit>::Val,};
    };
    
    //頭に0がついていないときは10進数からの変換を行う
    template <int N, int digit>
    struct ToDecCore<false, N,digit>{
    	enum {	Val = ToDec10toBin<N, 0, digit>::Val,};
    };
    
    
    //真のエントリポイント(4bit)
    template <int H>
    struct ToDecimal4{
    	enum { Val = ToDecCore < H <= 0111, H, 4>::Val, };
    };
    
    //真のエントリポイント(8bit)
    template <int HH,int HL>
    struct ToDecimal8{
    	enum {
    		Val = 
    		(ToDecCore < HH <= 0111, HH, 4>::Val << 4 )+ 
    		ToDecCore < HL <= 0111, HL, 4>::Val
    	};
    };
    
    //真のエントリポイント(16bit)
    //4ビットずつ区切って渡す
    template <int B4, int B3,int B2, int B1>
    struct ToDecimal16{
    	enum {
    		Val =
    		(ToDecCore < B4 <= 0111, B4, 4>::Val << 12) +
    		(ToDecCore < B3 <= 0111, B3, 4>::Val << 8) +
    		(ToDecCore < B2 <= 0111, B2, 4>::Val << 4) +
    		 ToDecCore < B1 <= 0111, B1, 4>::Val
    	};
    };
    
    
    
    ////////////////////////////////////////////////////////////
    
    
    ////////////////////////////////////////////////////////////
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	printf("1101 0010 0101 0011:%d\n", ToDecimal16<1101, 0010, 0101, 0011>::Val);
    	
    	getchar();
    	return 0;
    }
    
    

     

    探せばいくらでも出てきそうだが勉強のため自作。

    やってることはテンプレートを再帰してるだけ。

    ただし、C/C++は数値の頭がゼロだと8進数表記にするというヨクワカラナイ言語仕様を持っているため、1000以降と0111以前で処理を分岐している。「C++テンプレートテクニック」に書いてあったものを好みに改良した。

    多分、4桁ずつじゃなく8桁ずつ書いた方が使いやすいという人の方が多いのだろうが、個人的には4桁くらいで区切らないと読みにくい。

    Boostとか、Cのマクロとか、確か同じような処理をする機能が提供されていたと思う。

    ただ、Boostは一つのことをやりたいだけに導入するにはあまりにでかすぎる。

    ちゃんと名前空間で囲って、エントリポイントをさらにconstexprした関数でくくれば実用的になると思う。

    VC++にはconstexprないけど。というかconstexprtまで対応してるなら0b対応してそうだからこんなもの意味がなくなるわけだけど。

    Blender + LuxRenderで草を作りたくて色々(4)

    草を生やす続き。

    好きな場所に草を生やすことを考える。

     

    注意点として、一枚ポリゴンだと以下のペイント機能が使えない。

    そこでSubdivideして面数を増やす

    1. Edit Modeへ移行

    2. 3D View上にマウスがある状態でキーボードの[W]をおす

    3. 出てきたメニューから[Subdivide]を選択。

    subdivide

    4. Subdivideを何回か繰り返して升を十分細かくする

    subdividetimes

     

     

     

    Weight Paintモードへ移行

    toweightpaint

     

    ブラシで色をつけていく。

    青 = 生えない

    赤 = 最も多く生える

    weightpaintcolor

     

    前回までと同じようにParticleの設定をする。

    最後に、ParticleのVertex GroupsのDensityでGroupを選択

     vertex_groups

    レンダリング

    shiba1