質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

2回答

8100閲覧

C#。円弧の傾き・回転方法

fender0131

総合スコア121

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

1クリップ

投稿2015/10/08 06:54

編集2015/10/08 09:12

VisualStdio2013 C# windowsフォームアプリケーションでプログラムを組んでいます

円弧を描画する際、

public void DrawArc(
Pen pen,
float x,
float y,
float width,
float height,
float startAngle,
float sweepAngle
)

を使用することで描けると思うのですが、

円弧を傾けた状態(回転した状態)で描画するにはどうすればよろしいでしょうか?

以下にイメージを貼らせて頂きます。

通常時円弧(赤線)を求める際は、

円弧 = e.Graphics.DrawArc(Pen, x, y, a, b, 0, 90);

45度回転させた際、円弧はどのように求めることができるでしょうか?

ご指導ご鞭撻の程よろしくお願い致します。

イメージ説明

※ 追記1

円の求める際、上図は長方形ごと回転させてポイントを取っています。
下の図は長方形を回転させずにポイントを取っています。
今回の場合ですと、下図でポイントを取り、計算するということでよろしいでしょうか?

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

イメージとしては、下図のようにある点での回転移動をしたいのかと思っています。
イメージ説明

2次元空間の回転は図中の式を使うと良いかと思います。
ただ、この式は原点を中心とした時のものになりますので、任意点における回転移動だと式の前後でオフセットが必要になります。

図は簡易的に円弧を円にしていますが、以下の流れで計算する事になると思います。
(1)円の中心でθ度回転した座標を求める
(2)円に外接する矩形の左上の座標を求める
(3)rectを(2)の座標と幅、高さから決定
→回転しても円弧描画で指定する矩形はそれぞれの辺が軸に並行である(傾いたものでない)ため
(4)円弧の開始角と終了角をθでオフセット


** 追記 2015/10/08 19: 56頃 **

画像が作れたので追記します。

白線の交点を回転中心として、順に30度、60度、90度と回転移動をさせた物です。
矩形と円、円弧を描いていますが、「線」で描画しているのが目的の回転移動です。
これらは、円と円弧についてはその中心を使って回転移動をしています。
矩形は、各頂点にいてそれぞれの座標で回転移動を行っています。

それに対して塗り潰しの矩形ですが、これは矩形の角(緑で表示)を使って回転移動した後、矩形の幅と高さをそのまま適用して描いた物です。
この「線による矩形」と「塗り潰しによる矩形」でずれが出てくるのが、回転移動の計算を行う時に円(円弧)の中心を使わないといけない理由になります。

式は、コメント中の内容で基本的には大丈夫です(回転角θの符号は逆になるかも・・・)

イメージ説明
イメージ説明
イメージ説明

投稿2015/10/08 07:35

編集2015/10/08 10:57
sgr-2

総合スコア294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2015/10/08 07:37

位置を含めた全体の話だったんですね。よくよく質問文の画像を見てみると確かにそのとおりでした。
fender0131

2015/10/08 08:16

皆様ご回答ありがとうございます。 pictureboxにDrawArcで書き込んでいます。 左下を原点としているため、円に外接する矩形の左下の座標を求めました。 45度回転させたとして、以下の式であっていますでしょうか? float kaiten = 45; e.Graphics.DrawArc(Pen, x', y', a, b, kaiten, kaiten + 90); 自分のプログラムが間違っているせいか、思い通り円弧を書くことができませんでした。
sgr-2

2015/10/08 08:44 編集

うまくいかないですか。。 このような回転移動をさせる時は、円弧の中心の座標値を使うのが大事になると思います。 矩形の角を使って回転移動をすると目的の位置からずれてしまう筈です。 ちょっと冗長な書き方かも知れませんが、以下のような感じです 回転移動の中心を(X0,Y0)、円弧の中心を(Xa,Ya)とした時 回転移動後の円弧の中心(Xa',Ya')は rad = 3.14 / 180 Xa' = (Xa - X0) *cos(angle * rad) - (Ya - Y0) * sin(angle * rad) + X0 Ya' = (Xa - X0) * sin(angle * rad) + (Ya - Y0) * cos(angle * rad) + Y0 さらに、矩形の辺の長さをwidthとすれば、 矩形の角(X1, Y1)の座標は ※矩形が(X1,Y1)-(X2, Y2)の時、X1<X2 かつ Y1<Y2 X1 = Xa' - width / 2 Y1 = Ya' - width / 2 円弧の中心から回転移動の計算しても目的の位置に書けないでしょうか?
fender0131

2015/10/08 09:17

お答えありがとうございます。 本文に追記させて頂きました。 sgr-2様が添付して頂いた図を見ると、長方形が回転していないことに気が付きました。 今回の場合ですと、円弧を書くのに必要な長方形は回転させずにポイントを取る必要があるということでしょうか? sgr-2様が書いて下さったプログラムとほぼ同じなので、座標を求めるプログラムは問題なさそうでした。書いて下さったことで確認することができました。ありがとうございます。
sgr-2

2015/10/08 09:30

DrawArcに渡す値は、矩形の角(1つの頂点?)と幅、高さだと思います。 幅と高さを与えている事からも、外接する矩形がX軸、Y軸に並行である事を前提していると言えます。 矩形を素直に回転移動してしまうと、傾けた角度分だけX軸、Y軸に対して傾きを持ってしまうので、DrawArcの渡すパラメータとしてそのまま利用できなくなってしまいます。 ちょっと言葉で表現しにくいのが辛い所なのですが・・・ 絵か何か考えて見ます。少し時間を貰っても大丈夫ですか?
fender0131

2015/10/08 09:40

お答えありがとうございます。 あともう少しといったところまでは来てるのですが・・・ 傾けてしまうとダメだということはわかりました。 もしかしたら、プログラムの中で傾けてしまっているかもしれないので見直してきます。 お手数おかけして申し訳ございませんが、 もう少しお付き合い願いますでしょうか。
sgr-2

2015/10/08 11:27

すいません。。良いやり方がありました。 回転角をangle[単位:度]、回転中心の座標を(X0, Y0)とした時、以下のように書くと実現できると思います。 //回転移動前 g.DrawArc(pen, x, y, w, h, a, b); // 移動前を描画しない場合は、この行は不要 // 座標変換 g.TranslateTransform(-X0, -Y0); // オフセット g.RotateTransform(angle); // 原点中心でangleだけ回転 g.TranslateTransform(X0, Y0); // オフセットを戻す // 回転移動後 g.DrawArc(pen, x, y, w, h, a, b); // 移動前と同じ事を書く
fender0131

2015/10/09 06:05

お返事大変遅くなり申し訳ございませんでした。 無事に思い通りの結果を出力することができました。 図面・プログラムと参考になる資料を提示して頂きありがとうございました。 最終的には、.TranslateTransformのやり方を参考にさせて頂きました。 しかし、弧の開始角度、終了角度を求めたいと思っているので、やはり最初に教えて頂いた方法の方が角度等は求めやすそうな感じがしています。 両方のプログラムから、適材適所で組んでいこうと思います。 お付き合いいただきありがとうございました。 また何かありましたらよろしくお願い致します。
sgr-2

2015/10/09 06:09

情報ありがとうございます。 思い通りの結果を出力できたとの事、良かったです。 遠回りにしてしまったのが申し訳なかったです。
guest

0

こんにちは。

回転という意味であれば、X軸から円弧の開始点までの角度をずらせば良いので、
単純に以下のどちらかで良いのでは。

C#

1e.Graphics.DrawArc(Pen,,, a, b, -45, 90); 2e.Graphics.DrawArc(Pen,,, a, b, 45, 90);

投稿2015/10/08 07:17

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/10/08 08:17

お答えありがとうございます。 sgr-2様の考え方でプログラムを組みたいと思っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問