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

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

ただいまの
回答率

90.61%

  • C#

    6869questions

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

  • Visual Studio 2013

    307questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,226

fender0131

score 113

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 16:37

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

    キャンセル

  • 2015/10/08 17:16

    皆様ご回答ありがとうございます。

    pictureboxにDrawArcで書き込んでいます。
    左下を原点としているため、円に外接する矩形の左下の座標を求めました。
    45度回転させたとして、以下の式であっていますでしょうか?

    float kaiten = 45;
    e.Graphics.DrawArc(Pen, x', y', a, b, kaiten, kaiten + 90);

    自分のプログラムが間違っているせいか、思い通り円弧を書くことができませんでした。

    キャンセル

  • 2015/10/08 17:36 編集

    うまくいかないですか。。
    このような回転移動をさせる時は、円弧の中心の座標値を使うのが大事になると思います。
    矩形の角を使って回転移動をすると目的の位置からずれてしまう筈です。

    ちょっと冗長な書き方かも知れませんが、以下のような感じです

    回転移動の中心を(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

    円弧の中心から回転移動の計算しても目的の位置に書けないでしょうか?

    キャンセル

  • 2015/10/08 18:17

    お答えありがとうございます。
    本文に追記させて頂きました。

    sgr-2様が添付して頂いた図を見ると、長方形が回転していないことに気が付きました。
    今回の場合ですと、円弧を書くのに必要な長方形は回転させずにポイントを取る必要があるということでしょうか?

    sgr-2様が書いて下さったプログラムとほぼ同じなので、座標を求めるプログラムは問題なさそうでした。書いて下さったことで確認することができました。ありがとうございます。

    キャンセル

  • 2015/10/08 18:30

    DrawArcに渡す値は、矩形の角(1つの頂点?)と幅、高さだと思います。
    幅と高さを与えている事からも、外接する矩形がX軸、Y軸に並行である事を前提していると言えます。
    矩形を素直に回転移動してしまうと、傾けた角度分だけX軸、Y軸に対して傾きを持ってしまうので、DrawArcの渡すパラメータとしてそのまま利用できなくなってしまいます。

    ちょっと言葉で表現しにくいのが辛い所なのですが・・・
    絵か何か考えて見ます。少し時間を貰っても大丈夫ですか?

    キャンセル

  • 2015/10/08 18:40

    お答えありがとうございます。
    あともう少しといったところまでは来てるのですが・・・
    傾けてしまうとダメだということはわかりました。
    もしかしたら、プログラムの中で傾けてしまっているかもしれないので見直してきます。

    お手数おかけして申し訳ございませんが、
    もう少しお付き合い願いますでしょうか。

    キャンセル

  • 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.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    wordpress 投稿一覧にある文章の表示範囲

    初めてwordpressを使いました。HTMLやCSSの基本はわかりますが、それ以外あまりわかりません。 図のように投稿一覧で、各投稿の文章を全て表示させるのではなく最初の2~3

  • 解決済

    【html】float:left;しても左にずれない

    このように「自由」「オリジナルロゴ」がアイコン、ヘッダー、壁紙の下にくるはずが重なってしまってます。どういうことでしょうか。 <div class="contents">    

  • 解決済

    Virtual Box上でCent OSを実行するための設定方法がわからない

    Virtual BoxでCent OSを実行するための設定方法を教えてください。 VirtualBox 5.0.10 for Windows hosts CentOS-7-x86

  • 解決済

    Xamarin StudioのAuto Layoutについて

    Xamarin Studioで幅は画面と同じ大きさ、高さが画面の幅に対して50%のViewを作りたいのですが、どのように行ったら良いのでしょうか?

  • 解決済

    cssで指定したfont-sizeの実サイズを知りたい

    例えばfont-size: 5vwと指定した場合、これをpxに換算したら何ピクセルになるのか知りたいのですが、Chromeの開発者ツールか何かで知る方法はないでしょうか?

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

  • 解決済

    railsで紐づけしたデータを表示させるには

    前回の続き(railsのDBに関する質問)です。 前回の回答で、characterテーブルとmasterpieceテーブルの紐づけはできました。 consoleの方で試したとこ

  • 解決済

    unity-chanモーション

    unity-chanをmixamoを使ってモーション数を 増やしたいのですが仕方がいまいちわかりません。 現在したのが、 1mixamoにfbxデータをアップデートする 2mi

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

  • C#

    6869questions

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

  • Visual Studio 2013

    307questions

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