ラグランジュの未定乗数法のわかりやすい考え方
ラグランジュ
f(x,y)
g(x,y)=0
勾配ベクトルはそれぞれ
A(∂f/∂x,∂f/∂y)
B(∂g/∂x,∂g/∂y)
点a,bのまわりの可動方向
C(∂g/∂y,∂g/∂x)
停留点はAとCが垂直に交わる<=>AとBが平行<=>A=λB
A=λBだけではgが全域なので、
上図のように、fとgの勾配が一致している部分(赤線)がxとyの関係式となってでてくる
ここでg=0条件を加えると
(黄線がg=0の可動域を表す)
fとgが定数倍の関係であるような場合を除いて、黄線と赤線は高々有限個の点で交わり、これが停留点となる
よって我々は次の式をとくことになる
g=0
A=λB
奇しくも、これは
H=f-λgについて
H∂/∂λ=0
H∂/∂x=0
H∂/∂y=0
を解くのと同じである
https://math-note.xyz/analysis/method-of-lagrange-multiplier/
JavaScript覚書
便利なon関数
onresize
canvas
contextとは
getContext() メソッド - Canvasリファレンス - HTML5.JP
drawImageの使い方
drawImage() メソッド - Canvasリファレンス - HTML5.JP
drawImage(image, dx, dy)
drawImage(image, dx, dy, dw, dh)
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
これら3つはそれぞれ、image 引数として HTMLImageElement, HTMLCanvasElement, HTMLVideoElement のいずれかを取ることができます。
2017やることりすと
やること*
UE4でゲーム作る<-アセットをいろいろおいてステージぽいものをつくる<-ブループリントをつかってアクションゲームのひな型を作る
Siv3dで今作ってるゲーム作る
web上でレイマーチングがguiでできるものを作る<-web上で複数人がアクセスしてリアルタイムに反映させるものを作る[
レイトレ
レイトレ合宿4!?
RasPiでファイルサーバ
[RaspberryPI]hamachiを使ってVPN環境を構築 – o24ブログ
electronの使い方を学ぶ
習慣*
作曲する
絵を描く
DLLの作り方
暗黙リンク
DLLは、vc++のプロジェクトのプロパティで設定できるライブラリディレクトリからは探されないので、DLLを使う実行ファイルのあるディレクトリにおくか、PATHを通さないといけない
https://msdn.microsoft.com/ja-jp/library/7d83bc18.aspx
暗黙リンクは、ビルド時に関数の中身のない.libファイルを実行ファイルに組み込み、実行時に.libに書いてある関数をDLLから探すという方法でDLLを使う。だから実行ファイルは使う関数のヘッダをインクルードしないといけないので、実行時に色んなDLLをとっかえひっかえ呼ぶということはできない(例えばDAWのプラグインDLLは暗黙リンクではない)
明示リンク
作り方は暗黙リンクと一緒で、DLLを使う側で書くことは下の記事にかいてあるように、
プラグイン・プログラミング(2)
GetProcAddress()で装飾名で関数を指定するので、
明示リンクは装飾名がわからないといけない。装飾名の調べ方を今から書く
エクスポートした関数の修飾名の取得 VC++
DLLファイルをつくったプロジェクトファイルでプロジェクト->プロパティ->リンカー->デバッグ->マップファイルの作成(Yes)
にする
出来たmapファイルの最後のほうに
Exports
ordinal name
1 ?.....
2 ?.....
って感じで修飾名がかいてる。例えば、MyParser という名前空間の boost::variant
?parse_impl@MyParser@@YA?AV?$variant@NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$recursive_wrapper@U?$binary_operator@$0A@@MyParser@@@boost@@V?$recursive_wrapper@U?$binary_operator@$00@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$01@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$02@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$03@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$04@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$05@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$06@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$07@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$08@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$09@MyParser@@@4@V?$recursive_wrapper@U?$binary_operator@$0L@@MyParser@@@4@V?$recursive_wrapper@Ufunction@MyParser@@@4@V?$recursive_wrapper@Uarrow@MyParser@@@4@V?$recursive_wrapper@Utuple@MyParser@@@4@Uvariable@MyParser@@Uvoid_@0detail@4@Uvoid_@0detail@4@@boost@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z (class boost::variant
,class std::allocator >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper >,class boost::recursive_wrapper ,class boost::recursive_wrapper ,class boost::recursive_wrapper ,struct MyParser::variable,struct boost::detail::variant::void_,struct boost::detail::variant::void_> __cdecl MyParser::parse_impl(class std::basic_string ,class std::allocator > const &))
赤い部分が修飾名。boost使った関数だからめっちゃ長いけど、ふつうはこんな長くならんだろ
後半の括弧にかこまれているのは実際の型の名前。
だからDLLを使う側でGetProcAddress(ハンドル,?parse_impl@MyParser@@...(くっそ長い文字列))
ってかいても、一応通るがめんどい。修飾名を短くしたい。
修飾名を短くするにはDEFファイルってのをつかって自分で設定する
プロジェクトに右クリックで新規ファイルを追加
検索窓に
def
っていれると
Module Definition File
って出るから加える
こんな風に書きました。
LIBRARY "DLLTest"
EXPORTS
parse_impl @1
これでビルドすると、mapファイルがちょっと変わって
...
?parse_impl@MyParser@@...(くっそ長い文字列)
exported name: parse_impl
って感じになる。
参考
ぼやきごと/2013-08-27/VC++:C++名前空間内の関数をDLLエクスポートして使う - ルーチェ's Homepage
この記事では呼び出し規約を_stdcallにしてるけど、特に変えなくてもできた。
正常に起動できませんでした
DLLのパスが通ってない
DLLを呼ぶプログラムと DLLのプログラムのランタイムライブラリの種類が違う
MTD,MT,MTD DLLなど
コードを書かずにQtデザイナでScrollAreaにVLayoutを適用させる
Qtデザイナでスクロールエリアにレイアウトを適用したい
スクロールエリアが空だとレイアウトのバーが暗く、適用できない。
なんか一個入れてあげると、設定できるようになる。(じゃあ最初から設定させてくれよ。やり方あるのかな?)
ScrollAreaのなかにQtデザイナの画面左側のオブジェクト群からGridLayoutを入れてしまうのは、余分なWidgetの入れ子ができてたぶんよろしくないし意図したとおりに動かねえ。
VLayoutを設定するとscrollAreaWidgetContentsの表示がそのレイアウトになる
このままだとプログラムから動的に要素を追加したときに変になるのでいろいろする
scrollAreaWidgetContentsを選択->LayoutのlayoutSpacingを変えてオブジェクト間のスペース調整する
動的に追加するオブジェクトは、追加するときにMinimumSizeを適切に設定する。そうしないとオブジェクトをたくさん追加していってスクロール範囲を超えそうになっても、ScrollAreaの中身のオブジェクトがつぶれるだけでScrollAreaは広くならない。よってWidgetを動的追加するときは、そのWidgetのMinimumサイズを設定し、Widgetがつぶれないようにする。
textsareaはScrollAreaの名前をQtDesigner上で変更したもの
ScrollAreaそのものはWidgetじゃなく、ScrollArea直下のWidget(二つ上の画像ではScrollAreaWidgetContents)がスクロールエリア内のWidgetをもつ。よって、
textsarea->widget()->layout()->addWidget()
のように書く。赤字を忘れないように
結果
child.uiの中身。
補足
ScrollArea内の要素を上詰めしたいときはVerticalSpacerを入れる。ScrollArea内の要素の追加や削除は、スペーサの手前に挿入、あるいはスペーサの手前のWidgetを削除というようにしなければならない。
削除の一例。ScrollAreaの末尾にスペーサを入れたので、ScrollAreaに最後に入れた要素を削除したいときはitemAtでスペーサの一個手前のオブジェクトを指定する。
void child::on_removebutton_clicked()
{
QVBoxLayout* layout = dynamic_cast<QVBoxLayout*>(this->ui->ScrollAreaContentWidget->widget()->layout());
if(layout->count()>=2){
//verticalspacerの手前に要素を入れなければならない。vlayoutの添え字は0から始まる。
QWidget* w = layout->itemAt(layout->count()-2)->widget();
delete w;
}
}