进行旋转矩形测试,得到许多异常值



我写了一个cuda程序,通过检查矩形有向边的内积(按顺时针顺序(来决定点p是否在矩形ABCD内。如下所示,当且仅当P在BC线以下时,CP*CD>0,当且只当P在CD的左侧时,DP*DA>0,等等。因此,通过进行4次内积,我们可以过滤该矩形内(或上(的所有点,它们的乘积值大于或等于0。此处为异常值

__P
/|
B ___________C
/|           /|     
|             |  
|             |    
| /__________|/  
A         D  _|
P   

让我困扰的是,当我在数据上实验这些代码时,这个矩形之外的三角形区域也被标记为内部,我无法解释。

__global__ void inBoxKernel(const float *A, const float *B, int *C, int numElements){
int i = (blockDim.x * blockIdx.x + threadIdx.x)*2;
float t11;
float t12;
float t21;
float t22;
if (i/2 < numElements)
{
if ((A[i]<B[0] || (A[i] >B[4]))||((A[i+1]>B[3]) || (A[i+1] <B[7])))
{
C[i/2]=-1;
}
else
{
t11=(A[i]-B[0])*(B[2]-B[0])+(A[i+1]-B[1])*(B[3]-B[1]);
t12=(A[i]-B[4])*(B[6]-B[4])+(A[i+1]-B[5])*(B[7]-B[5]);
t21=(A[i]-B[2])*(B[4]-B[2])+(A[i+1]-B[3])*(B[5]-B[3]);
t22=(A[i]-B[6])*(B[2]-B[6])+(A[i+1]-B[7])*(B[1]-B[7]);
if (t11>=1e-5 && t12>=1e-5 && t21>=1e-5 && t22>=1e-5) 
{
C[i/2]=1;
}
else
{
C[i/2]=-1;
}
}
}
}

我写了一个cpu版本,检查了发生了什么。计算t22=(a[I]-B[6](*(B[2]-B[6]。。。导致了问题,其中B[2]应该被B[0]代替。由此产生的错误向量接近正确向量,因此只有少量点在矩形之外,尤其是当旋转角度很小时。

最新更新