Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C语言的图像/形状的外部边界点#_C#_Drawing_Geometry_Polygon - Fatal编程技术网

C# 使用C语言的图像/形状的外部边界点#

C# 使用C语言的图像/形状的外部边界点#,c#,drawing,geometry,polygon,C#,Drawing,Geometry,Polygon,我有一些图像,我想画一个外边缘周围的普立万。图像本身是在透明的背景上,我在图像中创建了一个像素阵列,其中包含一个点,并且不是透明的(或白色的) 现在,我的问题是:如何围绕外边缘点绘制精确的多边形?我使用了一个我读过的方法,在边缘周围创建一个凸面外壳,但这似乎不适用于具有凹面的对象。例如: 左侧的图像使用此方法填充右侧的图像。正如你所看到的,它“填充”了太多 我想一定有其他的算法或方法可以用来解决这个问题,但我不确定该去哪里寻找,或者它可能被称为什么。谁能给我指一下正确的方向吗?我使用的是C#/

我有一些图像,我想画一个外边缘周围的普立万。图像本身是在透明的背景上,我在图像中创建了一个像素阵列,其中包含一个点,并且不是透明的(或白色的)

现在,我的问题是:如何围绕外边缘点绘制精确的多边形?我使用了一个我读过的方法,在边缘周围创建一个凸面外壳,但这似乎不适用于具有凹面的对象。例如:

左侧的图像使用此方法填充右侧的图像。正如你所看到的,它“填充”了太多


我想一定有其他的算法或方法可以用来解决这个问题,但我不确定该去哪里寻找,或者它可能被称为什么。谁能给我指一下正确的方向吗?我使用的是C#/.net,希望已经存在的东西能够沿着这些思路工作。

您可以使用泛光填充方法从像素级开始

Start in the corner, checking that it does have zero alpha.
Check the neighbours for zero alpha and iterate until we have no unchecked neighhours.
这将为图像提供一个遮罩,该遮罩将由两个简单连接的区域(内部和外部)组成

然后,您搜索的集合包括:

   all the points in the exterior which are on the boundary of the interior.
然后,可以通过以下方法将其转化为多边形:

Take an initial polygon that consists of all the points in the edge set
Remove redundant vertices that lie along straight edges.

您可以使用整体填充方法从逐像素级别开始

Start in the corner, checking that it does have zero alpha.
Check the neighbours for zero alpha and iterate until we have no unchecked neighhours.
这将为图像提供一个遮罩,该遮罩将由两个简单连接的区域(内部和外部)组成

然后,您搜索的集合包括:

   all the points in the exterior which are on the boundary of the interior.
然后,可以通过以下方法将其转化为多边形:

Take an initial polygon that consists of all the points in the edge set
Remove redundant vertices that lie along straight edges.
我认为2D“Alpha形状”算法将是您的正确选择

Alpha形状可被视为“凸包”算法的推广,该算法允许生成更一般的形状

通过使用alpha形状,您可以通过更改alpha参数值来控制合成形状捕获的细节级别

您可以在此处尝试java小程序:

为了更好地了解该算法的作用。

我认为2D“Alpha形状”算法将是您的正确选择

Alpha形状可被视为“凸包”算法的推广,该算法允许生成更一般的形状

通过使用alpha形状,您可以通过更改alpha参数值来控制合成形状捕获的细节级别

您可以在此处尝试java小程序:


为了更好地理解这个算法的作用。

是的,在疯狂地打字时过早地按“回车”键——真是个傻瓜!在制作游戏和尝试检测对象之间的碰撞时,这是一个非常常见的问题。这是最常用的光线追踪法。我不明白。你想让你的“多边形”精确地表示任何不透明的东西吗?你用这个干什么?它只是为了画画还是别的什么?可能还有其他(可能更简单的)方法来做你需要的事情。@ananthonline是的,没错。正如你在我链接到的图片中所看到的,我基本上希望得到威士忌本身的“轮廓”,但不确定最好的方法!oldskool区域计算如何。考虑到这一点,你将不得不重写区域结构及其某些方法,但这些方法非常简单。是的,在疯狂键入时过早地按“回车”键-真是个傻瓜!在制作游戏和尝试检测对象之间的碰撞时,这是一个非常常见的问题。这是最常用的光线追踪法。我不明白。你想让你的“多边形”精确地表示任何不透明的东西吗?你用这个干什么?它只是为了画画还是别的什么?可能还有其他(可能更简单的)方法来做你需要的事情。@ananthonline是的,没错。正如你在我链接到的图片中所看到的,我基本上希望得到威士忌本身的“轮廓”,但不确定最好的方法!oldskool区域计算如何。鉴于此,您必须重写区域结构及其某些方法,但这些方法非常简单。我最近提交了一个二维alpha形状的C#实现。我最近提交了一个二维alpha形状的C#实现。