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);
みたいな感じでも書けます。
キャンバスを回転縮小させる
Draw
にrotate()
とか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誌がインスタにグラフを投稿する時に気をつけていること、という記事がちょっとバズってたので、
This made me think about how I can post charts to Instagram from RStudio...🤔 https://t.co/vXM7TYWfr5
— Hiroaki Yutani (@yutannihilat_en) February 25, 2020
とツイートしたところ、なんかいいねがいっぱいついてしまい、できないと思ってたけど、「それ、Headless Chromeでできんじゃね?」というレスがついてしまったので、
I sense this might be possible through headless chrome 🤔
— Colin Fay 🤘 (@_ColinFay) February 25, 2020
Maybe @RLesur and @chrisderv have an idea?
後に引けなくなりやってみました。という話です。
たぶん実際にRStudioからInstagramに投稿したい人はそんなにいないと思うんですけど、chromoteの使い方について書いた記事を今のところ見かけたことがないので、 まあ誰かの役に立つこともあるかなと思って公開します。
(注:これが Instagram の利用規約的に OK かどうか自信がないので、試すときはご自身の責任でお願いします。)
続きを読むメモ:Shinyで条件に応じてactionButtonのactionを変える
conflrで、「すでに同名のページがあったときだけ、上書きしていいかを確認するダイアログを出す」ということをしたかった。
軽く調べた感じ、actionButton()
のinputId
を動的に与えるのが簡単そうだった。
以下の例だと、confirm
と ok
という2つのイベントがあって、
ok
だとそのままstopApp()
するconfirm
だとshowModal()
でダイアログを出して、そこにok
のactionButton()
が置かれている(ので結局ok
に行き着く)
という流れになっている。もっと簡単な方法ある気もしつつ、 inputId
が文字列なのでいろいろ応用がありそう、と思ってとりあえずメモ。