python - 执行旋转矩形测试并获得许多异常值
问题描述
我编写了一个 cuda 程序,通过检查矩形有向边的内积来确定点 P 是否在矩形 ABCD 内,按顺时针顺序排列。如下所示,CP * CD >0 当且仅当 P 在 BC 线下方,并且 DP * DA>0 当且仅当 P 在 CD 的左侧,等等。所以通过做 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 ]。生成的错误向量靠近正确的向量,因此只有少数点超出矩形,尤其是在旋转角度较小的情况下。