現在の状況に応じてaCircle
から aを取得する必要がありますList<Circle>
MousePosition
サークルクラスです
public class Circle
{
public Point Center;
public Circle(int x, int y)
{
this.Center = new Point(x, y);
}
public int Distance(int x, int y)
{
int result = 0;
double part1 = Math.Pow((this.Center.X - x), 2);
double part2 = Math.Pow((this.Center.Y - y), 2);
double underRadical = part1 + part2;
result = (int)Math.Sqrt(underRadical);
return result;
}
public void Draw(Graphics g, Pen pen, int d)
{
g.DrawEllipse(pen, this.Center.X - d / 2, this.Center.Y - d/ 2, d, d );
}
}
リストからサークルを取得する方法は次のとおりです
public class UserControl1 : UserControl
{
private Circle currentCircle;
private List<Circle> circles = new List<Circle>();
private const int RADIUS = 16;
// ...snip
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
currentCircle= this.circles
.Where(c => c.Distance(e.X, e.Y) < RADIUS )
.DefaultIfEmpty(null)
.First();
}
//...snip
}
これは小さなリストでは問題なく機能しますが、リストが大きくなるにつれて遅くなります。List.BinarySearch を使用してパフォーマンスを向上させることができると思いますがIComparable
、このシナリオで実装する方法がわかりませんでした。