質問するログイン新規登録

回答編集履歴

2

描画するだけの話を追記

2021/01/19 01:57

投稿

fana
fana

スコア12286

answer CHANGED
@@ -66,4 +66,49 @@
66
66
  }
67
67
  ```
68
68
 
69
- ![イメージ説明](45a0d92485f5db7874d1f5833f60a4fa.png)
69
+ ![イメージ説明](45a0d92485f5db7874d1f5833f60a4fa.png)
70
+
71
+ ---
72
+
73
+ 円形の グラデーションを 描画 することが目的(結果の絵が欲しいだけ)なのであれば,
74
+ (コメントにも書いたように)単にその話をそのまま実施する,すなわち,明るさを変えながら円を複数回描画するのが最も素直と言える.(結果画像は割愛)
75
+
76
+ ```C++
77
+ const int IMG_SIZE = 240; //画像サイズ(x,yで共用)
78
+ const int CENTER = IMG_SIZE/2; //てきとーに決めた円の中心(x,yで共用)
79
+ const int RADIUS = 100; //円の半径
80
+
81
+ int main()
82
+ {
83
+ //点Aの座標 = (Ax,Ay)
84
+ const int Ax = CENTER + 45;
85
+ const int Ay = CENTER + 25;
86
+
87
+ //MEMO : 正規化した世界で考えている変数は,変数名末尾にアンダーバー'_'を付与しています.
88
+ const double Ax_ = double(Ax-CENTER)/RADIUS;
89
+ const double Ay_ = double(Ay-CENTER)/RADIUS;
90
+
91
+ //画像バッファ準備
92
+ cv::Mat Img( IMG_SIZE, IMG_SIZE, CV_8UC1 ); //IMG_SIZE*IMG_SIZEの画像バッファを用意
93
+ Img = 100; //画像全体を背景の輝度値で埋めておく.値はてきとー.
94
+
95
+ //塗りつぶし円を256回描画する
96
+ for( int t=0; t<=255; ++t )
97
+ {
98
+ double t_ = t / 255.0; //0~1
99
+ double cx_ = Ax_ * t_; //円の中心
100
+ double cy_ = Ay_ * t_; //円の中心
101
+ double r_ = 1.0 - t_; //円の半径
102
+
103
+ int cx = CENTER + cvRound( cx_ * RADIUS );
104
+ int cy = CENTER + cvRound( cy_ * RADIUS );
105
+ int r = cvRound( r_ * RADIUS );
106
+ cv::circle( Img, cv::Point(cx,cy), r, cv::Scalar(t), -1 );
107
+ }
108
+
109
+ //結果画像の表示
110
+ cv::imshow( "Img", Img );
111
+ if( cv::waitKey() == 's' ){ cv::imwrite( "Result.png", Img ); }
112
+ return 0;
113
+ }
114
+ ```

1

誤変換を修正

2021/01/19 01:57

投稿

fana
fana

スコア12286

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  点Aの場所がずれた場合,単純に,下図の真ん中のグラフのようになるのだと考える.
5
5
 
6
6
  これを,下図右側の絵のように,たくさんの円盤(緑横線)を位置をずらしながら重ねたような形だと考えれば,
7
- 各円盤のと中心位置は,明るさに対して線形に変化する形だ.
7
+ 各円盤のと中心位置は,明るさに対して線形に変化する形だ.
8
8
  話を簡単にするために中心が原点の単位円で考えれば,明るさをt(0~1)としたとき,明るさtの円盤は
9
9
 
10
10
  * 半径(t) = 1-t