トップページ > 記事閲覧
扇形の拡大と移動
名前:初心者A 日時: 2023/08/26 22:01

目標 扇形の中心角と半径を変えながら移動してさらにαブレンドをして表示したいです。 現状 DrawCircleGaugeを使って中心角を変えてαブレンドまでは出来ましたが、半径を変える部分が実装できません。 色々調べてみたのですが、初心者のためなかなか方法が分からず質問させていただきました。 もし可能であれば... 半径の異なる2つの円とその2本の共通外接線で囲まれている領域、および2つの円の内側を塗りつぶした図形にαブレンドをして表示できるのが最終目標です。 2つの円とその共通外接線2本の接点である4点の座標を求めることは出来ました。あとは扇形が表示できれば一応達成できるかなと思った次第です。 もっと良い方法があればご教授いただければ幸いです。
メンテ

Page: 1 |

Re: 扇形の拡大と移動 ( No.1 )
名前:管理人 日時:2023/08/27 05:10

すみません、ちょっと具体的なイメージが描けないので 図を使ってご説明していただけないでしょうか? m(_ _;m ( 画像をアップできない掲示板ので、お手数で申し訳ありませんが 画像ファイル自体はアップローダーなどをお使いください m(_ _;m )
メンテ
Re: 扇形の拡大と移動 ( No.2 )
名前:初心者A 日時:2023/08/27 10:32

早々にご返信、ありがとうございます。 分かりにくくて申し訳ありません。以下のリンクにイメージ画像をアップしました。 h ttps://drive.google.com/file/d/1vYBmFWPksqoteFUx87OEtV34NQ6zip-m/view?usp=sharing また、円の接点は以下のように求めました。 #include <math.h> double x1, y1, r1, x2, y2, r2; //二つの円の座標と半径 double point_x[4], point_y[4]; //4つの接点の座標 double root1 = pow((x2 - x1), 2.0) + pow((y2 - y1), 2.0) - pow((r1 + r2), 2.0); double root2 = pow((x2 - x1), 2.0) + pow((y2 - y1), 2.0) - pow((r1 - r2), 2.0); double denom = pow((x2 - x1), 2.0) + pow((y2 - y1), 2.0); point_x[0] = ((x2 - x1) * (r1 - r2) * r1 + (y2 - y1) * r1 * sqrt(root2)) / denom + x1; point_y[0] = ((y2 - y1) * (r1 - r2) * r1 - (x2 - x1) * r1 * sqrt(root2)) / denom + y1; point_x[1] = ((x2 - x1) * (r1 - r2) * r1 - (y2 - y1) * r1 * sqrt(root2)) / denom + x1; point_y[1] = ((y2 - y1) * (r1 - r2) * r1 + (x2 - x1) * r1 * sqrt(root2)) / denom + y1; point_x[2] = ((x1 - x2) * (r2 - r1) * r2 + (y1 - y2) * r2 * sqrt(root2)) / denom + x2; point_y[2] = ((y1 - y2) * (r2 - r1) * r2 - (x1 - x2) * r2 * sqrt(root2)) / denom + y2; point_x[3] = ((x1 - x2) * (r2 - r1) * r2 - (y1 - y2) * r2 * sqrt(root2)) / denom + x2; point_y[3] = ((y1 - y2) * (r2 - r1) * r2 + (x1 - x2) * r2 * sqrt(root2)) / denom + y2; 宜しくお願い致します。
メンテ
Re: 扇形の拡大と移動 ( No.3 )
名前:管理人 日時:2023/08/28 03:15

イメージ画像ありがとうございます、恐らく理解できたと思います 直接裏画面に描画するのではなく、一度仮画面に円と、円同士を 結ぶ領域を描画した後、裏画面にアルファブレンドで仮画面を描画すれば 初心者Aさんの希望される処理が実現できると思います サンプルを作成してみましたので、よろしければご覧ください m(_ _)m #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int TempScreen ; int Alpha = 255, AlphaAdd = -4 ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 仮画面の作成 TempScreen = MakeScreen( 640, 480, TRUE ) ; while( ProcessMessage() == 0 ) { // アルファ値を変化させる Alpha += AlphaAdd ; if( Alpha <= 0 || Alpha >= 255 ) { AlphaAdd = -AlphaAdd ; } // 仮画面を描画先に変更 SetDrawScreen( TempScreen ) ; // 仮画面をクリア ClearDrawScreen() ; // 円と台形を描画 DrawCircle( 100, 240, 50, GetColor( 255,255,0 ), TRUE ) ; DrawCircle( 490, 240, 100, GetColor( 255,255,0 ), TRUE ) ; DrawQuadrangle( 100, 190, 490, 140, 490, 341, 100, 291, GetColor( 255,255,0 ), TRUE ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 裏画面をグレーで塗りつぶす DrawBox( 0, 0, 640, 480, GetColor( 128,128,128 ), TRUE ) ; // 仮画面をアルファブレンドで描画 SetDrawBlendMode( DX_BLENDMODE_ALPHA, Alpha ) ; DrawGraph( 0, 0, TempScreen, TRUE ) ; SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 上記のプログラムではまず仮画面に2つの円を DrawCircle で描画して、 円同士の間の部分を DrawQuadrangle で描画しています その後描画先を裏画面に切り替え、仮画面をアルファブレンドで描画しています 上記プログラムの DrawQuadrangle で指定する 4頂点の座標を共通外接線の接点にすれば 良いのではないかと思います よろしければお試しください m(_ _)m
メンテ
Re: 扇形の拡大と移動 ( No.4 )
名前:初心者A(解決) 日時:2023/08/28 11:00

ご返信ありがとうございます。 仮画面の作成というものがあるのですね... 普通に描画すると、αブレンドのときに円と4点の内側の四角形が重なるところの色が濃くなってしまう現象が起きてしまったため、 重ならないように図形を描画しなければならないと勘違いしていました。 今までMakeScreenは見かけたことはあったものの、どう使うのかわかりませんでしたが、今回の例で理解することができました。 うまく使いこなせるように、もっと勉強していきたいと思います。 本当に助かりました。ありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存