根据在 winforms 中单击鼠标查找到对象的最短距离



我在使此功能正常工作时遇到问题。我必须创建一个充当出租车映射器的winform 应用程序。装载时,出租车根据文本文件放置在同一位置。当用户点击表单时,最近的出租车应该移动到"用户"或位置,然后停止。

一切都很好,除了最近的出租车并不总是去这个位置。更远的出租车将前往该地点。它似乎在某些时候有效,但并非一直有效。我不确定我的逻辑在Form1_MouseDown函数中是否正确

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    if (pickUp) //Are we picking up a passenger?
    {
        //Convert mouse pointer location to local window locations
        int mLocalX = this.PointToClient(Cursor.Position).X;
        int mLocalY = this.PointToClient(Cursor.Position).Y;
        //set the minimum value (for range finding)
        int min = int.MaxValue;
        //Temporary object to get the handle for the taxi object we want to manipulate
        taxiCabTmp = new TaxiClass();
        //Iterate through each object to determine who is the closest
        foreach (TaxiClass taxiCab in taxi)
        {
            if (Math.Abs(Math.Abs(taxiCab.CabLocationX - mLocalX) + Math.Abs(taxiCab.CabLocationY - mLocalY)) <= min)
            {
                min = Math.Abs(Math.Abs(taxiCab.CabLocationX - mLocalX) + Math.Abs(taxiCab.CabLocationY - mLocalY));
                //We found a minimum, grab a handle to the object's instance
                taxiCab.GetReference(ref taxiCabTmp);
            }
        }
        //Call the propogate method so it can spin off a thread to slowly change it's location for the timer to also change
        taxiCabTmp.Propogate(mLocalX - 20, mLocalY - 20);
        taxiCabTmp.occupied = true; //This taxi object is occupied
        pickUp = false; //We are not picking up a passenger at the moment
    }
    else //We are dropping off a passenger
    {
        taxiCabTmp.Propogate(this.PointToClient(Cursor.Position).X, this.PointToClient(Cursor.Position).Y);
        taxiCabTmp.occupied = false;
        pickUp = true; //We can pick up a passenger again!
    }
}

您是正确的,用于确定距离的计算并不总是正确的。一定角度的物体将计算出比实际更远的距离。

查看此链接以获取更多信息:http://www.purplemath.com/modules/distform.htm

下面是一个示例:

int mLocalX = 1;
int mLocalY = 1;
int taxiCab.CabLocationX = 2;
int taxiCab.CabLocationY = 2;
double distance = Math.Sqrt(Math.Pow((taxiCab.CabLocationX - mLocalX), 2) + Math.Pow((taxiCab.CabLocationY - mLocalY), 2));

作为旁注,您不应该在类后附加Class,即TaxiClass,它应该简单地称为Taxi。

使用此公式计算两个坐标之间的距离。

var distance = Math.Sqrt(Math.Pow(taxiCab.CabLocationX - mLocalX, 2) + Math.Pow(taxiCab.CabLocationY - mLocalY, 2));
if (distance <= min) {
    min = distance;
    //We found a minimum, grab a handle to the object's instance
    taxiCab.GetReference(ref taxiCabTmp);
}

最新更新