所有关于电路

形状内的点

cmartinez

cmartinez

2007年1月17日加入
7303年
你说过如果一个给定顶点的角度大于180°,就会反转,但这里你一点也没提到。
实际上,它是隐式存在的。当你用小于180度的向量表示两边时,结果与大于180度的向量的符号不同。事实上,你可以只是加法角度每个顶点的多边形(但对于那些超过180°的角度我们会减去角的值从180°,从而获得一个负值),最后得到你想要的,这是一个信号,代表着画多边形的方向。

如果法向量和最近的边界向量没有相交的点呢?你如何处理这些问题?
你只要假设所有的边都是无限长的,然后把它们定义为线性方程。与被分析点的90°交点可能在直线的界限之外,但这并不重要。我不认为这个方法对计算要求太高。通过将每边定义为线性方程,你有这条线的斜率,因此1 / m为垂直相交线的斜率。计算被分析点的那条边的交点是轻而易举的事。对于CPU来说,更困难的是计算该点与每条线之间的距离(但它只涉及一堆平方根),然后找到最小值。再一次…(我想不出比这更有效的方法了。)

编辑:我也认为向量乘法在计算上要比通过三角函数求出每个顶点上的每个角的值容易得多。
最后的编辑:
WBahn

WBahn

2012年3月31日加入
26398年
你只要假设所有的边都是无限长的,然后把它们定义为线性方程。与被分析点的90°交点可能在直线的界限之外,但这并不重要。我不认为这个方法对计算要求太高。通过将每边定义为线性方程,你有这条线的斜率,因此1 / m为垂直相交线的斜率。计算被分析点的那条边的交点是轻而易举的事。对于CPU来说,更困难的是计算该点与每条线之间的距离(但它只涉及一堆平方根),然后找到最小值。再一次…(我想不出比这更有效的方法了。)
计算1/m(即使用除法)在计算上是昂贵的。计算从每个点到每条线的距离在计算上是很昂贵的。

为什么只考虑有可能与直线相交的边界线段,然后只做涉及加法和乘法的运算来确定它们是否相交?
WBahn

WBahn

2012年3月31日加入
26398年
有一种情况困扰着我:

Border.png

我们假设所有其他的边线距离这两个点都比A或B远得多。

两个点都比向量B更接近向量A,但是在它的对边。所以当我们乘(我一直以为你的意思是矢量叉积)之间的正常的向量会得到相反的结果标志,表明一个是内部的形状,另一个是外部的形状,显然他们都是要么内部或外部。
cmartinez

cmartinez

2007年1月17日加入
7303年
有一种情况困扰着我:

查看附件88785

我们假设所有其他的边线距离这两个点都比A或B远得多。

两个点都比向量B更接近向量A,但是在它的对边。所以当我们乘(我一直以为你的意思是矢量叉积)之间的正常的向量会得到相反的结果标志,表明一个是内部的形状,另一个是外部的形状,显然他们都是要么内部或外部。
你是对的…我好像犯了个错误,我说:
与被分析点的90度交点很可能位于
在界限之外,但也没什么大不了的。
我们加上这个规则。如果与给定直线最近的交点在其边界之外,则丢弃该交点并使用第二最近的直线。在这种情况下,对于点C来说,它是向量B,对于点D来说,它是A和B之外的另一条线,但如果不存在与该点相交的直线,那么这一点肯定在形状之外。
但我确定,如果点在多边形内,就会有总是是最近直线的界限内的垂直交点。

当我解释你的“计算昂贵”的表达式时,我以为你指的是三角函数或递归计算....是的,除法和平方运算(这里不需要平方根,现在我想起来了)在计算上是昂贵的,例如,当你将它们与简单的加法、减法或位移进行比较时。
我认为在这个应用中不需要平方根的原因是我们实际上并不是在求从点到边的距离的确切值,而是一组中最小的值。如果我们不计算平方根就无关紧要了。

我想测试我所说的真实性的唯一方法就是写代码,然后在你选择的CAD软件中进行测试。o_O
WBahn

WBahn

2012年3月31日加入
26398年
你是对的…我好像犯了个错误,我说:


我们加上这个规则。如果与给定直线最近的交点在其边界之外,则丢弃该交点并使用第二最近的直线。在这种情况下,对于点C来说,它是向量B,对于点D来说,它是A和B之外的另一条线,但如果不存在与该点相交的直线,那么这一点肯定在形状之外。
现在看来,我们完全违背了这一点。我们不仅要确定到每个边界段的距离,还必须检查它们是否真的相交(从最近的开始算,直到我们找到一个相交的)。

但我确定,如果点在多边形内,就会有总是是最近直线的界限内的垂直交点。
真的吗?这条怎么样:

Border2.png

哪个边界段与红点垂直,红点与界限内的线相交?

现在要加入什么特殊规则?

当我解释你的“计算昂贵”的表达式时,我以为你指的是三角函数或递归计算....是的,除法和平方运算(这里不需要平方根,现在我想起来了)在计算上是昂贵的,例如,当你将它们与简单的加法、减法或位移进行比较时。
我认为在这个应用中不需要平方根的原因是我们实际上并不是在求从点到边的距离的确切值,而是一组中最小的值。如果我们不计算平方根就无关紧要了。

我想测试我所说的真实性的唯一方法就是写代码,然后在你选择的CAD软件中进行测试。o_O
再一次,让我们看看我一直推荐的方法(并不是说它是最有效的方法)。

Border3.png

根据每一个端点的最低y坐标对分段进行排序。同时,确定任何线段(黄线)的最右横坐标。设置一个常数等于该点的x坐标加上任意数量:XMAX = (max x坐标)+ 1。

线段的顺序可能是上面所示的字母顺序(有两组四线段,{C,D,E,F}和{M,N,O,P},它们具有相同的最低y坐标,所以我们假设它们是随机排列的。

我们现在想知道红点是否在多边形内。所以我们构建一条水平的绿色线段它从这一点开始到黄线右边的任意一点结束。这个段的构造非常简单,几乎没有计算成本。如果点的坐标是,则段的另一端的坐标是

我们现在过滤我们的一组边界线段,以找到那些可能与绿色线段相交的部分。我们首先截断从第一个线段开始的集合它的最低y坐标在绿色线段上面,也就是线段j。因为我们可以对它进行二分查找,代价是O(log(n))其中n是边界线段的数量。此外,每个测试都是对一个值的简单比较,因此每一步的成本很低。

这给我们留下了列表{A,B,C,D,E,F,G,H,I}。

我们现在遍历这个列表,消除第二个坐标也在线段下面的所有点。即使我们必须遍历整个列表,这也是一个简单的比较。

这样就只剩下{H,I}了。

我们知道消去任意x坐标都在候选点左边的点。这涉及到两种比较。

这样就只剩下{I}了。

这三个步骤都可以很容易地组合起来,尽管这意味着对有序的边界段进行线性搜索,但我们基本上必须在第二步中这样做。

一旦我们有了最后一组边界线段,我们只需要数一下有多少与绿线相交。这里的第一步是计算每一个x坐标都在候选点右边的点,因为我们知道它们必须与绿色线段相交。这就从集合中去掉了段I,在这一点上我们做完了。如果我们的计数是奇数,那么我们知道点在形状内。

如果仍然有任何坐标点在左边,这几乎总是一个小集合,因为它要求一个端点在左边,另一个在右边,我们可以对每个线段执行交点检查。每一个都需要4个叉积,每一个都需要2次乘法和1次加法。但是我们的过滤使得我们只需要执行其中一个——即决定候选点是否在边界段的左边的那个。如果是,那么边界线段与绿色线段相交如果不是,则不相交。

我们可以让事情变得更简单,因为我们实际上不需要计算交叉点,然后确定总数是奇数还是偶数,我们只需要初始化一个布尔变量,将“within”设为FALSE,并在每次识别出与绿线相交的边界段时切换它。

这里没有涉及的唯一一件事是处理一个(或两个)候选点坐标与一个边界段的座标值完全匹配的特殊情况。


我们
cmartinez

cmartinez

2007年1月17日加入
7303年
现在看来,我们完全违背了这一点。我们不仅要确定到每个边界段的距离,还必须检查它们是否真的相交(从最近的开始算,直到我们找到一个相交的)。



真的吗?这条怎么样:

查看附件88791

哪个边界段与红点垂直,红点与界限内的线相交?

现在要加入什么特殊规则?



再一次,让我们看看我一直推荐的方法(并不是说它是最有效的方法)。

查看附件88792

根据每一个端点的最低y坐标对分段进行排序。同时,确定任何线段(黄线)的最右横坐标。设置一个常数等于该点的x坐标加上任意数量:XMAX = (max x坐标)+ 1。

线段的顺序可能是上面所示的字母顺序(有两组四线段,{C,D,E,F}和{M,N,O,P},它们具有相同的最低y坐标,所以我们假设它们是随机排列的。

我们现在想知道红点是否在多边形内。所以我们构建一条水平的绿色线段它从这一点开始到黄线右边的任意一点结束。这个段的构造非常简单,几乎没有计算成本。如果点的坐标是,则段的另一端的坐标是

我们现在过滤我们的一组边界线段,以找到那些可能与绿色线段相交的部分。我们首先截断从第一个线段开始的集合它的最低y坐标在绿色线段上面,也就是线段j。因为我们可以对它进行二分查找,代价是O(log(n))其中n是边界线段的数量。此外,每个测试都是对一个值的简单比较,因此每一步的成本很低。

这给我们留下了列表{A,B,C,D,E,F,G,H,I}。

我们现在遍历这个列表,消除第二个坐标也在线段下面的所有点。即使我们必须遍历整个列表,这也是一个简单的比较。

这样就只剩下{H,I}了。

我们知道消去任意x坐标都在候选点左边的点。这涉及到两种比较。

这样就只剩下{I}了。

这三个步骤都可以很容易地组合起来,尽管这意味着对有序的边界段进行线性搜索,但我们基本上必须在第二步中这样做。

一旦我们有了最后一组边界线段,我们只需要数一下有多少与绿线相交。这里的第一步是计算每一个x坐标都在候选点右边的点,因为我们知道它们必须与绿色线段相交。这就从集合中去掉了段I,在这一点上我们做完了。如果我们的计数是奇数,那么我们知道点在形状内。

如果仍然有任何坐标点在左边,这几乎总是一个小集合,因为它要求一个端点在左边,另一个在右边,我们可以对每个线段执行交点检查。每一个都需要4个叉积,每一个都需要2次乘法和1次加法。但是我们的过滤使得我们只需要执行其中一个——即决定候选点是否在边界段的左边的那个。如果是,那么边界线段与绿色线段相交如果不是,则不相交。

我们可以让事情变得更简单,因为我们实际上不需要计算交叉点,然后确定总数是奇数还是偶数,我们只需要初始化一个布尔变量,将“within”设为FALSE,并在每次识别出与绿线相交的边界段时切换它。

这里没有涉及的唯一一件事是处理一个(或两个)候选点坐标与一个边界段的座标值完全匹配的特殊情况。


我们
我…讨厌……你……: D

说真的,我会仔细研究你刚才说的所有内容,明天给你答复……与此同时,晚安……
WBahn

WBahn

2012年3月31日加入
26398年
我…讨厌……你……: D

说真的,我会仔细研究你刚才说的所有内容,明天给你答复……与此同时,晚安……
哈哈!

让我们的想法受到批评和挑战是改进它们的最好方法之一,尽管并不总是最令人愉快的。
cmartinez

cmartinez

2007年1月17日加入
7303年
好吧……我回来了。刚刚休息和恢复精神。

事情是这样的。我只是知道我的算法之所以有效,是因为我在许多年前就写了它,并且我广泛地使用了它一段时间。但似乎……嗯哼…我放错了地方我到处都找不到。所以现在我试着重建它。
据我所知,第一部分是找出多边形的绘制方向。至少,这是有效的。现在我要更深入地思考,因为计算点是在形状内部还是外部需要一两个步骤,并且没有丑陋特殊的例外在它的逻辑。可能我犯的错误是使用多边形的面作为参考,而不是它的顶点,或者两者都使用。我得想想看。

当我完成后,我会再发布一遍,让你评估……看看你能不能在上面戳个洞……但请注意,我会把它做成防水防弹的: D。然后我们可以比较它和你的算法的效率。
cmartinez

cmartinez

2007年1月17日加入
7303年
我并没有忘记这个小小的挑战W,只是我当时被工作压得喘不过气来,还没有时间想清楚……但是让我告诉你,我认为关键在于选择离这个点最近的点,从这个点到这个点画一条线(矢量),然后推断这个点在栅栏的哪一边。
几乎可以肯定的是,所涉及的计算并不复杂。
WBahn

WBahn

2012年3月31日加入
26398年
我并没有忘记这个小小的挑战W,只是我当时被工作压得喘不过气来,还没有时间想清楚……但是让我告诉你,我认为关键在于选择离这个点最近的点,从这个点到这个点画一条线(矢量),然后推断这个点在栅栏的哪一边。
几乎可以肯定的是,所涉及的计算并不复杂。
无论你何时找到它,它都会在这里等着你。对于你在这里给出的描述,我脑海中已经有了一个反例,尽管我只是在脑海中有一个画面,所以它可能相关,也可能不相关。
br - 549

br - 549

2013年9月22日加入
4938年
假设您可以检测点和边界之间的差异,为什么不在图像区域上放置一个x-y轴。

记录在轴上和与轴相交的点和边界数据。

根据分辨率稍微旋转图像。

记录横轴和与轴相交的点和边界数据。

根据分辨率稍微旋转图像。

到90度。

现在我完全不知道自己在说什么。但我认为我们有强大的图像能力.....这并不困难。
cmartinez

cmartinez

2007年1月17日加入
7303年
假设您可以检测点和边界之间的差异,为什么不在图像区域上放置一个x-y轴。

记录在轴上和与轴相交的点和边界数据。

根据分辨率稍微旋转图像。

记录横轴和与轴相交的点和边界数据。

根据分辨率稍微旋转图像。

到90度。

现在我完全不知道自己在说什么。但我认为我们有强大的图像能力.....这并不困难。
如果你能解释一下图形化,正如你所说的....
br - 549

br - 549

2013年9月22日加入
4938年
当轴放置在图像上时,它将创建四个数组的第一列。- x, x, y - y。

轴的比例,将取决于分辨率。旋转步骤(数组列)也是如此。

经过90度扫描后,您将得到4个原始数据数组。

首先要做的是清除误报。当你走向中心时,你会得到误报,因为弧长和像素直径的变化。

当您查看RAW数据列..............图像外面的一个点看起来像一个点。

当你走到图像的中心时,这些点将以弧的形式出现。真正的点在圆弧中心。弧的长度与到原点的距离有关。这就是检查弧线是否有一个或两个点的方法。

如果你知道像素直径和到原点的距离,这个噪声就可以被清除,中心区域的精确点就可以被知道。这个pixeldiameter - distanceorigin常数将应用于每个数据点。不是边界点。

现在你有了图像的四象限数组。通过注意列中的边界,您可以确定内凹与外凹。

这工作吗?
最后的编辑:
WBahn

WBahn

2012年3月31日加入
26398年
当轴放置在图像上时,它将创建四个数组的第一列。- x, x, y - y。

轴的比例,将取决于分辨率。旋转步骤(数组列)也是如此。

经过90度扫描后,您将得到4个原始数据数组。

首先要做的是清除误报。当你走向中心时,你会得到误报,因为弧长和像素直径的变化。

当您查看RAW数据列..............图像外面的一个点看起来像一个点。

当你走到图像的中心时,这些点将以弧的形式出现。真正的点在圆弧中心。弧的长度与到原点的距离有关。这就是检查弧线是否有一个或两个点的方法。

如果你知道像素直径和到原点的距离,这个噪声就可以被清除,中心区域的精确点就可以被知道。这个pixeldiameter - distanceorigin常数将应用于每个数据点。不是边界点。

现在你有了图像的四象限数组。通过注意列中的边界,您可以确定内凹与外凹。

这工作吗?
坦白说,这听起来纯粹是胡言乱语。但如果你通过一个玩具例子,你可能会清楚自己想要做什么,并且让我们考虑是否有任何明显的反例会让它受挫。
br - 549

br - 549

2013年9月22日加入
4938年
好的。对不起,我不知道这个话题的正确术语。看看TS的第一张图片。假设数据点的大小是相同的,边界是连续的,and假设您可以检测边界点和数据点之间的差异,......在感兴趣的区域内选择一个原点。在上面放一个x,y轴。

以一个取决于点大小(或密度)的样本速率(样本长度在轴上),在轴下取样本。

这将给你四个值列表,x列表,y列表,-x列表和-y列表。这些值在轴的下面或与轴相交。这个值只能是三个东西中的一个。

什么都没有,点或边界。这个列表将是四个数组中值的第一列。

现在,找到距离原点最远的数据点。内部或外部…最远的一个。

调整旋转步长,使它需要两次点击才能看到离群值(最远的数据点),而不是三次。

现在回到第一个样本。

现在旋转图像一键,而不是轴。Re-sample。这将给我们提供4个列数组(列是点击)到90度。

如果你把0赋值给Nothing, 1赋值给Point, 2赋值给Boundary,然后输出数组,不管图像是什么,你都会看到失真的模式。它将显示,总是有更多的数据点在中心(打印输出的顶部)。因为这种变形是由旋转引起的,所以应该很容易量化和消除。

我认为这可以在像素尺度上实现。我觉得四分之一转比全扫描要快。

这对每个人来说还是胡言乱语吗?
WBahn

WBahn

2012年3月31日加入
26398年
好的。对不起,我不知道这个话题的正确术语。看看TS的第一张图片。假设数据点的大小是相同的,边界是连续的,and假设您可以检测边界点和数据点之间的差异,......在感兴趣的区域内选择一个原点。在上面放一个x,y轴。
你马上就有问题了。整个目标是能够确定一个点是在感兴趣的区域内还是外,因此,你如何在感兴趣的区域内选择一个原点?

以一个取决于点大小(或密度)的样本速率(样本长度在轴上),在轴下取样本。
这些点是没有物理范围的数学点。那么如何设置采样率呢?设定好后,“轴下采样”是什么意思?

再一次,一个你走过的玩具问题的图片将非常有助于弄清楚你在说什么。

这将给你四个值列表,x列表,y列表,-x列表和-y列表。这些值在轴的下面或与轴相交。这个值只能是三个东西中的一个。

什么都没有,点或边界。这个列表将是四个数组中值的第一列。

现在,找到距离原点最远的数据点。内部或外部…最远的一个。

调整旋转步长,使它需要两次点击才能看到离群值(最远的数据点),而不是三次。

现在回到第一个样本。

现在旋转图像一键,而不是轴。Re-sample。这将给我们提供4个列数组(列是点击)到90度。

如果你把0赋值给Nothing, 1赋值给Point, 2赋值给Boundary,然后输出数组,不管图像是什么,你都会看到失真的模式。它将显示,总是有更多的数据点在中心(打印输出的顶部)。因为这种变形是由旋转引起的,所以应该很容易量化和消除。

我认为这可以在像素尺度上实现。我觉得四分之一转比全扫描要快。

这对每个人来说还是胡言乱语吗?
差不多。

即使我理解了你说的所有内容,这听起来也是非常需要计算的。你要反复旋转图像,这可不便宜。