计算两个鼠标点之间的距离

3

我需要计算鼠标在屏幕上点击的两个地点之间的距离。

在鼠标移动事件(e.X和e.Y)中填充了目标(x和y)和源(X和Y)。

我使用 distance = Math.Sqrt(Math.Pow(targetX - sourceX, 2) + Math.Pow(targetY - sourceY, 2)); 计算得出结果,但说实话,我不确定测量单位是什么或如何进行转换。我该如何将结果转换为有意义的度量单位,例如厘米或英寸?我猜需要考虑屏幕分辨率?

更新:其实我只是在消磨时间,并不是在寻找最佳解决方案,只需要一个能用的东西。它只会持续一两天。

以下是 MoveMove 事件和调用。为了更清晰,应该先发布所有内容。

    private void HookManager_MouseMove(object sender, MouseEventArgs e)
    {

        labelMousePosition.Text = string.Format("x={0:0000}; y={1:0000}", e.X, e.Y);
        AddDistance(Convert.ToDouble(e.X), Convert.ToDouble(e.Y));
    }

    private void AddDistance(double targetX, double targetY)
    {
        if (sourceX != 0 && sourceY != 0)
        {
            double distance = Convert.ToDouble(lblDistanceTravelled.Text);
            distance =+ Math.Sqrt(Math.Pow(targetX - sourceX, 2) + Math.Pow(targetY - sourceY, 2));
            lblDistanceTravelled.Text = distance.ToString();
        }
        sourceX = targetX;
        sourceY = targetY;
    }

最好包括如何填充“targetX”和“sourceX”的方法(我猜它们是像素)。 - Eddy
距离的使用意图是什么?计算机屏幕上两点之间的距离不会以英寸/厘米为单位,需要相当多的信息才能确定(屏幕DPI等)。 - Rawrgramming
@Rawrgramming 说实话,圣诞节前我在工作中感到无聊。项目已经搁置了。昨晚我妻子问我一天中我鼠标在屏幕上移动了多少英寸,你可以猜到接下来发生了什么! :) - Fred
@Fred:http://download.cnet.com/My-Mouse-Meter/3000-2072_4-10445290.html?tag=mncol;6 - Eric J.
@EricJ。感谢提供链接,但我正在打发时间,所以想自己做 :) - Fred
3个回答

5
变量targetX和sourceX很可能是以像素为单位的,因此得出的距离也将以像素为单位。为了将其转换为“屏幕上的英寸”,您需要知道屏幕的大小。您可以确定每英寸像素数,并从那里进行转换(尽管这只提供了一个估计值,如果您实际上将尺子放在屏幕上,您会得到什么)。要获得每英寸像素数,请参见: 如何在.NET中确定我的监视器的真实像素大小? 从该问题中,您可以按以下方式获取DPI(但请阅读接受的答案以了解许多注意事项)。
PointF dpi = PointF.Empty;
using(Graphics g = this.CreateGraphics()){
    dpi.X = g.DpiX;
    dpi.Y = g.DpiY;
}

单位转换的方法如下:

lengthInInches = numberOfPixes / dotsPerInch

这里的“dots”和“pixels”意思相同。我使用常见的术语。


3
您可以通过以下方式获取“当前 DPI”
int currentDPI = 0;  
using (Graphics g = this.CreateGraphics())  
{  
    currentDPI = (int)g.DpiX;      
}

然后你就可以得到

double distanceInInches = distance/*InPixels*/ / currentDPI;

然而,系统的DPI设置并不能真正可靠地将像素距离转换为屏幕英寸距离。

所有的回答都非常好,不过我选择了这个。 - Fred

1
        double dpc = this.CreateGraphics().DpiX / 2.54; //Dots Per Centimeter

        //calculate the number of pixels in the line
        double lineLengthInPixels = Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2));

        //line length in centimenters
        double lineLengthInCentimeters = dpc / lineLengthInPixels;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接