我有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个或更多个顶点的多边形。答案 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个点。
编辑:这种方法也有三点。一个用作初始方向向量pAB和pAC然后三角形中使用的点必须在某种意义上放大,即,远离点A的第i次迭代将在其行中具有i点并且我让我进入0< = i< = 2 * sqrt(k)和j。然后我们应该最终得到大约k个点,这些点在三角形中缩放 ok 。
对于超过4个点,问题是这个网格有多精确。一种方法是我们采用包围凸四边形或甚至AABB Q.然后我们使用上述方法但添加常数C并计算网格中的C * k点。另外,我们为每个添加的点应用多边形测试中的一个点。 只要有问题的多边形只有一个恒定数量的顶点:此方法在O(k)时间内运行。
答案 1 :(得分:0)
最简单的方法是实现双线性插值。在数学上,这是通过以下矢量方程
完成的四个任意点都有坐标
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)
然后循环遍历两个标量值t
和s
,范围从0
到1
,每个范围n
和m
。与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 如果以下内容为真{em},那么em>和 CD 可能有错误的意义。(B-A)·(D-C)<=0
。 ·
是内部产品,因为 A , B , C 和 D 是矢量(数量)。如果感觉错了,那么翻转一对。然后选择 AB 和 DC 。
子>