根据在 winforms 中单击鼠标查找到对象的最短距离
本文关键字:对象 短距离 查找 鼠标 winforms 单击 | 更新日期: 2024-10-25 03:40:53
我在使此功能正常工作时遇到问题。我必须创建一个充当出租车映射器的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);
}