我有两个形状,它们是一个通道的横截面。我想计算两个定义点之间的中间点的横截面。 在这种情况下使用的最简单(相对简单?)算法是什么?
P.S。:我遇到了几种算法,如自然邻居和泊松,这看起来很复杂。我正在寻找一个可以快速实施的简单解决方案。
编辑:我从标题中删除了“最简单”这个词,因为它可能会产生误导
答案 0 :(得分:3)
这很简单:
更简单:
我想这第二个建议可能过于简单,但我敢打赌,没有人建议更简单的建议!
OP的评论后编辑:(重新评论太多了)
嗯,你确实要求一个简单的方法!我不确定我会像你一样看到第一种方法的问题。如果横截面不是太奇怪(可能是最好的,如果它们是凸多边形)并且你没有做任何奇怪的事情,例如将一个横截面的左侧映射到另一个横截面的右侧(从而强制许多交叉线)那么该方法应该产生某种明显的横截面。在你建议使用三角形和矩形的情况下,假设三角形位于其底部,顶部有一个顶点。将点指向,例如,矩形的左上角,然后围绕连接相应点的两个横截面的边界以相同的方向(顺时针或逆时针)前进。我没有看到任何交叉线,我看到两个横截面之间任何距离都有明确的形状。
答案 1 :(得分:1)
请注意,您可能需要解决的高性能标记答案存在一些含糊之处,并将定义其方法输出的质量。最重要的一点是,当你在两个横截面上绘制n
点时,你在它们之间确定了什么样的对应关系,即如果你按照高性能标记建议的那样做,那么标签的顺序这些要点变得很重要。
我建议同时通过两个横截面旋转(正交)平面,然后在一个横截面上与该平面相交的点集合只需要与在另一个横截面上与该平面相交的点集合匹配。假设这些集合中的点数没有限制,但它确实降低了原始情况下对应问题的复杂性。
答案 2 :(得分:1)
以下是对此问题的另一种尝试,我认为这是一次更好的尝试。
给出两个横截面C_1
,C_2
将每个C_i
放入具有坐标系(x,y)
的全局参考框架中,以便它们相对位置的方式有意义。将每个C_i
拆分为上下曲线U_i
和L_i
。我们的想法是,您需要不断将曲线U_1
变为U_2
和L_1
变为L_2
。 (注意,如果您愿意,可以扩展此方法以将每个C_i
拆分为m
曲线。)
这样做的方法如下。对于每个T_i = U_i, or L_i
样本n
点,并确定插值多项式P{T_i}(x)
。正如下面适当注意到的那样,插值多项式易受振荡影响,特别是在端点处。代替内插多项式,可以改为使用最小二乘拟合多项式,这将更加稳健。然后将多项式P{U_1}(x) = a_0 + a_1 * x + ... + a_n * x^n
到P{U_2}(x) = b_0 + b_1 * x + ... + b_n * x^n
的变形定义为Q{P{U_1},P{U_2}}(x, t) = ( t * a_0 + (1 - t ) b_0 ) + ... + (t * a_n + (1-t) * b_n ) * x^n
,其中变形Q
定义在0<=t<=1
上t
定义哪一点t=0
变形在(U_2
我们在t=1
和U_1
我们在t
而在每一个Q{P{L_1},P{L_2}}(x, t)
我们处于一定的连续变形两个。)
t
完全相同。这两个变形构成了两个横截面之间的连续表示,您可以在任何{{1}}处进行采样。
注意所有这一切实际上是对两个横截面的插值多项式的系数进行线性插值。另外请注意,在划分横截面时,您应该设置必须在匹配的端点处拆分的约束,否则在变形中可能会出现“洞”。
我希望那清楚。
编辑:解决了插值多项式中的振荡问题。