![]() |
|
Spaces home ※ 画面は開発中のものですPhotosProfileFriends | ![]() |
|
September 23 レーシック手術日の朝は7:30に起床することにしていたが、早めに目覚めた。
が、全く寝られないほどではない、その程度の緊張感だった。
ギリギリまで 「やめとけ、レーシック」みたいなページばかり見ていた。
当日キャンセルは原則無理と書いてあった。
最初の部屋 終わると、目の前が白くなったが、全く見えないわけではない。 2番目の部屋 またレーザーを照射される。 「終わりです」と言われて立ち上がり、回復室に連れて行かれる。 回復室 最後のチェック・解散 帰りの状況 これから すべきか August 15 レーシックの事前検査手術が可能かどうか調べにいってきた。(ここまでは無料)
結論は、可能。 ただ、消耗品であるらしい角膜の厚さが1回分+a しかないため、
極わずかな確率での失敗時に再手術ができないかもしれないとのこと。 視力1.0獲得率は98%で、だいたい0.6くらいあればいいと思っているので成功率は 98%+少し。 この確率は、信頼すべきものだと思うが、勇気は要る
眼鏡屋でフレームを選ぶためにも。(まだかけるつもり) 高い特殊レンズ代を省略して安く買うためにも。 成功すればプールサイドで躓かない。
成功すれば免許も裸眼で取れる。 視野が広がる(最近のメガネはレンズ小さいから。)
シャンプーとリンスを間違えない。
メガネをなくしても匍匐前進は不要。
悲惨な事故(踏み潰されたり)で大事なメガネを失わずに済む。 裸眼時の目は3でもεでもない。 夢のような生活に戻れるらしい、18万くらい & 98+a% で。
今は昔、最初メガネをかけるときは、 それまでの数週間、寝る前にミドリンとかいう目薬を点眼したりしてメガネにならぬよう粘った。 結局、周りの人より早くメガネをかけ、「メガネくん」とお決まりの名前をもらいながら、 「どうしようもないのか」と、しばらくは我慢の日々だった。 それが今日はなんという技術の進歩だ。このまま行けば不老不死も夢じゃないかと思えるほどだ。 でもやはり少し怖いとは思う。 検査は結構長かった。 帰りは目薬の効果でまぶしい。夕日がまぶしくてお化けになったかと思った。 さて、残るは最後の決断である。 August 06 Nicovolume 0.2521. ちょっとした機能追加をしてみた。 時間が来ると、下のような画面が表示され、スライダーが左右に動きます。 2. IE の自動起動が不要な場合のため、インストーラで ブラウザ拡張の有無を選択できるようにしました。 3. Vista 環境で、 互換モード を使用する必要がなくなりました。 * 古いバージョンを消してから新しいバージョンをインストールする必要があります。
Nicovolume の記事
Vista でのマスタボリュームコントロール についての 参考文献 http://msdn.microsoft.com/en-us/library/ms679161(VS.85).aspx August 01 フーリエ級数フーリエ何とかというものがさっぱりわからないので、教科書に書いてある次のような数式をもとに計算させてみた。 周期Tの周期関数 f(t) が下のように展開される。 OnPaint に直接適当にコードを書く。
public int n;
public double func(double d) {
return ((int)Math.Abs(d) % 50 < 25) ? 0 : 50;
}
public double func_a(double d) {
return func(d) * Math.Cos(n * 2 * Math.PI / 50 * d);
}
public double func_b(double d)
{
return func(d) * Math.Sin(n * 2 * Math.PI / 50 * d);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
int x;
double y = 0;
Point prev = new Point(0, 0);
for (x = 0; x < 300; x++) {
double a0 = 1.0 / 50.0 * mymath.simpson(-25, 25, 0.001, func);
y = a0;
for (n = 0; n < 10; n++) {
double an = 2.0 / 50.0 * mymath.simpson(-25, 25, 0.01, func_a);
double bn = 2.0 / 50.0 * mymath.simpson(-25, 25, 0.01, func_b);
y += an * Math.Cos(n * 2 * Math.PI / 50 * x);
y += bn * Math.Sin(n * 2 * Math.PI / 50 * x);
}
e.Graphics.DrawLine(Pens.Black, new Point(x, 200 - (int)y), prev);
prev = new Point(x, 200 - (int)y);
}
}
* simpson関数はこちら すると、こんな感じに表示された。 ループすればするほど元の四角いグラフに近づいている。 シンプソンの公式シンプソンの公式のプログラムを汎用的にしておく。 シンプソンの公式は、関数を二次曲線で近似させて積分する方法。 関数f の、st~ed の間を、刻み幅h以内で積分する。
//シンプソンの公式で積分する
public delegate double simpsonFunc(double d);
static public double simpson(double st, double ed, double h, simpsonFunc f){
//刻み数を決める
int nh = (int)(Math.Abs((ed - st) / h) + 1.0);
if (nh % 2 != 0) nh++;
h = (ed - st) / (nh-1);
int cnt;
double total = 0;
for (cnt = 0; cnt < nh; cnt++ )
{
double tmpadd = f(h * cnt);
if (cnt == nh - 1)
{ //最後:そのまま
}
else if (cnt == 0)
{ //最初:そのまま
}
else if (cnt % 2 != 0)
{ //奇数
tmpadd *= 4;
}
else
{ //偶数
tmpadd *= 2;
}
total += tmpadd;
}
return h / 3.0 * total;
}
この前のシンプソンの公式 July 11 HSP でモンテカルロ提出用ではない。 乱数をきちんと発生させているつもりなのに、十字の模様がうっすらと見えてしまう。
//モンテカルロ //使用変数(円) //グラフ randomize ; 乱数初期化 //メインウィンドウ初期化 pos 120, 0 : chkbox "過程描画", visible_chk pos 0, 55 : mes "ドット数" //数式を読む objsize 200, 45 //軸の描画 pos vx-20, vy+r : mes "0" pos vx-20, vy+r*2 : mes "-1" pos vx+r-9, vy+r*2+6 : mes "0" //グラフ軸の描画 color 255, 255, 255 pos 30, graph_y July 09 C# でベジエ曲線(4)ベジエ曲線が四角形の中にあるのか、無いのかを知るには、どうすればよいのだろうか。
1の判別: 2の判別: 3の判別: ニュートン法という方法で 解が求められるというので、実装してみたのだが、どんなケースでも解が求まるわけではないらしい。 難しそうなのでスルーしていた bezier clipping に手を出してみる。 こちらのページとにらめっこして理解を試みる。 Bezier Clipping は、最近のアルゴリズムらしい。 この式の各項 の f i が制御点 i の値になる。 各項での t は、 1 を 項数で均等に割ったものらしい。 この式に対して、次のように処理する。参考にしたのはこちらのページ
自分の場合、切り取った曲線の t の変域は 0 <= t <= 1 だったので、 再帰した処理が戻ってくるとき、(max – min)倍に縮めて最小値を加算する処理を付け加えた。 //このオブジェクトをベジエクリッピングする
public float[] bezierclipping() {
//Pointf にする t は項数で均等に分けたもの
PointF[] pts = new PointF[points.Length];
PointF[] convex;
for (int i = 0; i < points.Length; i++) {
pts[i].X = (1.0f / (points.Length-1)) * i;
pts[i].Y = points[i];
}
//凸包を得る
convex = mymath.convex_hull(pts);
//凸包のうち、ゼロを通る辺を最小・最大値とする
float min = float.MinValue, max = float.MaxValue;
for (int i = 0; i < convex.Length; i++)
{
int j = (i + 1) % convex.Length;
if (convex[i].Y * convex[j].Y < 0)
{
if (min == float.MinValue)
{
min = (convex[i].X * (float)Math.Abs(convex[j].Y)
+ convex[j].X * (float)Math.Abs(convex[i].Y))
/ ((float)Math.Abs(convex[i].Y) + (float)Math.Abs(convex[j].Y));
}
else if (max == float.MaxValue)
{
max = (convex[i].X * (float)Math.Abs(convex[j].Y)
+ convex[j].X * (float)Math.Abs(convex[i].Y))
/ ((float)Math.Abs(convex[i].Y) + (float)Math.Abs(convex[j].Y));
break;
}
}
else if (convex[i].Y == 0) {
if (min == float.MinValue) min = convex[i].X;
else if (max == float.MaxValue) { max = convex[i].X; break; }
}
}
if (min == float.MinValue || max == float.MaxValue)
return new float[] { };
if(min > max){
float tmp;
tmp = min; min = max; max = tmp;
}
if (max - min < (float)Math.Abs(pts[pts.Length - 1].X - pts[0].X) * 0.5f)
{
//0.5以下に小さくなるのならば、解はひとつ
if (max - min < 0.0001) //収束判別
{
return new float[] { (max - min) / 2 };
}
//もう一度縮めたい
float[] tmp = cut(min, max).bezierclipping();
for (int cnt = 0; cnt < tmp.Length; cnt++) {
tmp[cnt] *= (max - min)/1;
tmp[cnt] += min;
}
return tmp;
}
else
{
//0.5以上ならば解が複数ある
bezierfunc[] cut_half = cut(0.5f);
float[] a, b, c;
a = cut_half[0].bezierclipping();
b = cut_half[1].bezierclipping();
c = new float[a.Length + b.Length];
for (int i = 0; i < c.Length; i++) {
c[i] = (i < a.Length) ? a[i]/2 : (b[i - a.Length]/2 + 0.5f);
}
return c;
}
}July 04 C# でベジエ曲線(3)計算が複雑になってきてきた。そこで、多項式の計算をクラスにしてみた。 カーブ半径を取得したい。 したがって、曲率を求めたい。が、 検索して調べていると (x’y’’ – x’’y’ ) / √{({x’}^2 + {y’}^2)^3} こんな式を見つけたのでそのまま計算して逆数にすると、正しいらしい結果が出てきた。
カーブ半径に合わせて円を描いてみた。
public float curvature( float t) {
float tmp1 = -f_tangental_x.differentiate().GetValue(t) * f_tangental_y.GetValue(t) +
f_tangental_y.differentiate().GetValue(t) * f_tangental_x.GetValue(t);
float tmp2 = (float)Math.Sqrt((double)powFI((powFI(f_tangental_x.GetValue(t), 2)
+ powFI(f_tangental_y.GetValue(t), 2)), 3));
if (tmp2 == 0) return 0;
return (tmp1 / tmp2);
}differentiate は多項式クラスで微分をするメソッドで、 (x^a)’ = ax^(a-1) をすべての項に対して行う。 //微分する
public polynomial differentiate() {
polynomial result = new polynomial();
foreach (KeyValuePair<float, float> kpy in this.values)
{
if (kpy.Key != 0)
result.values[kpy.Key - 1.0f] = kpy.Key * kpy.Value;
}
return result;
}多項式クラスでは、各項を、キーを指数、値を係数とするリストに保存している。
正確さや速度に問題が出てくるかもしれないが、機能としてはこれくらいかと思う。 July 01 夏が近づく / C#ビワを食べた。 トカゲを見た。 トカゲと呼んでいるがこれはカナヘビのような気がする。 C# の機能を一通り勉強。 しかし ・・・ 情報が古い。
June 29 C# でベジエ曲線(2)無事、ベジエ曲線とその並行曲線がかけたのが前回まで。 曲線の式が分かることで、列車を滑らかにカーブさせることができそうだが、 だから、 適当な距離 l において、パラメータ t はいくつなのか調べないといけない。 そこで、高校の数学教科書の最後のほうのページに、「曲線の長さ」という項目があったことを思い出し、開いてみた。 (b~a の定積分)∫√[ { f’(t) }^2 + { g’(t) }^2 ] dt 次数の高い多項式がルートの中に入ったものを積分するのは非常に難しそう。 -------------- 積分のアルゴリズムには、台形公式とシンプソンの公式と、ほかに各点の重みや積分区間を不等間隔にする何とかという公式があるらしい。 あるグラフを区間ごとに区切って面積を計算する時、その区間のグラフが曲線でないこととして計算すれば、台形公式になる。 それでは誤差が大きくなってしまうので、 区間上の3点を通る2次曲線の積分として考えれば、少しは誤差は小さくなる。これがシンプソンの公式である。 他にもいい方法があると本には書いてあるが、難しくなると面倒だし、ピクセル単位であっていればいいのでシンプソン法で計算してみることにした。 ------------ とりあえず、 曲線の パラメータ t での長さ l が何ピクセルなのかを知りたい。 計算のやり方は教科書のまる写しでなんとかする。 これを簡単にするとこんな感じ。 ちなみに、区間は偶数個に区切らなければならないらしい。
//パラメータ t を 開始点からの距離 l に変換する h は積分刻み幅
//シンプソンの公式を用いた
static public float t2l(float t, PointF[] pt, float h)
{
float tcnt, prev =0.0f, tmplen, tmpadd, total = 0.0f;
int i;
for (tcnt = 0.0f, i = 0; tcnt <= t; i++, tcnt += h) {
tmplen = length(bezier.tangental_func(pt, tcnt));
if (tcnt + h > t)
{ //最後
if (i % 2 == 1)
{ //奇数個で終わる
tmpadd = (prev + tmplen * 4 + length(bezier.tangental_func(pt, tcnt + h))) / 2;
}
else
{ //偶数個で終わる
tmpadd = tmplen;
}
}
else if (tcnt < h)
{ //最初:そのまま
tmpadd = tmplen;
}
else if (i % 2 != 0)
{ //奇数
tmpadd = tmplen * 4;
}
else
{ //偶数
tmpadd = tmplen * 2;
}
total += tmpadd;
prev = tmplen;
}
return h/3.0f * total;
}積分刻み幅を任意に定められることにしたかったので、項数が奇数になってしまった場合、区間を超えて計算し、超えた区間を2で割るようにしてみた。 そして、その逆変換
//開始点からの距離 l を パラメータ t に変換する h は積分刻み幅
//シンプソンの公式
static public float l2t(float l, PointF[] pt, float h)
{
float tcnt, prev =0.0f, tmplen, tmpadd, total = 0.0f, lcnt, endlen = 0.0f;
int i;
for (tcnt = 0.0f, i = 0; tcnt <= 1.0f && endlen < l; i++, tcnt += h) {
tmplen = length(bezier.tangental_func(pt, tcnt));
//ここで終了した場合の長さ
if (i % 2 == 1)
{ //奇数個で終わる
endlen = (total + (prev + tmplen * 4 + length(bezier.tangental_func(pt, tcnt + h))) / 2)
* (h / 3.0f);
}
else
{ //偶数個で終わる
endlen = (total + tmplen)
* (h / 3.0f);
}
//加算処理
if (tcnt < h)
{ //最初
tmpadd = tmplen;
}
else if (i % 2 != 0)
{ //奇数
tmpadd = tmplen * 4;
}
else
{ //偶数
tmpadd = tmplen * 2;
}
total += tmpadd;
prev = tmplen;
}
return tcnt - h/2.0f;
}距離から t を求める場合、ループするたびにその地点での距離を知りたいので、そのつど終了した場合の距離を計算し、終了判断しなければならない。 あと、戻り値は必ず 本来の値以上になることから、 刻み幅の半分を引いてみた。 t = 0.5 の位置を距離に変換し、戻してみた。
それより、コードがなんか汚い。 言い訳としては、ご丁寧に中かっこをエディタが改行してくれるということ。 C# でベジエ曲線C# を始めた。 C++はC++で深い。 Windows の深いところまで勉強するには C++ が必須。 ----------------- C# で作りたいものは、ちょっとしたゲームのようなもの。 ただ、単純にベジエ曲線を 便利なライブラリにおそらく入っているであろう DrawBezier などという関数でビーッと引くだけではすまないであろう。その線に沿って、列車が動かなければならない。 となると、数式でその座標を表さなければならない。 ---------------- 調べてみると、 (n i) という部分をベクトルかと思ってずっと考えていたらこれは nCi (組み合わせ)ということが判明。
とりあえず線の式はわかった。 static public PointF curve(PointF[] pt, float t) {
PointF total = new PointF(0.0f, 0.0f);
int n = pt.Length - 1;
int i;
for (i = 0; i < pt.Length; i++) {
total.X += pt[i].X * mCn(n, i) * (float)Math.Pow((double)t, i) * (float)Math.Pow(1.0 - t, (double)n - i);
total.Y += pt[i].Y * mCn(n, i) * (float)Math.Pow((double)t, i) * (float)Math.Pow(1.0 - t, (double)n - i);
}
return total;
}でも1本だけでは足りない。平行にもう1本ほしい。レールだから。 曲線の接線に対して直角に、一定距離進んだところをつないで線にすれば平行になりそう。 //ベジエ曲線の、接線を表す関数
public static SizeF tangental_func(PointF[] pt, float t)
{
PointF total = new PointF(0.0f, 0.0f);
int i;
int n = pt.Length - 1;
for (i = 0; i < pt.Length; i++)
{
float d1 = (i == 0) ? 0.0f : (float)i * powFI(t, i - 1);
float d2 = (n - i == 0) ? 0.0f : (float)(n - i) * powFI(1.0f - t, n - i - 1) * (-1);
total.X += pt[i].X * mCn(n, i) *
(
d1 * powFI(1.0f - t, n - i) + powFI(t, i) * d2
);
total.Y += (pt[i].Y * mCn(n, i) *
(
d1 * powFI(1.0f - t, n - i) + powFI(t, i) * d2
));
}
return new SizeF(total.X, total.Y);
}* powFI は float 型をキャストせずに べき乗できるようにした単純な関数。 となり、(x / √(x^2 + y^2) , y / √(x^2 + y^2) ) が長さ1ピクセル分のベクトルになる。 この値に必要な長さをかけて使えばよい。 ---------- 接線を直角に曲げて、一定距離の地点を線でつないで行けば平行な線が引けそうである。 はい、完成。 ところで、 bezier 曲線は、 ベジエと発音するのがどちらかというと原語に近いとのこと。 June 17 Visual studio コマンドウィンドウ先生は 「統合開発環境を使えば簡単ですが、 何かと応用が利かなくなったりするのでコマンドも覚えましょう。」 といいます。
今日、 Visual Studio の画面上に 「コマンドウィンドウ」 を発見したので、適当に dir と打ち込んで見たところ、
"コマンド "dir" は有効ではありません。"
との反応。
調べてみたところ、こんなコマンドを入力するらしいです。
Visual Studio コマンドの定義済みのエイリアス
ショートカットキーで十分そうなコマンドが多いですが、
使いそうなものをメモ。
エイリアスの作成方法 June 04 simutrans200806Simutrans 、フリーのシミュレーションゲーム。 車両自体、小さくて識別しにくいが、アドオンが多く公開されている。 下図 : 中央の駅で通過待ちをしている。
常磐線の中距離電車は10両編成が多い。 May 28 NicovolumeNicovolume は、あらかじめ指定した時刻に、マスターボリュームを自動的に調整するソフトウェアです。
特定のURL を Internet Explorer で閲覧していた場合 自動的に起動するので、起動し忘れることがありません。
特に、時報を聞いたり聞かなかったりするのに便利だと思います。
個人的な使用感(必ずしも得られるわけではありません。)
ありがたいことに紹介されました。 ---------- * Vista でもそのまま使えるようになりました。
-------------
バージョン 0.25
[対応OS]
Vista : インストールディレクトリ\nicovolume.exe を互換モード(XP sp2) に変更する必要があります
XP : そのまま動きます。
[対応ブラウザ]
IE7
IE6
May 27 携帯電話不要?小中学生に携帯電話持たせないで…教育再生懇が第1次報告(Yahooから) 政府の教育再生懇談会(座長・安西祐一郎慶応義塾長)は26日夕、首相官邸で会合を開き、第1次報告を福田首相に提出した。 持たなければいいという考えになぜ行き着くのかと疑問に思う。 いずれは自分の身は自分で守らねばならない時が来るわけで、それを先延ばしにしても何の解決にもならない。
など、いろいろ思うことはあるのですが、
"携帯電話会社に対して通話やGPS(全地球測位システム)機能に限定した機種"
これについて、
自分なら、頻繁に家に置き忘れると思う。
電話しかできない上に監視までされるという非常につまらない端末、忘れてもきっと気づかない。 臭いものにふたをして、監視だけしようとしても、そううまくはいかないのではないかと思う。
楽しいものだからちゃんと持っていてくれるわけで、
携帯会社には安全で楽しい携帯を作ってもらいたい。
May 15 アクエリアスゼロ今日は体調がよく、途中で死にそうになることなくゆっくりと走りきることが出来た。
帰ってからアクエリアス ゼロという新製品を飲んでみた。
感想は、
普通のアクエリアスとは別の味と考えてよい。 製品サイト ちゃんとしたサイトのレビュー
「見た目はまるで水、カロリーゼロの「アクエリアス・ゼロ」試飲レビュー」(GIGAZINE)
May 07 ゴランノス・ポンサー株式会社勝手にググって笑ってる。 ゴランノスポンサー ついでに小売店 「字幕スーパー」 この世界はゴランノスに 支配されているといっても過言ではないかも。 株式会社 提供 株式会社 提供 は、日本における民間放送のほぼ全ての番組で社名表示を行っている。その際、音声で「ゴランノス・ポンサーの提供」という表現がなされ、提供が ゴランノス・ポンサーグループに属していることを強調する形となっている。 提供のロゴは必ず、画面の最も上に、全てのページで表示される。 |