Я пишу программу 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;
}
}
}
}