выполнить тест в повернутом прямоугольнике и получить много выбросов - PullRequest
0 голосов
/ 08 марта 2020

Я пишу программу cuda, которая решает, находится ли точка P внутри прямоугольника ABCD или нет, проверяя внутреннее произведение с направленным краем прямоугольника, который находится по часовой стрелке. Как показано ниже, CP * CD> 0 тогда и только тогда, когда P находится ниже линии B C, а DP * DA> 0 тогда и только тогда, когда P находится слева от CD, et c. Таким образом, выполнив 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;
           }
        }
    }
}

1 Ответ

1 голос
/ 08 марта 2020

Я написал версию процессора и проверил, что происходит. Ошибка в вычислении t22 = (A [i] -B [6]) * (B [2] -B [6]) + ... приводит к проблеме, где B [2] следует заменить на B [0 ]. Получающийся неправильный вектор близок к правому, поэтому только небольшое количество точек выходит за пределы прямоугольника, особенно когда угол поворота мал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...