本文记录使用向量方法寻找非规则四边行的内部区域,可不使用for循环语句,加快代码运行,其详细代码如下:
import numpy import numpy as np import torch def distinguish_point_pos(corners_list, point): """ :param corners_list: tensor(8), eight corner coordinate, clockwise :param point: tensor(N, 2), to be distinguished :return: bool tensor(N) """ assert corners_list.shape[0] == 8 A = corners_list[0:2] B = corners_list[2:4] C = corners_list[4:6] D = corners_list[6:8] P = point AB = B - A AP = P - A # ABXAP = (b.x - a.x, b.y - a.y) x (p.x - a.x, p.y - a.y) # = (b.x -a.y)(p.y - a.y) -(b.y - a.y)(p.x - a.x) ABXAP = (AB[0] * AP[:, 1]) - (AB[1] * AP[:, 0]) # size(N) # print(ABXAP) BC = C - B BP = P - B BCXBP = (BC[0] * BP[:, 1]) - (BC[1] * BP[:, 0]) CD = D - C CP = P - C CDXCP = (CD[0] * CP[:, 1]) - (CD[1] * CP[:, 0]) DA = A - D DP = P - D DAXDP = (DA[0] * DP[:, 1]) - (DA[1] * DP[:, 0]) """ if (ABXAP >= 0 and BCXBP >= 0 and CDXCP >= 0 and DAXDP >= 0) or \ (ABXAP < 0 and BCXBP < 0 and CDXCP < 0 and DAXDP < 0): return True else: return False""" distin_list = torch.zeros_like(ABXAP).bool() # 保留正负样本的变量 # t0 = time.time() idx1 = (ABXAP >= 0) * (BCXBP >= 0) * (CDXCP >= 0) * (DAXDP >= 0) idx2 = (ABXAP < 0) * (BCXBP < 0) * (CDXCP < 0) * (DAXDP < 0) distin_list[idx1] = True distin_list[idx2] = True # t1 = time.time() # print('找点for循环时间', t1-t0) return distin_list if __name__ == '__main__': corners_list=torch.tensor([2,2, 8,2, 8,6, 2,6]) y, x = torch.meshgrid([torch.arange(0, 12), torch.arange(0, 12)]) grid = torch.stack([x, y], dim=-1).float() grid_center = (grid + 0.5).reshape(-1, 2) distin_list=distinguish_point_pos(corners_list, grid_center) distin_list=distin_list.numpy().reshape(12,12) print(distin_list)
结果如下: