C# 用c语言计算BMP图像中直线长度的公式#

C# 用c语言计算BMP图像中直线长度的公式#,c#,math,image-processing,graph,C#,Math,Image Processing,Graph,我想计算一下这个BMP中一些线的长度 我不知道如何计算这些类型的线的公式?或者,在图像处理中,有任何其他公式来计算长度 通过搜索,我知道,如果直线垂直或水平方向的长度为1像素,则长度必须为+1。如果长度沿对角线增加怎么办? 如果有人能提供一个数学公式那就太好了。 谢谢。对角线方向为1像素时的长度为1.41421356237309504480168887242097 这个因子背后的数学是纯向量数学,让我解释一下。根据向量数学,我们可以将2D向量的长度计算为math.Sqrt(vector.X*ve

我想计算一下这个BMP中一些线的长度

我不知道如何计算这些类型的线的公式?或者,在图像处理中,有任何其他公式来计算长度

通过搜索,我知道,如果直线垂直或水平方向的长度为1像素,则长度必须为+1。如果长度沿对角线增加怎么办? 如果有人能提供一个数学公式那就太好了。
谢谢。

对角线方向为1像素时的长度为1.41421356237309504480168887242097

这个因子背后的数学是纯向量数学,让我解释一下。根据向量数学,我们可以将2D向量的长度计算为
math.Sqrt(vector.X*vector.X+vector.Y*vector.Y))
。如果我们取原点(0,0)和目标(1,1),我们知道原点和目标之间的距离向量是(1,1)。因此,如果我们计算这个向量的长度,我们得到:
sqrt(1*1+1*1)
减少的是
sqrt(2)
,结果是1.41421356237309500488016887242097

您可以使用矢量数学计算一组像素,而不是添加此因子以获得更好的精度,为此,只需应用前面的数学:

distanceVector = targetVector - originVector
distance = sqrt(distanceVector.X * distanceVector.X + distanceVector.Y * distanceVector.Y)
如果使用System.Numeric软件包,则可以使用集成功能:

Vector2 origin = new Vector2(originPixelX, originPixelY);
Vector2 target = new Vector2(targetPixelX, targetPixelY);

Vector2 distanceVector = target - origin;
float length = distanceVector.Length();
编辑:

为了简化您的问题,有一个非常简单的解决方案,它将为您提供最佳精度

如果将两个变量中的直线像素和对角线像素的总和相加,我们将这些直线像素和对角线像素命名为:

var length = straightPixels + (new Vector2(diagonalPixels, diagonalPixels)).Length();
如果您不想使用系统。可以执行以下操作:

var length = straightPixels + Math.Sqrt(diagonalPixels * diagonalPixels + diagonalPixels * diagonalPixels);

非常简单有效。

当方向为对角线上的1个像素时,长度为1.41421356237309500488016887242097

这个因子背后的数学是纯向量数学,让我解释一下。根据向量数学,我们可以将2D向量的长度计算为
math.Sqrt(vector.X*vector.X+vector.Y*vector.Y))
。如果我们取原点(0,0)和目标(1,1),我们知道原点和目标之间的距离向量是(1,1)。因此,如果我们计算这个向量的长度,我们得到:
sqrt(1*1+1*1)
减少的是
sqrt(2)
,结果是1.41421356237309500488016887242097

您可以使用矢量数学计算一组像素,而不是添加此因子以获得更好的精度,为此,只需应用前面的数学:

distanceVector = targetVector - originVector
distance = sqrt(distanceVector.X * distanceVector.X + distanceVector.Y * distanceVector.Y)
如果使用System.Numeric软件包,则可以使用集成功能:

Vector2 origin = new Vector2(originPixelX, originPixelY);
Vector2 target = new Vector2(targetPixelX, targetPixelY);

Vector2 distanceVector = target - origin;
float length = distanceVector.Length();
编辑:

为了简化您的问题,有一个非常简单的解决方案,它将为您提供最佳精度

如果将两个变量中的直线像素和对角线像素的总和相加,我们将这些直线像素和对角线像素命名为:

var length = straightPixels + (new Vector2(diagonalPixels, diagonalPixels)).Length();
如果您不想使用系统。可以执行以下操作:

var length = straightPixels + Math.Sqrt(diagonalPixels * diagonalPixels + diagonalPixels * diagonalPixels);

非常简单和有效。

如果您只希望上下1像素的对角线长度,那么它就是。
所以它将是2的平方。

如果你只想要1像素左右的对角线长度,那么它就是。
因此,它将是二的平方。

这可能不是最佳选择,但只需检查第一个像素周围的每个像素上是否有相同颜色的像素(如果使用这种线条)。当前!我只画了黑线,我也逐像素地画了线。但我不知道计算长度的公式。它可能不是最优的,但只要检查第一个像素周围的每个像素上是否有相同颜色的像素(如果你使用这种线条)。目前!我只画了黑线,我也逐像素地画了线。但是我不知道计算长度的公式。谢谢你提供的信息,所以它只是简单地为对角线像素添加sqrt(2),你能保证我一件事吗,例如我遇到了这种情况。1像素在(0,0)秒在(1,1)秒在(2,2)秒在(1,1)秒在(2,2)秒在(3,3)秒在(1,1)秒在(2,2)秒在(3,3)秒在(3,3)秒在(1,1)秒在(1,1)秒在(2,?长度=sqrt(2)+sqrt(2)+sqrt(2);不要只添加
sqrt(2)
,它会给你一个很差的精度,使用向量数学代替。让我添加一个方法,它会给你最好的精度,并且非常容易使用系统。数值包。只有数学公式会被欣赏。我会尝试自己将它转换成代码@GusmanThanks提供了信息,所以它只是简单地为对角线像素添加了sqrt(2),你能保证我一件事吗,例如,我遇到了这种情况。1像素在(0,0)秒在(1,1)秒在(2,2)秒在(1,1)秒在(2,2)秒在(3,3)秒在(1,1)秒在(2,2)秒在(3,3)秒在(3,3)秒在(1,1)秒在(1,1)秒在(2,?长度=sqrt(2)+sqrt(2)+sqrt(2);不要只添加
sqrt(2)
,它会给你一个很差的精度,使用向量数学代替。让我添加一个方法,它会给你最好的精度,并且非常容易使用系统。数值包。只有数学公式会被欣赏。我会尝试自己将它转换成代码@Gusmanif如果我有一条带像素的对角线,那么我将不得不添加sqrt(2)像素次?这将是正确的长度?如果我有一条带像素的对角线,那么我将不得不添加sqrt(2)像素次?这将是正确的长度?