0

さて、今、グリッドをクリックすると、グリッド上のすべての「パス」を通過し、それらが楕円であるかどうか、マウスがそれらの上にあるかどうかを確認し、2つ選択されている場合は、距離を計算します。 ..しかし、グリッド上に50以上のポイントを取得した場合、ポイントをクリックしても何も起こりません....これを行うためのより効率的な方法はありますか?

これが私のコードです:

foreach (var x in GraphPanel.Children)
{
     try
     {
         if (((Path)x).IsMouseOver && ((Path)x).Data.ToString() == "System.Windows.Media.EllipseGeometry")
         {
            listViewPoints.SelectedItems.Add(listViewPoints.Items[PointIndex]);
            var converter = new System.Windows.Media.BrushConverter();
            var brush = (System.Windows.Media.Brush)converter.ConvertFromString("#FFB1D100");
                    ((Path)x).Stroke = brush;
                    ((Path)x).StrokeThickness = 8;

            if (listViewPoints.SelectedItems.Count == 2)
            {
                 double diffX;
                 double diffY;

                 double ptAX = ((Points)listViewPoints.SelectedItems[0]).A;
                 double ptAY = ((Points)listViewPoints.SelectedItems[0]).B;
                 double ptBX = ((Points)listViewPoints.SelectedItems[1]).A;
                 double ptBY = ((Points)listViewPoints.SelectedItems[1]).B;

                 if (ptAX > ptBX)
                 {
                     diffX = ptAX - ptBX;
                 }
                 else
                 {
                     diffX = ptBX - ptAX;
                 }
                 if (ptAY > ptBY)
                 {
                     diffY = ptAY - ptBY;
                 }
                 else
                 {
                     diffY = ptBY - ptAY;
                 }
                 //the distance between the points = sqr/-diff in x squared + diff in y squared
                 double result = Math.Sqrt(Math.Pow(diffX,2) + Math.Pow(diffY,2));
                 CalculatedDistanceApart.Content = "Distance Apart: " + result.ToString() + "'";
             }
        }

        if (((Path)x).Data.ToString() == "System.Windows.Media.EllipseGeometry")
        {
            PointIndex++;
        }
    }
    catch { }
}
4

2 に答える 2

2

パスを使用する代わりに、グリッドに楕円を追加して、各楕円にMouseLeftButtonUpイベントハンドラーをアタッチすることができます。

このヒットテストコードはすべて必要ありません。

于 2012-09-13T12:38:40.657 に答える
1

さて、私はあなたの遅いことについて知りませんIsMouseOverが、すべては確かにスピードアップして片付けることができます:

//why make these for every item?
var converter = new System.Windows.Media.BrushConverter(); 
var brush = (System.Windows.Media.Brush)converter.ConvertFromString("#FFB1D100"); 

foreach (var x in GraphPanel.Children) 
{ 
    //this is tidier, but what if it's not a Path, is that possible?
    var path = (Path)x;

    //jump out here if it's not the right type, reduces nesting and removes one comparison
    if(!(path.Data is System.Windows.Media.EllipseGeometry)) continue;

     try
     {
         if (path.IsMouseOver)
         { 
            listViewPoints.SelectedItems.Add(listViewPoints.Items[PointIndex]); 
            path.Stroke = brush; 
            path.StrokeThickness = 8;      
            if (listViewPoints.SelectedItems.Count == 2) 
            {
                 double ptAX = ((Points)listViewPoints.SelectedItems[0]).A; 
                 double ptAY = ((Points)listViewPoints.SelectedItems[0]).B; 
                 double ptBX = ((Points)listViewPoints.SelectedItems[1]).A; 
                 double ptBY = ((Points)listViewPoints.SelectedItems[1]).B; 

                 //you're going to square these, so negatives don't matter
                 double diffX = ptAX - ptBX;
                 double diffY = ptAY - ptBY;

                 //the distance between the points = sqr/-diff in x squared + diff in y squared 
                 //don't use Math.Pow for squaring
                 double result = Math.Sqrt(diffX*diffX + diffY*diffY); 
                 CalculatedDistanceApart.Content = "Distance Apart: " + result + "'"; 
                 //are we done now?
             } 
        } 
        PointIndex++; 

    } 
    catch { } 
} 

Math.Pow(x、2)vs x * x

于 2012-09-13T13:04:09.287 に答える