def CheckAngleNear(angles_img, point, border_angle, oldangle): for i in [-1, 0, 1]: for j in [-1, 0, 1]: new_p = (point[0] + i, point[1] + j) if checkbound(new_p, angles_img): angle = angles_img[new_p[0], new_p[1]] diff = SWT_Support.anglediff(oldangle, angle) if abs(diff) > (border_angle): return True return False
def Stroke(image, angles_img, point, dx, dy, search_direction=-1): MAX_RAY_LEN = 100 stroke = [] if not checkbound_sq(point, image): return oldangle = angles_img[point[0], point[1]] #Получаем угол angle = oldangle if (oldangle == None) or (numpy.isnan(oldangle)): return selector = Bresenham.Selector( point[0], point[1], point[0] + search_direction * dy[point[0], point[1]], point[1] + search_direction * dx[point[0], point[1]]) diff = SWT_Support.anglediff(oldangle, angle) stroke.append(point) new_point = selector.GetPoint() stroke.append(new_point) new_point = selector.GetPoint() if point == new_point: return point = new_point if not checkbound_sq(point, image): # or mask[point[0], point[1]] == 255: return i = 0 #Пока не уткнемся в градиент различающийся с нашим более чем в 30* ползем в направлении step #Из-за кривого шага на больших расстояниях дает нехороший результат while image[point[0], point[ 1]] == 0: #not ContourNear(image, point):# image[point[0], point[1]] == 0: stroke.append(point) point = selector.GetPoint() i += 1 #Если уткнулись в край картинки - считаем луч ошибочным if not checkbound_sq( point, image ) or i > MAX_RAY_LEN: # or mask[point[0], point[1]] == 255: return if CheckAngleNear(angles_img, point, numpy.pi / 3, oldangle): return stroke else: return
def Stroke(image, angles_img, point, dx, dy, search_direction=-1): MAX_RAY_LEN = 100 stroke = [] if not checkbound_sq(point, image): return oldangle = angles_img[point[0], point[1]]#Получаем угол angle = oldangle if (oldangle == None) or (numpy.isnan(oldangle)): return selector = Bresenham.Selector( point[0], point[1], point[0] + search_direction*dy[point[0], point[1]], point[1] + search_direction*dx[point[0], point[1]] ) diff = SWT_Support.anglediff(oldangle, angle) stroke.append(point) new_point = selector.GetPoint() stroke.append(new_point) new_point = selector.GetPoint() if point == new_point: return point = new_point if not checkbound_sq(point, image):# or mask[point[0], point[1]] == 255: return i = 0 #Пока не уткнемся в градиент различающийся с нашим более чем в 30* ползем в направлении step #Из-за кривого шага на больших расстояниях дает нехороший результат while image[point[0], point[1]] == 0:#not ContourNear(image, point):# image[point[0], point[1]] == 0: stroke.append(point) point = selector.GetPoint() i += 1 #Если уткнулись в край картинки - считаем луч ошибочным if not checkbound_sq(point, image) or i > MAX_RAY_LEN:# or mask[point[0], point[1]] == 255: return if CheckAngleNear(angles_img, point, numpy.pi / 3, oldangle): return stroke else: return