2013年10月6日日曜日

gnuplotのデータ点を白抜きにする

gnuplotでEPSにグラフを書き出す際, データ点を「輪郭+白の塗りつぶし」という書式にすることはできない (のではないかと思う). そこで, この記事ではpoint type 65辺りを使ってgnuplotでグラフを描画したあと, 出力されるepsを直接修正することで輪郭の中を白く塗りつぶしてみる.

gnuplotでは以下のような感じでグラフを描く. (GNUPLOT Version 4.6 patchlevel 3)

set term postscript eps enhanced color
set output 'out.eps'
plot ‘./data.txt’ u 1:2 w p pt 65 
unset output

出力されたepsをPowershellスクリプト:

で処理すると, pt 65, 66, … あたりの輪郭線だけのpoint typeで描画したデータ点が「輪郭+白の塗りつぶし」に変更できる.

※ちなみに,エラーバー付きのプロットでも大丈夫なはずです.

※上のスクリプトは, マイナス記号を(ハイフンでなく)正しく表示する修正も含んでいます.

2013年10月3日木曜日

DXライブラリをビルドしてみる

しばらく放置していたらEinさんのページが変わっていたのでリンク修正.開発環境も変わってたので更新してみた.

デスクトップにミクさんを出現させようということで, ちょっと調べてみる. ミクさんを出現させるだけなら既に沢山?やられているので, 自分でやることもないんだけれど...

PMD/PMXファイルを読みこめるライブラリはいろいろあるらしい.

  • VPVP wiki: MMD周辺ライブラリ
  • MMDD for .NET (←現在開発中らしいので期待!)
    さっきgit cloneしてテストプロジェクトで試してみたら, 物理演算ONにすると頂点がどこかへ行ってしまった.

3D Computer Graphicsなんて全然良くわからないので, とりあえずDXライブラリあたりから触って見ることにした.

が, まずライブラリをビルドすると, コンパイラにunresolved external symbol __iobと怒られてしまった. (覚えてないがlibpngあたりだった気がする)

in sources USE_MSVCRT=1 does fix the issue.

なんかlibcに依存してコンパイルされてるのが元凶らしい, ということで依存ライブラリもまとめてビルドします.

共通の設定とか

基本的にはVisual Studio 2012の既定値だけど, 全部x64向けにビルドしました
今回は音声関係の機能は使用しないので, その辺はDxCompileConfig.hで無視するように設定しました.

zlib

  1. ソースコードをダウンロード
  2. Win32スタティックライブラリの空のプロジェクトを作成
  3. DLしたソースコードのうち,ルートディレクトリにある.cと.hをプロジェクトに追加
  4. ビルドできるはず

libpng

  1. ソースコードをダウンロード
  2. Win32スタティックライブラリの空のプロジェクトを作成
  3. DLしたソースコードのうち,ルートディレクトリにある.cと.h(ただし,example.cを除く)をプロジェクトに追加
  4. scriptsフォルダにあるpnglibconf.h.prebuildpnglibconf.hにリネームしてプロジェクトに追加
  5. 先に作ったzlibのProjectDirにincludeのパスを通したらビルドできるはず

libjpeg

  1. ソースコードをダウンロード
  2. Win32スタティックライブラリの空のプロジェクトを作成
  3. jconfig.vcをjconfig.hにリネーム
  4. .c .h (Example.c, jmemdos.c, jmemmac.c 以外)をプロジェクトに追加
  5. ビルドできるはず

Bullet Physics

  1. ソースコードをダウンロード
  2. さっきまでの同じで,空のプロジェクト→ソースファイル追加でビルドはできるはず

Bullet Physicsはビルドはできるけど,そのままだとベクトルの代入操作のところでアクセス違反してしまう. アラインメントの問題だけど, btScalar.hに定義されている

#define BT_USE_SSE

をコメントアウトするとちゃんと動きました

DXライブラリ

これもソースファイル適当に空のプロジェクトにまとめて追加して, IncludeとLibraryのパス通します.

DxLib.hライブラリリンク定義のところを適当にコメントアウトしたり, Bullet Physicsはファイル名変わってるから直したりします. するとビルドが通るので, 使えるようになります.

なんか今回適当で誰の役に立つのか謎ですが, こんな感じでDXライブラリ使えるようになりました.

2011年11月6日日曜日

WPF Toolkit - Chart コントロール

もっとも基本的と思われる折れ線グラフの表示を,コードから行う方法です.

using System.Windows.Controls.DataVisualization.Charting;
using System.Windows.Media;
using System.Windows;

var chart = new Chart();

var points = new PointCollection();
points.Add(new Point(1, 2));
points.Add(new Point(2, 4));
points.Add(new Point(3, 3));

var xAxis = new LinearAxis() { Maximum = 10, Minimum = 0, Orientation = AxisOrientation.X };
var yAxis = new LinearAxis() { Maximum = 10, Minimum = 0, Orientation = AxisOrientation.Y };
chart.Axes.Add(xAxis);
chart.Axes.Add(yAxis);

var series = new LineSeries() { DependentValuePath = "Y", IndependentValuePath = "X", ItemsSource = points };
chart.Series.Add(series);

あとはchartのインスタンスをコントロールとして追加すれば,表示されるはずです.

参考:LineSeries chart : "No suitable axis is available for plotting the dependent value"の回答に依れば, Consuming Binary Encoded WCF 4.0 Service in Silverlight 3.0 Applications Silverlight 2 Toolkit Overviewが役立つそうです.

2011年9月8日木曜日

XML Schemaを使って,XMLをパースする

この記事ではGPX (GPS eXchange Format)ファイルを読み込む方法を記述します.

まずは,XML Schema GPX 1.1 Schema (gpx.xsd)を貰ってきます.

XML スキーマ定義 ツールを用いてXML Schemaからコードを生成します.

xsd gpx.xsd /classes /language:cs /namespace:Gpx

生成されたコード gpx.cs を任意のプロジェクトに組み込みます.以下のようにしてgpxファイルを読み込むことができます.

Gpx.gpxType gpx;
using (var file = new System.IO.FileStream("...\\test.gpx", System.IO.FileMode.Open))
{
    var xmls = new System.Xml.Serialization.XmlSerializer(typeof(Gpx.gpxType));
    gpx = (Gpx.gpxType)xmls.Deserialize(file);
    file.Close();
}

参考:The GPX Exchange FormatRecordings and Documents

2011年7月13日水曜日

dynamicとCOMとメモリ リーク

C#から(「CLR上から」と言った方が良いかもしれないが)COMインタフェースを用いる場合には細心の注意を払う必要がある.

今回発生した問題は,Microsoft Internet Controls(SHDocVw名前空間)およびMicrosoft HTML Object Library(mshtml名前空間)を用いてInternet Explorerと相互作用するソフトウェアを開発している際に発生したメモリ リークである.

リークの直接的原因は,dynamicを用いてCOMインタフェースを管理したことにあったようだ.

メモリリークを起こすコード

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
dynamic doc = ie.Document;
Marshal.ReleaseComObject(doc);
Marshal.ReleaseComObject(ie);

メモリリークを起こさない(と思われる)コード

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
mshtml.IHTMLDocument2 doc = ie.Document;
Marshal.ReleaseComObject(doc);
Marshal.ReleaseComObject(ie);

COMインタフェースのプロパティやメソッドの戻り値がdynamicだからと言って,dynamic(あるいはvar)を用いないように注意する必要がありそうだ.

参考:dynamic(C# によるプログラミング入門)ReleaseComObject(cbrumme's WebLog)

2011年6月20日月曜日

Team Foundation Server 2010の導入

Microsoft® Visual Studio® Team Foundation Server 2010をWindows 7上に試験導入してみた.(サーバーは1台で構成)

構成しても,ファイアウォールが邪魔して,導入したマシン以外からは接続できなかった.

ファイアウォールの受信規則:Team Foundation Server TFSWebSite:8080の適用先プロファイルがパブリックのみになっていたのが原因のようでした.プロファイルのプライベートにチェックを入れることで,無事他のマシンからも接続できるようになった.

参考:Team Foundation Server構築 (シングルサーバー配置) (4/5)

2011年5月1日日曜日

リボンUIを使用する

ハンズオン ラボ: Windows Ribbon ~ Win32 ネイティブ アプリケーションへのリボンの追加 ~を読んだ方が良い.

MSDNにサンプルSimpleRibbon Sampleがあります.Visual Studio 2010 C/C++での情報です.

  1. リボンUIを採用したアプリケーションを開発するためには,最新のWindows SDK(ここではWindows7.1SDKとします)をインストールする必要があります.(VS2010に同梱されているSDKではダメです.)
  2. Win32 プロジェクトを作成したら,プロジェクトのプロパティ ページの構成プロパティ全般プラットフォーム ツールセットを「Windows7.1SDK」に変更します.
  3. リボンのデザイン等を定義するXMLファイル(ここではRibbon.xml)をプロジェクトに追加します.追加したXMLファイルのプロパティ ページで項目の種類を「カスタム ビルド ツール」に変更し,カスタム ビルド ツールのプロパティを設定します.
    コマンド ラインuicc.exe Ribbon.xml $(IntDir)Ribbon.bml /header:$(IntDir)RibbonUI.h /res:$(IntDir)RibbonUI.rc /name:Ribbon
    説明(この説明はビルド時に出力されるようだ)
    出力ファイルRibbon.bml;RibbonUI.rc;RibbonUI.h
  4. プロジェクト内のリソースファイルに#include "RibbonUI.rc"の一行を追加して,ビルド時に生成されるリソースファイルを埋め込むよう設定します.このとき,プロジェクトのプロパティ ページの構成プロパティリソース追加のインクルード ディレクトリ$(IntDir)(RibbonUI.rcの生成されるディレクトリ)を追加します.
  5. SimpleRibbon Sampleのようなマニフェストファイルを作成します.