将 2 点的距离转换为 1/32 英寸?
Convert distance of 2 points to 1/32 of an inch?
我的应用给出了图片框上两点之间的距离。以前他们是手工做这件事,并希望有一个应用程序来做这件事。然而,当你画线时,使用下面的公式,即使是一条小线,该线的距离也是 30
但是,当你使用带有 1/32 的尺子时,测量值为 5/32。
那么 30 是多少?这里使用的是什么类型的距离,我如何将其转换为显示数字,就像使用 1/32 尺寸的尺子一样?
//Distance between 2 points.
// ______________________
//d = √ (x2-x1)^2 + (y2-y1)^2
dist = (Convert.ToInt32(Math.Sqrt(Math.Pow(Math.Abs(p2List[i].X - p1List[i].X), 2) + Math.Pow(Math.Abs(p2List[i].Y - p1List[i].Y), 2))));
这就是我所做的。
Vector2 src = new Vector2(p1List[i].X, p1List[i].Y); //first point on the image
Vector2 dst = new Vector2(p2List[i].X, p2List[i].Y); //second point on the image
float Density = 38;
Vector2 dif = dst - src; //difference between the vectors
float len = dif.Length(); //length of the vector, in this case the distance in pixels
float inchLen = len / Density; //density is a float with the image DPI's
DataGridViewRow row = dataGridView1.Rows[rowId];
row.Cells["colLength"].Value = inchLen;
这个,对于我制作的小线条,给了我 0.7649706
但我不知道如何说 3,5,6
或者如果用尺子上的 1/32 测量的话会是什么。
这完全取决于图像。您拥有的单位是像素,因此结果是以像素为单位的距离。要转换为英寸,您需要知道图像的密度,如果它是常规图像,它们通常为 72dpi 或 96dpi,但我假设这些是用于某种类型的打印或类似的,因此它们将从 300dpi 到任何密度不等,在计算距离之前你需要知道这一点。
因此,如果按照示例,您有一张 72dpi 的图像并且距离为 30,则以英寸为单位的距离将为 30/72
,即 0.42 英寸。
不要使用整数运算,这会导致大量错误,您需要结果中的小数点才能获得准确的测量结果,至少使用浮点数,如果精度必须非常高则使用双精度.
另外,不用手动使用 Math class 使用 System.Numerics
nuget 包,它是硬件加速的并且有大量与向量操作相关的函数,每个示例你可以做:
Vector2 src = new Vector2(srcX, srcY); //first point on the image
Vector2 dst = new Vector2(dstX, dstY); //second point on the image
Vector2 dif = dst - src; //difference between the vectors
float len = dif.Length(); //length of the vector, in this case the distance in pixels
float inchLen = len / Density; //density is a float with the image DPI's
我的应用给出了图片框上两点之间的距离。以前他们是手工做这件事,并希望有一个应用程序来做这件事。然而,当你画线时,使用下面的公式,即使是一条小线,该线的距离也是 30
但是,当你使用带有 1/32 的尺子时,测量值为 5/32。
那么 30 是多少?这里使用的是什么类型的距离,我如何将其转换为显示数字,就像使用 1/32 尺寸的尺子一样?
//Distance between 2 points.
// ______________________
//d = √ (x2-x1)^2 + (y2-y1)^2
dist = (Convert.ToInt32(Math.Sqrt(Math.Pow(Math.Abs(p2List[i].X - p1List[i].X), 2) + Math.Pow(Math.Abs(p2List[i].Y - p1List[i].Y), 2))));
这就是我所做的。
Vector2 src = new Vector2(p1List[i].X, p1List[i].Y); //first point on the image
Vector2 dst = new Vector2(p2List[i].X, p2List[i].Y); //second point on the image
float Density = 38;
Vector2 dif = dst - src; //difference between the vectors
float len = dif.Length(); //length of the vector, in this case the distance in pixels
float inchLen = len / Density; //density is a float with the image DPI's
DataGridViewRow row = dataGridView1.Rows[rowId];
row.Cells["colLength"].Value = inchLen;
这个,对于我制作的小线条,给了我 0.7649706
但我不知道如何说 3,5,6
或者如果用尺子上的 1/32 测量的话会是什么。
这完全取决于图像。您拥有的单位是像素,因此结果是以像素为单位的距离。要转换为英寸,您需要知道图像的密度,如果它是常规图像,它们通常为 72dpi 或 96dpi,但我假设这些是用于某种类型的打印或类似的,因此它们将从 300dpi 到任何密度不等,在计算距离之前你需要知道这一点。
因此,如果按照示例,您有一张 72dpi 的图像并且距离为 30,则以英寸为单位的距离将为 30/72
,即 0.42 英寸。
不要使用整数运算,这会导致大量错误,您需要结果中的小数点才能获得准确的测量结果,至少使用浮点数,如果精度必须非常高则使用双精度.
另外,不用手动使用 Math class 使用 System.Numerics
nuget 包,它是硬件加速的并且有大量与向量操作相关的函数,每个示例你可以做:
Vector2 src = new Vector2(srcX, srcY); //first point on the image
Vector2 dst = new Vector2(dstX, dstY); //second point on the image
Vector2 dif = dst - src; //difference between the vectors
float len = dif.Length(); //length of the vector, in this case the distance in pixels
float inchLen = len / Density; //density is a float with the image DPI's