最近学校の方で研究用の新システム作りを行っています。しかし、今まではJavaで書いていたのをフルスクラッチでC#で書き直しているのですが、JavaよりもC#の方が便利な関数が多くていいね。今日は、矢印を書けるようにしたいなー、と思って矢印を書けるようなWPFのプロパティを探していたのだけれども、どうもないみたいなので、微妙に自作しようと思ったら案外時間がかかった。
ちなみに、C#4.0+WPFで記述しているのでそのままではVS2008以降を持っていないと役に立たないかも?
thisはCanvasのサブクラスを指します。
コード
public void Arrow()
{
Path p = new Path();
p.Stroke = Brushes.LightSteelBlue;//線の色
p.StrokeThickness = 2;//線の太さ
LineGeometry l1 = new LineGeometry();//メインの線
LineGeometry l2 = new LineGeometry();
LineGeometry l3 = new LineGeometry();
l1.StartPoint = new Point(10, 10);//始点を適当に設定(実際には引数で渡す)
l1.EndPoint = new Point(-210, -210);//終点を適当に設定
double length = Math.Sqrt(Math.Pow(l1.EndPoint.X-l1.StartPoint.X,2)+Math.Pow(l1.EndPoint.Y-l1.EndPoint.Y,2));
l2.StartPoint = l1.EndPoint;
l3.StartPoint = l1.EndPoint;
double sita = Math.Atan2(l1.EndPoint.Y-l1.StartPoint.Y,l1.EndPoint.X-l1.StartPoint.X);
l2.EndPoint = new Point(l1.EndPoint.X - length / 10.0 * Math.Cos(sita + Math.PI / 4), l1.EndPoint.Y - length / 10.0 * Math.Sin(sita + Math.PI / 4));//Math.PI/4は線の角度を45度にするということ。
l3.EndPoint = new Point(l1.EndPoint.X - length / 10.0 * Math.Cos(sita - Math.PI / 4), l1.EndPoint.Y - length / 10.0 * Math.Sin(sita - Math.PI / 4));
GeometryGroup g = new GeometryGroup();
g.Children.Add(l1);
g.Children.Add(l2);
g.Children.Add(l3);
p.Data = g;
this.Children.Add(p); }
.... \
------------>
. ... /
↑ここの座標ってどうやって求めればいいんだという話。
ちょっと考えれば簡単だったのに・・・
こういうGeometry系の計算は何度やっても苦手だ・・・。数学をもっと勉強するべきだったなぁ。
YU 2010年06月15日(火)23時16分 編集・削除
てっきり弾幕でも作ってたと思ったら研究だったとは……恐るべし因果応報