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

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

新規登録して質問してみよう
ただいま回答率
85.31%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C#

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

Q&A

1回答

726閲覧

MFC(C++)で作成した円弧を描画するプログラムを、C#に移植したい

y_k_

総合スコア0

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C#

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

0グッド

0クリップ

投稿2023/07/28 04:28

実現したいこと

MFC(C++)で作成した円弧を描画するプログラムを、C#に移植したい。

前提

MFC(C++)で作成した円弧を描画するプログラムを、C#に移植しているのですが、引数の違いで問題が発生しました。MFCでは外接する四角形の開始地点と終了地点を座標で渡すのですが、C#では角度で渡します。移植するのに、どのように変換したらよいかがわかりません。

発生している問題・エラーメッセージ

MFC(C++)での円弧の描画
BOOL Arc(
int x1,
int y1,
int x2,
int y2,
int x3,
int y3,
int x4,
int y4);
x1
外接する四角形の左上隅の x 座標を指定します (論理単位)。
y1
外接する四角形の左上隅の y 座標を指定します (論理単位)。
x2
外接する四角形の右下隅の x 座標を指定します (論理単位)。
y2
外接する四角形の右下隅の y 座標を指定します (論理単位)。
x3
円弧の始点を定義する点の x 座標を指定します (論理単位)。 この点は、円弧上に正確に配置する必要はありません。
y3
円弧の始点を定義する点の y 座標を指定します (論理単位)。 この点は、円弧上に正確に配置する必要はありません。
x4
円弧の終点を定義する点の x 座標を指定します (論理単位)。 この点は、円弧上に正確に配置する必要はありません。
y4
円弧の終点を定義する点の y 座標を指定します (論理単位)。 この点は、円弧上に正確に配置する必要はありません。

C#での円弧の描画
public void DrawArc (System.Drawing.Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle);
Pen
円弧の色、幅、およびスタイルを決定する Pen。
x
Int32
楕円を定義する四角形の左上隅の x 座標。
y
Int32
楕円を定義する四角形の左上隅の y 座標。
width
Int32
楕円を定義する四角形の幅。
height
Int32
楕円を定義する四角形の高さ。
startAngle
Int32
x 軸から円弧の開始点まで、時計回りに測定した角度 (度単位)。
sweepAngle
Int32
startAngle パラメーターから円弧の終了点まで、時計回りに測定した角度 (度単位)。

x,y,width,heightは下記のように変換できますが、sweepAngle,startAngle はどのように計算したらよいでしょうか。
x:x1
y:y1
width:x2-x1
height:y2-y1

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

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

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

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

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

fana

2023/07/28 04:44

これは純粋な数学の話だと見えます. まず,MFC側で使った Arc() について絵を描いてみると良いのでは. 描画する弧の範囲を決めるにあたって (x3,y3), (x4,y4) がどう使われているのか? というのを把握できていれば,角度自体は逆三角関数的な話で求めればよいだけの話でしょうから.
fana

2023/07/28 04:54

(…っていう話だけで解決する場合は,解決策を自己回答してください.この話だけでは解決しないようであれば,何が不明点なのかを具体的に明記するとよいでしょう.)
y_waiwai

2023/07/28 06:49

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
y_k_

2023/07/28 06:53

ありがとうございます。 ただ、同じ引数でC++版と同じ図形は描かれませんでした。 270度とかがおかしな値になります。90度ごとに4つの領域にわけて、そこからatanしたら行ける気がしています。
guest

回答1

0

ChatGPTの回答

MFCのCDCクラスのArc関数とC#のSystem.DrawingのGraphics.DrawArcメソッドは、引数の表現方法が異なるため、円弧の開始点と終了点から開始角と終了角に変換する必要があります。

MFCのCDCクラスのArc関数では、次のような引数があります:

cpp

1void CDC::Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);

ここで、(x1, y1) から (x2, y2) までの長方形内に描かれる円弧で、始点は (x3, y3) で終点は (x4, y4) です。

一方、C#のSystem.DrawingのGraphics.DrawArcメソッドでは、次のような引数があります:

csharp

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

ここで、(x, y) が長方形の左上隅の座標であり、width と height が長方形の幅と高さです。startAngleは開始角度であり、sweepAngleは開始角からの扇形の角度を指定します。

これらの2つの異なる引数を変換するために、次のような方法を使うことができます(C#の例):

csharp

1using System; 2 3public class Program 4{ 5 public static void Main() 6 { 7 // MFC Arc関数の引数 8 int x1 = 100, y1 = 100, x2 = 200, y2 = 200; 9 int x3 = 150, y3 = 200, x4 = 200, y4 = 150; 10 11 // MFCのArc関数から開始角と終了角に変換する 12 float width = x2 - x1; 13 float height = y2 - y1; 14 float centerX = x1; 15 float centerY = y1 + height; 16 float startAngle = (float)Math.Atan2(y3 - centerY, x3 - centerX) * 180 / (float)Math.PI; 17 float endAngle = (float)Math.Atan2(y4 - centerY, x4 - centerX) * 180 / (float)Math.PI; 18 19 // C#のDrawArcメソッドの引数として使用する 20 float startAngleCSharp = -startAngle; // MFCとC#では角度の向きが逆 21 float sweepAngle = endAngle - startAngle; 22 23 Console.WriteLine("Start Angle (C#): " + startAngleCSharp); 24 Console.WriteLine("End Angle (C#): " + endAngle); 25 Console.WriteLine("Sweep Angle (C#): " + sweepAngle); 26 } 27}

この例では、MFCのArc関数の引数から開始角と終了角を計算しています。また、MFCとC#では角度の向きが逆であることに注意してください。それにより、C#のDrawArcメソッドに適切な引数を渡すことができます。

動作確認はしていませんが、なんとなく正しそうな大きくは外していない気がします。

投稿2023/07/28 04:52

can110

総合スコア38352

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問