def getObjectInteraction(self, persons, objects, interaction, d): # print("getObjectInteration") plt.close('all') polylines_object = [] polylines_interacting = [] for o in objects: obj = Object(o.x, o.z, o.angle, o.space) # print("OBJETO") ##para dibujarlo if d: plt.figure('ObjectSpace') rect = plt.Rectangle((obj.x - 0.25, obj.y - 0.25), 0.5, 0.5, fill=False) plt.gca().add_patch(rect) x_aux = obj.x + 0.25 * cos(pi / 2 - obj.th) y_aux = obj.y + 0.25 * sin(pi / 2 - obj.th) heading = plt.Line2D((obj.x, x_aux), (obj.y, y_aux), lw=1, color='k') plt.gca().add_line(heading) w = 1.0 #print (obj.x,obj.y) ##para calcular el rectangulo s = QRectF(QPointF(0, 0), QSizeF(w, obj.sp)) # if (d): # plt.plot (s.bottomLeft().x(),s.bottomLeft().y(),"go") # plt.plot(s.bottomRight().x(), s.bottomRight().y(), "ro") # plt.plot(s.topRight().x(), s.topRight().y(), "yo") # plt.plot(s.topLeft().x(), s.topLeft().y(), "bo") space = QPolygonF() space.append(s.topLeft()) space.append(s.topRight()) space.append( QPointF(s.bottomRight().x() + obj.sp / 4, s.bottomRight().y())) space.append( QPointF(s.bottomLeft().x() - obj.sp / 4, s.bottomLeft().y())) t = QTransform() t.translate(-w / 2, 0) space = t.map(space) t = QTransform() t.rotateRadians(-obj.th) space = t.map(space) t = QTransform() t.translate(obj.x, obj.y) space = t.map(space) # points = [] # for x in xrange(space.count()-1): # point = space.value(x) # print ("valor", point) # points.append([point.x(),point.y()]) # plt.plot(point.x(),point.y(),"go") polyline = [] for x in xrange(space.count()): point = space.value(x) if (d): plt.plot(point.x(), point.y(), "go") p = SNGPoint2D() p.x = point.x() p.z = point.y() polyline.append(p) polylines_object.append(polyline) for p in persons: pn = Person(p.x, p.z, p.angle) # print("PERSONA", persons.index(p)+1) if d: body = plt.Circle((pn.x, pn.y), radius=0.3, fill=False) plt.gca().add_patch(body) x_aux = pn.x + 0.30 * cos(pi / 2 - pn.th) y_aux = pn.y + 0.30 * sin(pi / 2 - pn.th) heading = plt.Line2D((pn.x, x_aux), (pn.y, y_aux), lw=1, color='k') plt.gca().add_line(heading) plt.axis('equal') ##CHECKING THE ORIENTATION a = abs(obj.th - abs(pn.th - math.pi)) if a < math.radians(45): checkangle = True else: checkangle = False ##CHECKING IF THE PERSON IS INSIDE THE POLYGON if space.containsPoint(QPointF(pn.x, pn.y), Qt.OddEvenFill) and checkangle: # print("DENTROOOOO Y MIRANDO") if not polyline in polylines_interacting: polylines_interacting.append(polyline) if d: for ps in polylines_interacting: # plt.figure() for p in ps: plt.plot(p.x, p.z, "ro") plt.axis('equal') plt.xlabel('X') plt.ylabel('Y') plt.show() plt.show() if (interaction): return polylines_interacting else: return polylines_object
def get_avgDist_minDist_maxDist_CP_single(persons, objects, objects_shapes, traj, polylinesI, polylinesP, polylinesS, polylinesAffNormal, polylinesAffLow, polylinesAffMed, polylinesAffHigh): dist_cperson = np.array([min([np.linalg.norm(x - person) for person in persons]) for x in traj]) avgDist_cperson = np.average(dist_cperson) dist_cperson2 = np.array([min([np.linalg.norm(x - person) for x in traj]) for person in persons]) minDist_cperson = np.min(dist_cperson) maxDist_cperson = np.max(dist_cperson) # To objects dist_center_object = np.array([min([np.linalg.norm(x - object) for object in objects]) for x in traj]) avgDist_center_object = np.average(dist_center_object) minDist_center_object = np.min(dist_center_object) maxDist_center_object = np.max(dist_center_object) dist_shape_object_points = np.array( [[min(np.linalg.norm(x - point) for shape in objects_shapes for point in shape)] for x in traj]) dist_shape_objects2 = np.array( [min([min([np.linalg.norm(x - point) for x in traj]) for point in shape]) for shape in objects_shapes]) minDist_shape_obj = np.min(dist_shape_object_points) maxDist_shape_obj = np.max(dist_shape_object_points) avgDist_shape_obj = np.average(dist_shape_object_points) social_cperson = {'intimate': 0., 'personal': 0., 'social': 0., 'pub': 0.} social_affordance = {'normal': 0., 'low': 0., 'medium': 0., 'high': 0., 'free': 0.} polygonI = QPolygonF() polygonP = QPolygonF() polygonS = QPolygonF() polygonAffNormal = QPolygonF() polygonAffLow = QPolygonF() polygonAffMed = QPolygonF() polygonAffHigh = QPolygonF() for pI in polylinesI: for x in pI: polygonI.append(QPointF(x[0], x[1])) for pP in polylinesP: for x in pP: polygonP.append(QPointF(x[0], x[1])) for pS in polylinesS: for x in pS: polygonS.append(QPointF(x[0], x[1])) ## Object affordances for pN in polylinesAffNormal: for x in pN: polygonAffNormal.append(QPointF(x[0], x[1])) for pL in polylinesAffLow: for x in pL: polygonAffLow.append(QPointF(x[0], x[1])) for pM in polylinesAffMed: for x in pM: polygonAffMed.append(QPointF(x[0], x[1])) for pM in polylinesAffHigh: for x in pM: polygonAffHigh.append(QPointF(x[0], x[1])) for x in traj: if polygonI.containsPoint(QPointF(x[0], x[1]), Qt.OddEvenFill): social_cperson['intimate'] += 1. elif polygonP.containsPoint(QPointF(x[0], x[1]), Qt.OddEvenFill): social_cperson['personal'] += 1. elif polygonS.containsPoint(QPointF(x[0], x[1]), Qt.OddEvenFill): social_cperson['social'] += 1. else: social_cperson['pub'] += 1. social_cperson['intimate'] /= len(traj) / 100. social_cperson['personal'] /= len(traj) / 100. social_cperson['social'] /= len(traj) / 100. social_cperson['pub'] /= len(traj) / 100. for x in traj: if polygonAffNormal.containsPoint(QPointF(x[0], x[1]), Qt.OddEvenFill): social_affordance['normal'] += 1. elif polygonAffLow.containsPoint(QPointF(x[0], x[1]), Qt.OddEvenFill): social_affordance['low'] += 1. elif polygonAffMed.containsPoint(QPointF(x[0], x[1]), Qt.OddEvenFill): social_affordance['medium'] += 1. elif polygonAffHigh.containsPoint(QPointF(x[0], x[1]), Qt.OddEvenFill): social_affordance['high'] += 1. else: social_affordance['free'] += 1. social_affordance['normal'] /= len(traj) / 100. social_affordance['low'] /= len(traj) / 100. social_affordance['medium'] /= len(traj) / 100. social_affordance['high'] /= len(traj) / 100. social_affordance['free'] /= len(traj) / 100. return avgDist_cperson, minDist_cperson, maxDist_cperson, avgDist_shape_obj, minDist_shape_obj, maxDist_shape_obj, social_cperson, social_affordance, dist_cperson2, dist_shape_objects2