【问题标题】:I have a point cloud with 4 points (a Polygon, all points in the same plane) in 3D space. How can I calculate the points between them?我在 3D 空间中有一个带有 4 个点(一个多边形,所有点在同一平面上)的点云。如何计算它们之间的点?
【发布时间】:2017-05-11 11:38:07
【问题描述】:

我有一个 4 点的点云。这是它在文件 cloud.xyz 中的样子:

334776.097 5691271.082 38.832
334780.919 5691274.153 39.100
334780.919 5691274.153 39.140
334776.097 5691271.082 39.028

这些点都在同一个平面上,它是一个多边形。一个有 4 个顶点的多边形。

如何计算这 4 个顶点之间的点,以便将它们添加到点云中。

例如:

X 是 4 个顶点。 O 是新的计算点

从这里:

      X              X





X        X

到这里:

      XOOOOOOOOOOOOOOX
     OOOOOOOOOOOOOOO
    OOOOOOOOOOOOOO
   OOOOOOOOOOOOO
  OOOOOOOOOOOO
 OOOOOOOOOOO
XOOOOOOOOX

我不知道该怎么做。我想用扫描线填充算法来做到这一点,但是这个算法只适用于 2D 中的点,而不是 3D 空间。

编辑:伙计们,对不起。我在 3D 空间中也有具有 3、5、6 或更多顶点的多边形。

【问题讨论】:

  • 你是什么意思:“计算这 4 个顶点之间的点”。因为我们在真实空间中,所以任意两点之间有无限多的点。那么,您是否想要网格细化之类的东西,或者您想要在这个四边形中选择的点数是多少。其次,如果将点投影到平面上,那是 2D 问题,还是为什么需要 3D 空间?
  • 这 4 个点在一个平面上,但这个平面是在 3D 空间中。我有更多这 4 个点平面/多边形。 “计算这 4 个顶点之间的点”是指它们之间的点。我不关心每个点之间的距离。我知道可以有无限多的点,但我只需要一个栅格。我以后可以改变的距离,那应该不是问题。
  • 3d 案例没有光栅。你打算如何处理“所有点”?

标签: 3d geometry polygon point-cloud-library point-clouds


【解决方案1】:

让我们假设你想在给定的(希望是凸的)四边形 Q(A,B,C,D) 上的规则网格上分布 k 个点,这些点按 CCW 顺序给出。我们形成两个归一化方向向量 pAD=D-A/|D-A| pBC=C-B/|C-B|。现在使用这两个方向向量,我们跨越大小为 k=sqrt(k)*sqrt(k) 的规则网格。因此,我们为网格段定义起点和终点:让 Si = A + i * pAD * |D-A|/sqrt(k) 和 Ei = B + i * pBC * |C-B|/sqrt(k) 我们使用整数在 0

对于每个元组 (Si,Ei),我们再次计算从 S 到 E 的归一化方向向量:pSEi = Ei-Si/|Ei-Si|。现在我们可以遍历第 i 个网格线段并计算每个网格线的 sqrt(k) 点: 像上面一样,我们使用: pij = Si + j * pSEi * |Ei-Si|/sqrt(k) 其中对于 j,我们使用 0

只要你的四边形 Q 是凸的,这将给你总共 k 个位于规则网格上的点。


编辑:这种方法也适用于三点。一个用作初始方向向量 pAB 和 pAC ,然后三角形中使用的点必须在某种意义上按比例放大,即远离点 A 的第 i 次迭代将在其行中有 i 个点,我们让 i 在0ok 缩放。

对于超过 4 个点,这个网格必须有多精确是个问题。一种方法是我们采用封闭的凸四边形甚至 AABB Q。然后我们使用上述方法,但添加一个常数 C 并计算网格中的 C*k 个点。此外,我们为添加的每个点应用多边形测试中的一个点。 只要所讨论的多边形只有恒定数量的顶点:这种方法在 O(k) 时间内运行。

【讨论】:

  • 如果我的多边形有 3、5、6 或更多顶点怎么办?在我的问题中查看我的编辑。
【解决方案2】:

最简单的方法是实现双线性插值。在数学上,这是通过以下向量方程完成的

四个任意点都有坐标

A = (x_A,y_A,z_A)
B = (x_B,y_B,z_B)
C = (x_C,y_C,z_C)
D = (x_D,y_D,z_D)

然后循环两个标量值ts,范围从01,每个值都有nm 间隔。喜欢t = (i-1)/(n-1)i=1..n

下面的伪代码应该可以做到这一点

' Makes n×m points interpolated between A,B,C,D
' This will include the original points as
'   point(1,1) = A
'   point(n,1) = B
'   point(1,m) = C
'   point(n,m) = D

' Check if vectors AB and CD are pointing on the same direction (sense)
' Swap one of the vectors otherwise.
If InnerProduct(Vector(A,B),Vector(C,D))<0 Then
    Swap(C,D)
End If

' Define interpolation points based on a n×m grid
For i=1 to n
  t = (i-1.0)/(n-1.0)   ' NOT integer division
  T = Lerp(A,B,t)
  Y = Lerp(C,D,t)
  For j=1 to m
    s = (j-1.0)/(m-1.0)
    point(i,j) = Lerp(T,Y,s)
  Next j
Next i

Function Lerp(Q As Point,P as Point ,g as Float) As Point
    Lerp.x = (1-g)*Q.x + g*P.x
    Lerp.y = (1-g)*Q.y + g*P.y
    Lerp.z = (1-g)*Q.z + g*P.z
End Function

Function Vector(Q As Point,P as Point) As Point
    Vector.x = P.x - Q.x
    Vector.y = P.y - Q.y
    Vector.z = P.z - Q.z
End Function

Function InnerProduct(Q as Point, P as Point) as Float
    InnerProduct = Q.x*P.x+Q.y*P.y*Q.z*P.z
End Function

注意: 从任意 4 个点(不需要在平面内)选择两对具有相同意义的对。例如点 ABCD 如果成对选择 AB如果以下为真(B-A)·(D-C)&lt;=0,则 em> 和 CD 可能有错误的含义。 · 是内积,因为 ABCD 是向量(数组)数量。如果感觉是错误的,然后翻转一对。然后拿ABDC

【讨论】:

  • 如果我的多边形有 3、5、6 个或更多顶点怎么办?在我的问题中查看我的编辑。
  • 那么你手头有一个更大的问题。询问Mathematics是否有既定程序。本质上,您正在对由多边形修剪的表面进行网格划分。或者您正在将多边形细分为三角形并填充三角形。
  • 好的,谢谢。也许我必须先将多边形转换为 2D 空间,然后进行填充/光栅化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
相关资源
最近更新 更多