Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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