nalgebra の Point や Vector を nannou の Point や Vector に変換する

nannou は cgmath というライブラリを使っていますが、 nalgebra の方が人気でドキュメントが多いのでそっちから入門するのが楽そうです。しかし、 nalgebra と cgmath は当然使ってる型が違うのでなんらかの変換が必要になります。どちらも内部的には array なので、それを取り出して型だけ変換すればいいみたいです。

Vectorの方は単純にこんな感じでいけました。

    let v_na = nalgebra::Vector3::new(1.0, 1.0, 1.0);
    let v_array: [f32; 3] = v_na.into();
    let v: nannou::geom::Vector3 = v_array.into();

一方で、Point も同じ感じでできるかとおもいきやこれはエラーになります。

    let p_na = nalgebra::Point3::new(1.0, 1.0, 1.0);
    let p_array: [f32; 3] = p_na.into();
    let p: nannou::geom::Point3 = p_array.into();

これはコード自動生成がうまくいってないせいらしいんですが、ちょっとissueを読んでもよくわかりませんでした。

なのでこんな感じで、原点からのベクトルに直すと変換できるようになります(が、もっといい方法あるんでしょうか...?)

    let p_na = nalgebra::Point3::new(1.0, 1.0, 1.0);
    let v_array: [f32; 3] = (p_na  - nalgebra::Point3::origin()).into();
    let v: nannou::geom::Vector3 = v_array.into();

Processingとnannouの違いについてのメモ(2)

Rectを頂点から定義する

前回書いたように、Rectは中心の座標と高さ、幅で定義できます。とはいえ、頂点の座標でやる方法もなんかあるのかな?と思っていたら、

let r = Rect::from_corners(pt1, pt2);

という感じで2つの頂点からつくることもできました。

あと、各頂点の座標を取るには、corners() とか corner_at_index() とかいうメソッドがあったので、ある四角形と隣接する四角形を描画するには、

// 左上が 0 でそこから時計回り
let pt1 = r1.corner_at_index(0);

// 四角形の辺の長さ
let w = 100.0;

let pt2 = pt1 + vec2(w, w);

let r2 = Rect::from_corners(pt1, pt2);

みたいな感じでも書けます。

キャンバスを回転縮小させる

Drawrotate()とかscale()みたいなメソッドが生えているので、

fn view(app: &App, model: &Model, frame: Frame) {
    let draw = app.draw().rotate(model.rotate).scale(model.scale);

    // ...snip...

    draw.to_frame(app, &frame).unwrap();
}

みたいな感じでやればいいみたいでした。ちなみに私はこの使い方を勘違いして、⇣で「動かない...」と悩んでいました(恥)

    let draw = app.draw();
    draw.rotate(model.rotate);
    draw.scale(model.scale);

Processingとnannouの違いについてのメモ(1)

タイトルに(1)とつけたものの次回があるかわからないけどとりあえずメモ。

(私はProcessingもnannoutも、軽くいじったことがある、くらいのレベルです。ここに書かれていることはあまりアテにしないでください)

続きを読む

chromoteパッケージでRからInstagramにggplot2を投稿する

The Economist誌がインスタにグラフを投稿する時に気をつけていること、という記事がちょっとバズってたので、

とツイートしたところ、なんかいいねがいっぱいついてしまい、できないと思ってたけど、「それ、Headless Chromeでできんじゃね?」というレスがついてしまったので、

後に引けなくなりやってみました。という話です。

たぶん実際にRStudioからInstagramに投稿したい人はそんなにいないと思うんですけど、chromoteの使い方について書いた記事を今のところ見かけたことがないので、 まあ誰かの役に立つこともあるかなと思って公開します。

(注:これが Instagram利用規約的に OK かどうか自信がないので、試すときはご自身の責任でお願いします。)

続きを読む

メモ:Manjaro Linux 19.0.0でVisual Studio Code extension for Arduino(vscode-arduino)を使う

これを使いたくて、別に難しくはなかったけどちょっと手間取ったのでメモ。

普通にArduino IDEを使う場合の手順は以下を参照。

続きを読む

メモ:Shinyで条件に応じてactionButtonのactionを変える

conflrで、「すでに同名のページがあったときだけ、上書きしていいかを確認するダイアログを出す」ということをしたかった。 軽く調べた感じ、actionButton()inputIdを動的に与えるのが簡単そうだった。

以下の例だと、confirmok という2つのイベントがあって、

  • ok だとそのまま stopApp() する
  • confirm だと showModal() でダイアログを出して、そこに okactionButton() が置かれている(ので結局 ok に行き着く)

という流れになっている。もっと簡単な方法ある気もしつつ、 inputId が文字列なのでいろいろ応用がありそう、と思ってとりあえずメモ。

続きを読む