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

回答編集履歴

1

Arrayに変更

2016/10/06 08:59

投稿

dn315
dn315

スコア201

answer CHANGED
@@ -1,4 +1,4 @@
1
- 抽出結果が複数あるので、ループさせて描画するだけです
1
+ 抽出結果が複数あるので、描画するだけです
2
2
  ただ、このコードだとマウス座標が変わる度に
3
3
  検索&描画を行う為、四角の数が増えると重くなると思います
4
4
  要改善です
@@ -18,8 +18,8 @@
18
18
  // 四角形の座標List
19
19
  List<Rectangle> _rects = new List<Rectangle>();
20
20
 
21
- // 赤枠になっている四角形の座標List
21
+ // 赤枠になっている四角形の座標配列
22
- List<Rectangle> _prev = new List<Rectangle>();
22
+ Rectangle[] _prev = new Rectangle[0];
23
23
 
24
24
  public Form1()
25
25
  {
@@ -35,8 +35,8 @@
35
35
  {
36
36
  Random rnd = new Random();
37
37
 
38
- // 重いのでとりあえず10個
38
+ // の四角形を作成
39
- for (int i = 0; i < 10; i++)
39
+ for (int i = 0; i < 400; i++)
40
40
  {
41
41
  int x = rnd.Next(0, canvas.Width - 100);
42
42
  int y = rnd.Next(0, canvas.Height - 100);
@@ -56,37 +56,31 @@
56
56
  private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
57
57
  {
58
58
  // カーソル座標にある四角形を全て抽出
59
- List<Rectangle> hitRects = _rects.AsEnumerable()
59
+ Rectangle[] hitRects = _rects.AsEnumerable()
60
- .Where(v =>
60
+ .Where(v =>
61
- v.X <= e.X && v.Y <= e.Y &&
61
+ v.X <= e.X && v.Y <= e.Y &&
62
62
  (v.X + v.Width) >= e.X && (v.Y + v.Height) >= e.Y)
63
63
  .Select(v => v)
64
- .ToList();
64
+ .ToArray();
65
65
 
66
- // 抽出結果が1個以上あれば描画開始
67
- if(hitRects.Count > 0)
66
+ using (Graphics g = Graphics.FromImage(pictureBox1.Image))
68
67
  {
68
+ // 前回描画した赤枠を青枠に戻す
69
- using (Graphics g = Graphics.FromImage(pictureBox1.Image))
69
+ if (_prev.Length > 0)
70
70
  {
71
- if (_prev.Count() > 0)
71
+ using (Pen pen = new Pen(Color.Blue))
72
72
  {
73
- using (Pen pen = new Pen(Color.Blue))
74
- {
75
- // 前回描画した赤枠を青枠に戻す
76
- foreach (Rectangle r in _prev)
77
- {
78
- g.DrawRectangle(pen, r);
73
+ g.DrawRectangles(pen, _prev);
79
- }
80
- }
81
74
  }
75
+ }
82
76
 
77
+ // 抽出結果が1個以上あれば描画開始
78
+ if (hitRects.Length > 0)
79
+ {
83
80
  using (Pen pen = new Pen(Color.Red))
84
81
  {
85
82
  // 赤枠四角描画
86
- foreach (Rectangle r in hitRects)
87
- {
88
- g.DrawRectangle(pen, r);
83
+ g.DrawRectangles(pen, hitRects);
89
- }
90
84
  }
91
85
  }
92
86