回答編集履歴

1

見直しキャンペーン中

2023/07/28 17:20

投稿

TN8001
TN8001

スコア9801

test CHANGED
@@ -1,269 +1,135 @@
1
1
  参考コードがある場合は出典を**質問に明示**してください。
2
-
3
2
  [C#:n個の要素からk個を選ぶ組合せを列挙する - Qiita](https://qiita.com/gushwell/items/74a96f56ccb64db3660c)
4
-
5
-
6
3
 
7
4
  > 7色の組み合わせの画像を127通り作りたい
8
5
 
9
-
10
-
11
6
  7個中から1個選ぶ重複しない組合せ:7
12
-
13
7
  7個中から2個選ぶ重複しない組合せ:21
14
-
15
8
  7個中から3個選ぶ重複しない組合せ:35
16
-
17
9
  7個中から4個選ぶ重複しない組合せ:35
18
-
19
10
  7個中から5個選ぶ重複しない組合せ:21
20
-
21
11
  7個中から6個選ぶ重複しない組合せ:7
22
-
23
12
  7個中から7個選ぶ重複しない組合せ:1
24
-
25
13
  計:127通りということですね。そしてそれはもうできている。と
26
-
27
-
28
14
 
29
15
  > ファイルが実現したいようにできない、127通りの画像を出力できない。
30
16
 
31
-
32
-
33
17
  `Output_Click`がどういう意図か1ミリもわからないのですが、`canvas.Save`でpngファイルを作るのだから都度ファイル名を変えないといけないのでは?
34
-
35
-
36
18
 
37
19
  > ファイル名を組み合わせた色にあわせるようにdictionaryを使って作れないか摸索
38
20
 
39
-
40
-
41
21
  皆さんおっしゃっていますが、setunさんがどういうファイル名にしたいのかがまったく伝わっていません。
42
-
43
-
44
22
 
45
23
  `ColorDialog`は1個で十分です。使いまわせるのでボタン分作る必要はありません。
46
24
 
47
-
48
-
49
25
  全体的に変数名がひどすぎます。`Button`なのか`Label`なのか`TextBox`なのかまったくわかりません。
50
-
51
26
  ひとりで作っているならどうでもいいですが、第三者に見せるのなら、わかりやすい名前に変える・説明をつける・Designer.csを提示する等の配慮が必要です。
52
27
 
53
28
 
54
-
55
-
56
-
57
29
  やりたいこと自体は分かったので、3色版を書いてみました。
58
-
59
- ```C#
30
+ ```cs
60
-
61
31
  using System;
62
-
63
32
  using System.Collections.Generic;
64
-
65
33
  using System.Data;
66
-
67
34
  using System.Drawing;
68
-
69
35
  using System.Drawing.Imaging;
70
-
71
36
  using System.Linq;
72
-
73
37
  using System.Windows.Forms;
74
38
 
75
-
76
-
77
39
  namespace Questions356810
78
-
79
40
  {
80
-
81
41
  public partial class Form1 : Form
82
-
83
42
  {
84
-
85
43
  public Form1()
86
-
87
44
  {
88
-
89
45
  InitializeComponent();
90
-
91
46
  //color1Button.BackColor = Color.Red;
92
-
93
47
  //color2Button.BackColor = Color.Lime;
94
-
95
48
  //color3Button.BackColor = Color.Blue;
96
-
97
49
  }
98
50
 
99
-
100
-
101
51
  private void Color1Button_Click(object sender, EventArgs e)
102
-
103
52
  {
104
-
105
53
  if (colorDialog1.ShowDialog() == DialogResult.OK)
106
-
107
54
  color1Button.BackColor = colorDialog1.Color;
108
-
55
+ }
56
+ private void Color2Button_Click(object sender, EventArgs e)
57
+ {
58
+ if (colorDialog1.ShowDialog() == DialogResult.OK)
59
+ color2Button.BackColor = colorDialog1.Color;
60
+ }
61
+ private void Color3Button_Click(object sender, EventArgs e)
62
+ {
63
+ if (colorDialog1.ShowDialog() == DialogResult.OK)
64
+ color3Button.BackColor = colorDialog1.Color;
109
65
  }
110
66
 
111
- private void Color2Button_Click(object sender, EventArgs e)
67
+ private void OutputButton_Click(object sender, EventArgs e)
112
-
113
68
  {
114
-
115
- if (colorDialog1.ShowDialog() == DialogResult.OK)
116
-
117
- color2Button.BackColor = colorDialog1.Color;
118
-
119
- }
120
-
121
- private void Color3Button_Click(object sender, EventArgs e)
122
-
123
- {
124
-
125
- if (colorDialog1.ShowDialog() == DialogResult.OK)
126
-
127
- color3Button.BackColor = colorDialog1.Color;
128
-
129
- }
130
-
131
-
132
-
133
- private void OutputButton_Click(object sender, EventArgs e)
134
-
135
- {
136
-
137
69
  float w = 100;
138
-
139
70
  float h = 100;
140
71
 
141
-
142
-
143
72
  using (var canvas = new Bitmap((int)w, (int)h))
144
-
145
73
  using (var graphics = Graphics.FromImage(canvas))
146
-
147
74
  using (var brush1 = new SolidBrush(color1Button.BackColor))
148
-
149
75
  using (var brush2 = new SolidBrush(color2Button.BackColor))
150
-
151
76
  using (var brush3 = new SolidBrush(color3Button.BackColor))
152
-
153
77
  {
154
-
155
78
  // Combination.EnumerateはDictionaryでも使える
156
-
157
79
  // 文字列との対応を取りたいのであればこれを渡せばいい
158
-
159
80
  var choices = new Dictionary<string, SolidBrush>
160
-
161
81
  {
162
-
163
82
  { "Color1", brush1 },
164
-
165
83
  { "Color2", brush2 },
166
-
167
84
  { "Color3", brush3 },
168
-
169
85
  };
170
86
 
171
-
172
-
173
87
  var count = 1;
174
-
175
88
  for (var i = 1; i <= choices.Count; i++)
176
-
177
89
  {
178
-
179
90
  var combinations = Combination.Enumerate(choices, i, false);
180
-
181
91
  foreach (var combination in combinations)
182
-
183
92
  {
184
-
185
93
  for (var j = 0; j < combination.Length; j++)
186
-
187
94
  {
188
-
189
95
  var brush = combination[j].Value;
190
-
191
96
  graphics.FillRectangle(brush, w / i * j, 0, w / i, h);
192
-
193
97
  }
194
98
 
195
-
196
-
197
99
  var keys = string.Join("-", combination.Select(x => x.Key));
198
-
199
100
  var codes = string.Join("-", combination.Select(x => x.Value.Color)
200
-
201
101
  .Select(x => $"#{x.R:X2}{x.G:X2}{x.B:X2}"));
202
102
 
203
-
204
-
205
103
  var fileName = $"{count}_{keys}_{codes}.png";
206
-
207
104
  canvas.Save(fileName, ImageFormat.Png);
208
-
209
105
  count++;
210
-
211
106
  }
212
-
213
107
  }
214
-
215
108
  }
216
-
217
109
  }
218
-
219
110
  }
220
111
 
221
112
 
222
-
223
-
224
-
225
113
  // [C#:n個の要素からk個を選ぶ組合せを列挙する - Qiita](https://qiita.com/gushwell/items/74a96f56ccb64db3660c)
226
-
227
114
  static class Combination
228
-
229
115
  {
230
-
231
116
  public static IEnumerable<T[]> Enumerate<T>(IEnumerable<T> items, int k, bool withRepetition)
232
-
233
117
  {
234
-
235
118
  if (k == 1)
236
-
237
119
  {
238
-
239
120
  foreach (var item in items) yield return new T[] { item };
240
-
241
121
  yield break;
242
-
243
122
  }
244
-
245
123
  foreach (var item in items)
246
-
247
124
  {
248
-
249
125
  var leftside = new T[] { item };
250
-
251
126
  var unused = withRepetition ? items : items.SkipWhile(e => !e.Equals(item)).Skip(1).ToList();
252
-
253
127
  foreach (var rightside in Enumerate(unused, k - 1, withRepetition))
254
-
255
128
  yield return leftside.Concat(rightside).ToArray();
256
-
257
129
  }
258
-
259
130
  }
260
-
261
131
  }
262
-
263
132
  }
264
-
265
133
  ```
266
134
 
267
-
268
-
269
135
  ![出力ファイル](13b61bc87fa47d3b9b5db06e49f2866e.png)