首页 > 解决方案 > 执行旋转矩形测试并获得许多异常值

问题描述

我编写了一个 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;
           }
        }
    }
}

标签: pythoncudalinear-algebra

解决方案


我写了一个 cpu 版本并检查了发生了什么。计算 t22=(A[i]-B[6])*(B[2]-B[6])+... 的错误导致问题,其中 B[2] 应替换为 B[0 ]。生成的错误向量靠近正确的向量,因此只有少数点超出矩形,尤其是在旋转角度较小的情况下。


推荐阅读