所有关于电路

在形状内部点

Kermit2

Kermit2

加入2010年2月5日
4,162
数学数学数学。

如果将两个坐标网格系统应用于它,这是一个简单的问题。
例如例子。边界内的一个点使用x和y坐标定义。保持y坐标相同,您将有两个边界坐标,其中一个小于x值中的点,x值更大。保持x坐标相同,您将有两个边界坐标,其中一个小于您的y值中的点,一个较大。
如果这两个条件并不是真的,那么点不在边界内。
对于一种更复杂的形状,例如逻辑内部具有较小圆的圆形变得更难,但可以用奇数或甚至更大的点的检查来完成。尽管如此,上面的规则将保持真实。
数学数学
MrAl

MrAl

加入2014年6月17日
8101年
你好,

Infinity算法是否真的有效?如果我理解你们,我不这么认为。
我认为它不可行的原因是,你可以用一个封闭曲面或一个开放曲面跨越边界偶数或奇数次。但正如我之前所建议的,你可以使用两种形状来检查你的算法:
1.一个开放的螺旋
2.封闭的螺旋

如果它适用于这两种形状,那么它可能适用于任何形状,只要您对螺旋形状太多(可具有一些直线或曲线)。

当然,最终测试正在使用带有一些闭腔的迷宫。如果你能从任何一点找到迷宫的方式,并确定你绝对不能从某些点离开迷宫,那么你可能有一个很好的算法。另一个迷宫内的迷宫是一个非常好的测试,其中第一个迷宫可以是第二次较大迷宫的任何地方,并且与第一迷宫接触或不与它接触,并且在任何起始室内。

一种可行的算法是在所有方向上生成有限长度的直线。不过,这可能要花很多时间。这将类似于洪水填充,但数学上不会相同,除非形状离散,这也带来了这个问题。

墙跟随......
另一种算法致意是遵循构成形状的线,同时跟踪形状上的原始起点。如果您可以圈回原始点,而无需制作任何“跳转”,那么必须进入测试点。开始,您将绘制水平线从点到“墙壁”中的一个水平线。交叉点将是墙上的起点。现在在墙壁周围和圆形之后,直到它到达终点(壁线突然末端),或者它导致到原始点。如果您来参数,您必须与原始起点和内部测试点的关系相同的方向,因此如果在开始时测试点是左侧,那么您必须始终在达到时向左转交界处。但是,如果您确实达到了交界处然后到达了终点,则必须在交界处重新返回并右转,然后再次遵循左手规则,除非您找到另一个交界处等。
示例:由管道连接的两个圆圈,其中一个圆圈可能是打开的,在已知的闭合圆内启动。从测试点绘制水平线到右侧的圆墙,因此在左侧测试点,如果您击中结处,请始终左转,然后按照结规则遵循结。在圆圈之后,然后虽然管道的一堵墙导致另一个圆圈,那么围绕那个圆圈,那么对于一个封闭的第二个圆圈我们会把它导致回到管道第二壁,然后回到原来的圆圈,然后返回原来的点,所以这里我们知道第二个圆圈也关闭,所以我们知道测试点在形状内。如果第二个圆圈是打开的,我们将最终在圆壁的末端结束,并且在我们身后没有连接点,这意味着第二个圆圈是打开的,所以点不在内部测试点右侧的起点看法。如果发生这种情况,那么我们必须返回测试点并开始沿另一个方向行进,并做同样的事情,但总是右转。如果太直到了终点,那么我们身后没有连接,那么测试点就没有。如果我们最终回到起点,那么它就在里面。
这只是一个快速的想法,所以可能需要更多的想法来获得工作,但到目前为止似乎完整。
例如,对于不触摸螺旋的较大圆内的开放螺旋,我们必须通过允许水平测试线延伸穿过形状的所有壁来创造另一个起点。我们可能必须有可能产生垂直测试线,或者在某些情况下,它可能使用垂直线更好地工作。

贫穷问题也出现了。为了加快算法,我们可能必须假设一些小步骤,然后对我们可以处理的形状的分辨率限制了限制。
最后的编辑:
WBAHN.

WBAHN.

加入2012年3月31日
26398年
数学数学数学。

如果将两个坐标网格系统应用于它,这是一个简单的问题。
例如例子。边界内的一个点使用x和y坐标定义。保持y坐标相同,您将有两个边界坐标,其中一个小于x值中的点,x值更大。保持x坐标相同,您将有两个边界坐标,其中一个小于您的y值中的点,一个较大。
如果这两个条件并不是真的,那么点不在边界内。
只有这种情况才能凸起的情况。看看TS发布的任何示例。看看我发布的例子。

对于一种更复杂的形状,例如逻辑内部具有较小圆的圆形变得更难,但可以用奇数或甚至更大的点的检查来完成。
您不需要在形状内具有形状来导致这种更复杂的情况。考虑下图。
Boundary.png
你描述的更复杂的形状是什么都不多的,没有推荐的边界交叉算法在#3中建议清除,除了你是四倍的计算量,因为你告诉他们向左检查到左边,向上,下来。您只需检查一个任意方向。
WBAHN.

WBAHN.

加入2012年3月31日
26398年
你好,

Infinity算法是否真的有效?如果我理解你们,我不这么认为。
我认为它不可行的原因是,你可以用一个封闭曲面或一个开放曲面跨越边界偶数或奇数次。但正如我之前所建议的,你可以使用两种形状来检查你的算法:
1.一个开放的螺旋
2.封闭的螺旋
如果形状打开,那么形状的形状没有“内部”检查 - 或者相当两个“内部”和“外部”是相同的。TS只是谈论封闭形状。


如果它适用于这两种形状,那么它可能适用于任何形状,只要您对螺旋形状太多(可具有一些直线或曲线)。

当然,最终测试正在使用带有一些闭腔的迷宫。如果你能从任何一点找到迷宫的方式,并确定你绝对不能从某些点离开迷宫,那么你可能有一个很好的算法。另一个迷宫内的迷宫是一个非常好的测试,其中第一个迷宫可以是第二次较大迷宫的任何地方,并且与第一迷宫接触或不与它接触,并且在任何起始室内。

一种可行的算法是在所有方向上生成有限长度的直线。不过,这可能要花很多时间。这将类似于洪水填充,但数学上不会相同,除非形状离散,这也带来了这个问题。

墙跟随......
另一种算法致意是遵循构成形状的线,同时跟踪形状上的原始起点。如果您可以圈回原始点,而无需制作任何“跳转”,那么必须进入测试点。开始,您将绘制水平线从点到“墙壁”中的一个水平线。交叉点将是墙上的起点。现在在墙壁周围和圆形之后,直到它到达终点(壁线突然末端),或者它导致到原始点。如果您来参数,您必须与原始起点和内部测试点的关系相同的方向,因此如果在开始时测试点是左侧,那么您必须始终在达到时向左转交界处。但是,如果您确实达到了交界处然后到达了终点,则必须在交界处重新返回并右转,然后再次遵循左手规则,除非您找到另一个交界处等。
[/引用]

嗯?

考虑一个正方形的正方形,对其左边说,并垂直居中。从右侧的点绘制水平线,直到击中正方形。现在绕着广场走到你回到起点。没问题,这是否意味着这一点必须在广场内?

如果从问题的点到任何顶点绘制一条线,那么您可以在从一个顶点移动到下一个顶点时扫除的角度。在绕过所有边界顶点后,您一旦完成围绕形状的跳闸,净角度将是0°或360°。如果前者那么你就在外面,如果你在里面的后者。但这是一种非常低效的算法,因为它要求您访问每个候选点的每个顶点。
MrAl

MrAl

加入2014年6月17日
8101年
你好再次,

是的,我已经提到过,这需要更多的想法,但是我认为墙跟随算法是一种更快方法的前兆。问题似乎是表面积之一,它具有n ^ 2复杂性,而边界仅具有n ^ 1复杂性。这似乎更快地让它变得更快。
例如,对于广场之外的点,我们将找到两条路径,而不仅仅是一个路径,而且两种方式都会使我们在相反方向上的相同路径周围。如果此逻辑被添加到墙壁后,则将消除分离的正方形。
授予这仍然需要更多的想法,但我讨厌必须扫描整个表面区域寻找一个墙壁中的一个洞,我不想承担任何类型的边界曲线,如所有直线。如果我们确实有直线,那么这将很快搜索,因为那么只有端点将是重要的。如果两侧由立方样条键组成,那么这也会有所帮助,使得它更快,但我不确定OP想要在这里施加什么,以及允许的形状和曲线。
WBAHN.

WBAHN.

加入2012年3月31日
26398年
是的,我已经提到过,这需要更多的想法,但是我认为墙跟随算法是一种更快方法的前兆。问题似乎是表面积之一,它具有n ^ 2复杂性,而边界仅具有n ^ 1复杂性。这似乎更快地让它变得更快。
复杂性声称的'n'是什么?要有意义,它必须是必须像在外部内部的点渐变的点数,否则它必须是边界定义中的点数。如果是区域与周长,那么如果大型广场的算法将不止于小广场的算法,则只有问题。已经提出的唯一算法(即我知道)将属于此类别的洪水填充算法,这是一个特别糟糕的方式。

例如,对于广场之外的点,我们将找到两条路径,而不仅仅是一个路径,而且两种方式都会使我们在相反方向上的相同路径周围。如果此逻辑被添加到墙壁后,则将消除分离的正方形。
如果点在广场内部,你就会发现两条路径,而不仅仅是一个,而且两种方式都会导致你沿着相反方向的相同路径。那么这有什么帮助。这是什么“独立式广场”?

授予这仍然需要更多的想法,但我讨厌必须扫描整个表面区域寻找一个墙壁中的一个洞,我不想承担任何类型的边界曲线,如所有直线。如果我们确实有直线,那么这将很快搜索,因为那么只有端点将是重要的。如果两侧由立方样条键组成,那么这也会有所帮助,使得它更快,但我不确定OP想要在这里施加什么,以及允许的形状和曲线。
TS实际上对允许的形状很明确。他说,他做的第一件事是将定义形状的点存储到一个数组中。再加上TS提供的图像,这意味着我们可以将讨论限制到由N条线段定义的封闭形状,这些线段连接二维平面中的N个点的有序集合。
MrAl

MrAl

加入2014年6月17日
8101年
你好,

感谢您澄清了形状是由一组点定义的。这肯定有帮助。OP是否也声明了直线连接也可以,或者使用类似三次样条的方法?这当然很重要。

至于你的第二段,对于广场之外的点,我们会发现两条路径遵循,因为它会发现水平线路测试中的两点:
1.组成正方形左边的直线上的一点
2.组成正方形右侧的直线上的一点。

而对于正方形内部的点,在右边只有一条线所以我们只能找到一个点那就是正方形右边的点。将进一步向右不会透露任何更多的点,除非广场也在另一个广场,但我们不会追求行认为,除非我们发现第一个平方是开放的地方,这将会导致一个终点,没有连接在我们身后。
这并不意味着算法完成但是,正如我试图明确的那样,但是你的思维是可能导致一个好的解决方案。当然,你总是可以自由寻找其他想法。

我提到的复杂性问题来自一个简单的观点,他们如何复杂地区是vs圆周(或边界)。对于每侧10点描述的方形,方形(包括边界)内部有100个点,边框本身只有38个点,比率为0.38。因此,边界比该区域更复杂。每侧100点,内部有10000点,内部398,比例为0.0398。每侧1000点,内部有1000000点,边框上有3998,比率为0.00398。所以边界大约是n * 4,而该区域是n ^ 2。因此,该比率约为4 / N,这意味着边界可以具有显着较少的点。
WBAHN.

WBAHN.

加入2012年3月31日
26398年
至于你的第二段,对于广场之外的点,我们会发现两条路径遵循,因为它会发现水平线路测试中的两点:
1.组成正方形左边的直线上的一点
2.组成正方形右侧的直线上的一点。

而对于正方形内部的点,在右边只有一条线所以我们只能找到一个点那就是正方形右边的点。将进一步向右不会透露任何更多的点,除非广场也在另一个广场,但我们不会追求行认为,除非我们发现第一个平方是开放的地方,这将会导致一个终点,没有连接在我们身后。
这并不意味着算法完成但是,正如我试图明确的那样,但是你的思维是可能导致一个好的解决方案。当然,你总是可以自由寻找其他想法。
我想我需要看到你想要传达的东西的图表,因为我只是没有看到它通过单词来看待它。

我提到的复杂性问题来自一个简单的观点,他们如何复杂地区是vs圆周(或边界)。对于每侧10点描述的方形,方形(包括边界)内部有100个点,边框本身只有38个点,比率为0.38。因此,边界比该区域更复杂。每侧100点,内部有10000点,内部398,比例为0.0398。每侧1000点,内部有1000000点,边框上有3998,比率为0.00398。所以边界大约是n * 4,而该区域是n ^ 2。因此,该比率约为4 / N,这意味着边界可以具有显着较少的点。
But this is only applicable if you are going to examine every point -- and it also requires a Manhattan geometry (i.e., strictly vertical or horizontal border segments) -- which means something akin to the flood fill approach which everyone has been saying NOT to use.
cmartinez.

cmartinez.

2007年1月17日加入
7299年
多年前我在Lisp中写了一个程序,以解决同一问题。最简单的方法是将涉及的形状与向量分开。将形状的每一侧转换成载体,并分析所载体的左侧或右侧的点是否位于每个载体的左侧或右侧,这也取决于分析之前的前向量的角度(它是更多或小于180°)?)。

提示:诀窍在于考虑导致矢量乘法的标志。

如果两边都是拱门,就必须考虑一个特殊的函数,但最终仍然是相同的问题和相同的解决方案。

需要我多说?
WBAHN.

WBAHN.

加入2012年3月31日
26398年
我不确定,但我认为一部分你所说的(关于考虑矢量乘法的迹象的部分)正在处理两条线段是否相交。如果您使用两个向量(从段开始到段开始的边界段和向量到所讨论的点),那么拍摄横向产品将为您提供z方向的向量,其符号取决于边界矢量的哪一侧点是开启的。然后,您可以使用已知在形状之外的终点重复。如果两个Z矢量具有相反的标志,则两个端点位于边界矢量的相对侧。但这是不够的,看他们是否相交。您必须使用源自问题的线段重复该过程,以查看边界矢量的两个端点是否在相对侧。如果是这样,那么两段相交。

所以有四个叉乘需要取,但是二维的叉乘不是很麻烦因为它们只涉及两次乘法和一次加法。
cmartinez.

cmartinez.

2007年1月17日加入
7299年
我记得我写这个程序的方法是分析(假设没有邻边的多边形之间的角大于180°,作为第一种方法),如果点总是向每个矢量的左边(如果形状是逆时针绘制的)或向右边(如果形状是顺时针绘制的)。这就是为什么把之前的向量和现在的向量相乘很重要。由此产生的符号会告诉你相对于前一边,这一边是向左转还是向右转。
如果形状的侧面的角度大于180°,那么分析将在被处理的侧面反向进行。但逻辑本质上是一样的。
当然,必须满足的第一个条件是确定所涉及点的包络形状在几何上是否被定义为封闭的。
WBAHN.

WBAHN.

加入2012年3月31日
26398年
我记得我写的那样,程序涉及分析(假设没有与它们之间的角度大于180°的多边形的相邻边,作为第一种方法)
啊,但这是一个关键,无效,假设!如果该假设保持,则形状为凸,如帖子#3所指出的那样,您可以大大简化过程。但有问题的形状不一定是凸。

如果形状的侧面的角度大于180°,那么分析将在被处理的侧面反向进行。但逻辑本质上是一样的。
我不太相信这个。我得想一想。在我的脑海中,我想到的是一堵曲折的墙,以及如何扭转事情将产生预期的结果。我不相信它会。
cmartinez.

cmartinez.

2007年1月17日加入
7299年
…我不太相信这个。我得想一想。在我的脑海中,我想到的是一堵曲折的墙,以及如何扭转事情将产生预期的结果。我不相信它会。
让我看看我上个世纪的代码,我会带着一个更有说服力的答案回来。
cmartinez.

cmartinez.

2007年1月17日加入
7299年
好吧,我的朋友。我一直很喜欢一个很好的挑战,特别是在我的领域应该擅长。:凉爽的:让我们希望在这里没有说些傻瓜......:翻白眼:


这是我多年前的算法。

限制:
  1. 该形状仅由直线组成。可以使用相同的算法处理带拱形(或凸起,因为我们呼叫呼叫的凸起),但可以使用相同的算法进行处理,但需要额外的步骤。
  2. 这个形状没有相交的边。否则,形状中的“岛屿”就会被创造出来,事情就会变得非常混乱。

让我们从这种形状开始,有一些积分用于分析:

s01.jpg.

步骤1:确定形状是否是顺时针或逆时针绘制的。通过首先选择任意顶点,然后将所有边块转换为向量,这很容易完成,如图所示。

s02.jpg.
然后,我们将第一个向量乘以第二个向量,然后将第二个是第三的第二个向量,以及第三个,第三,等等。最后,我们添加了这些乘法的所有结果,并因此添加了结果的迹象将告诉我们它被绘制的方向。

第二步:对于每一个被分析的点,在形状中找到离那个点最近的边。从垂直于这条边的点画一个向量。

s03.jpg.

第三步:将点对右向量乘以其对应最接近的侧向向量。结果的标志会告诉您点是否在形状内或外部,取决于形状是否顺时针绘制或逆时针绘制。

你现在被说服了吗?: D
最后的编辑:
MrAl

MrAl

加入2014年6月17日
8101年
我想我需要看到你想要传达的东西的图表,因为我只是没有看到它通过单词来看待它。



But this is only applicable if you are going to examine every point -- and it also requires a Manhattan geometry (i.e., strictly vertical or horizontal border segments) -- which means something akin to the flood fill approach which everyone has been saying NOT to use.

你好再次,

是的,我想你还没有明白基本的程序。我也不确定你怎么能把下面的墙等同于洪水。
授予它可能需要更多的想法,但这种方法不会对这种形状进行任何限制。
BTW,“连接点”是双面连接的点,例如用相交的两个圆圈制成的形状。这两个圆圈将有两个接线点,除非它们的尺寸与完全相同的位置相同。
我会尽力待办事获一些图纸。
WBAHN.

WBAHN.

加入2012年3月31日
26398年
我想我同意这是有效的,但它看起来比以前描述的算法非常不同。在该算法中,如果在给定顶点的角度超过180°,则讨论了逆转事物,但在这里,您根本没有提到任何内容。

此外,步骤2似乎计算得昂贵。一旦你知道一个给定点最接近的矢量,与正常矢量到它并不是太糟糕,但是在确定它最接近的矢量是多少计算涉及多少计算那么最近的边界矢量的正常矢量根本没有与边界段相交的点呢?你如何处理那些?
WBAHN.

WBAHN.

加入2012年3月31日
26398年
你好再次,

是的,我想你还没有明白基本的程序。我也不确定你怎么能把下面的墙等同于洪水。
我对洪水填充的点与跟随墙没有什么关系,它与使用边界的声明是o(n),并且与该区域一起工作是o(n²)。这适用于洪水填充算法。它不适用于任何其他算法,例如计算从候选点到“无穷大”的边界段的数量,这是建议的。