我在3D空间中有一个带有4个点(一个多边形,同一平面上的所有点)的点云。我怎样才能计算它们之间的分数?

时间:2017-05-11 11:38:08

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

我有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个或更多个顶点的多边形。

2 个答案:

答案 0 :(得分: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 * | DA | / sqrt(k)和Ei = B + i * pBC * | CB | / sqrt(k)我们使用的是整数在0< = i< = sqrt(k)中并计算以下每个这样的i:

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

中的每个整数

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

enter image description here

编辑:这种方法也有三点。一个用作初始方向向量pAB和pAC然后三角形中使用的点必须在某种意义上放大,即,远离点A的第i次迭代将在其行中具有i点并且我让我进入0< = i< = 2 * sqrt(k)和j。然后我们应该最终得到大约k个点,这些点在三角形中缩放 ok

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

答案 1 :(得分:0)

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

完成的

math

四个任意点都有坐标

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个点(不需要在平面内)挑选两个具有相同意义的对。例如,如果成对选择 AB , B B C D CD 可能有错误的意义。(B-A)·(D-C)<=0·是内部产品,因为 A B C D 是矢量(数量)。如果感觉错了,那么翻转一对。然后选择 AB DC