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

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

ただいまの
回答率

90.35%

  • C#

    9666questions

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

  • Visual Studio 2013

    321questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,519

fender0131

score 119

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

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

イメージ説明



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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

こんにちは。

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

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


 追記 2015/10/08 19: 56頃 
画像が作れたので追記します。

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/08 20: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); // 移動前と同じ事を書く

    キャンセル

  • 2015/10/09 15:05

    お返事大変遅くなり申し訳ございませんでした。
    無事に思い通りの結果を出力することができました。

    図面・プログラムと参考になる資料を提示して頂きありがとうございました。
    最終的には、.TranslateTransformのやり方を参考にさせて頂きました。

    しかし、弧の開始角度、終了角度を求めたいと思っているので、やはり最初に教えて頂いた方法の方が角度等は求めやすそうな感じがしています。

    両方のプログラムから、適材適所で組んでいこうと思います。
    お付き合いいただきありがとうございました。
    また何かありましたらよろしくお願い致します。

    キャンセル

  • 2015/10/09 15:09

    情報ありがとうございます。
    思い通りの結果を出力できたとの事、良かったです。

    遠回りにしてしまったのが申し訳なかったです。

    キャンセル

0

こんにちは。

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

e.Graphics.DrawArc(Pen, x, y, a, b, -45,  90); 
e.Graphics.DrawArc(Pen, x, y, a, b,  45,  90); 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/08 17:17

    お答えありがとうございます。

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

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9666questions

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

  • Visual Studio 2013

    321questions

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