Exemple #1
0
def un_cubo(io, name, cname, roca_size=0.05, density=1, trans=None, tob=None):
    # Definition of a cube as a convex shape

    vertices = numpy.array([[1, 1, 1], [1, -1, 1], [-1, 1, 1], [-1, -1, 1],
                            [1, 1, -1], [1, -1, -1], [-1, 1, -1], [-1, -1, -1]
                            ]) * roca_size

    ch = ConvexHull(vertices)
    cm = ch.centroid()

    # correction of vertices such that 0 is the centroid
    vertices = numpy.array(vertices)[:] - cm[:]

    ch = ConvexHull(vertices)
    cm = ch.centroid()

    # Definition of a polyhedron as a convex shape
    io.add_convex_shape(cname, vertices)

    # computation of inertia and volume
    inertia, volume = ch.inertia(ch.centroid())

    io.add_object(
        name,
        [Contactor(cname)],
        translation=trans,
        #velocity=veloci,
        mass=volume * density,
        time_of_birth=tob,
        inertia=inertia * density)
def one_brick(io,
              name,
              cname,
              vertices,
              size,
              density=1,
              trans=None,
              velo=None,
              tob=None):

    estimated_size = max(
        numpy.array(vertices).max(axis=0) - numpy.array(vertices).min(axis=0))
    #print(estimated_size)
    # scale = size / max(numpy.array(vertices).max(axis=0)
    #                         - numpy.array(vertices).min(axis=0))
    scale = 1.0
    ch = ConvexHull(vertices)
    cm_ori = ch.centroid()
    #print('cm_ori', cm_ori)
    if (numpy.linalg.norm(cm_ori) <= 1e-2):
        input()
    # correction of vertices such that 0 is the centroid
    vertices = (numpy.array(vertices)[:] - cm_ori[:]) * scale

    ch = ConvexHull(vertices)
    cm = ch.centroid()
    #print('cm', cm)
    # Definition of a polyhedron as a convex shape
    io.add_convex_shape(cname, vertices, insideMargin=0.001 * size)

    # computation of inertia and volume
    inertia, volume = ch.inertia(ch.centroid())

    # print('geometric inertia:', inertia)
    # print('volume:', volume)
    # print('mass:', volume*density)
    # print('inertia:', inertia*density)

    # io.add_object(name,
    #              [Contactor(cname, relative_translation = cm_ori)],
    #              translation=-cm_ori,
    #              velocity=velo,
    #              mass=volume*density,
    #              time_of_birth=tob,
    #              inertia=inertia*density)
    io.add_object(
        name, [Contactor(
            cname,
            relative_orientation=[1.0, 0.0, 0.0, 0.0],
        )],
        translation=cm_ori,
        orientation=[1.0, 0.0, 0.0, 0.0],
        velocity=velo,
        mass=volume * density,
        time_of_birth=tob,
        inertia=inertia * density)
def one_rock(io, name, cname, rock_size=0.05, density=1, trans=None, velo=None, tob=None):
    # Definition of an irregular polyhedron as a convex shape

    rd = [math.pi/2 * random.gauss(0.5,0.2) for _ in range(16)]
    rd = [1.143194140731269, 0.6247636994959747, 0.4198206059540749, 1.1116480956118107, 0.8965451614785596, 0.8819019228647785, 0.2592675582459427, 0.22899315888913663, 0.23837569282753324, 0.6585606791241505, 1.0084563758002816, 0.9096785924063177, 0.8633716705085941, 1.1215975890657788, 1.1983269522076825, 0.5443688021200721]

    # print('rd', rd)
    # input()
    def vert(id1, id2, a, b, c):
        return (a*math.cos(rd[id1])*math.cos(rd[id2]),
                b*math.sin(rd[id1])*math.cos(rd[id2]),
                c*math.sin(rd[id2]))

    vertices = [ vert( 0,  1,   1,  1,  1),
                 vert( 2,  3,   1, -1,  1),
                 vert( 4,  5,  -1,  1,  1),
                 vert( 6,  7,  -1, -1,  1),
                 vert( 8,  9,   1,  1, -1),
                 vert(10, 11,   1, -1, -1),
                 vert(12, 13,  -1,  1, -1),
                 vert(14, 15,  -1, -1, -1) ]

    scale = rock_size / max(numpy.array(vertices).max(axis=0)
                            - numpy.array(vertices).min(axis=0))

    ch = ConvexHull(vertices)
    cm = ch.centroid()

    # correction of vertices such that 0 is the centroid
    vertices = (numpy.array(vertices)[:] - cm[:]) * scale

    ch = ConvexHull(vertices)
    cm = ch.centroid()

    # Definition of a polyhedron as a convex shape
    io.add_convex_shape(cname, vertices, insideMargin=0.1*rock_size)

    # computation of inertia and volume
    inertia,volume=ch.inertia(ch.centroid())

    # print('geometric inertia:', inertia)
    # print('volume:', volume)
    # print('mass:', volume*density)
    # print('inertia:', inertia*density)


    io.add_object(name,
                 [Contactor(cname)],
                 translation=trans,
                 velocity=velo,
                 mass=volume*density,
                 time_of_birth=tob,
                 inertia=inertia*density)
Exemple #4
0
def una_roca(io, name, cname, roca_size=0.05, density=1, trans=None, tob=None):
    # Definition of an irregular polyhedron as a convex shape

    rd = [math.pi / 2 * random.gauss(0.5, 0.2) for _ in range(16)]

    def vert(id1, id2, a, b, c):
        return (a * math.cos(rd[id1]) * math.cos(rd[id2]),
                b * math.sin(rd[id1]) * math.cos(rd[id2]),
                c * math.sin(rd[id2]))

    vertices = [
        vert(0, 1, 1, 1, 1),
        vert(2, 3, 1, -1, 1),
        vert(4, 5, -1, 1, 1),
        vert(6, 7, -1, -1, 1),
        vert(8, 9, 1, 1, -1),
        vert(10, 11, 1, -1, -1),
        vert(12, 13, -1, 1, -1),
        vert(14, 15, -1, -1, -1)
    ]

    scale = roca_size / max(
        numpy.array(vertices).max(axis=0) - numpy.array(vertices).min(axis=0))

    ch = ConvexHull(vertices)
    cm = ch.centroid()

    # correction of vertices such that 0 is the centroid
    vertices = (numpy.array(vertices)[:] - cm[:]) * scale

    ch = ConvexHull(vertices)
    cm = ch.centroid()

    # Definition of a polyhedron as a convex shape
    io.add_convex_shape(cname, vertices, insideMargin=0.1 * roca_size)

    # computation of inertia and volume
    inertia, volume = ch.inertia(ch.centroid())

    # print('geometric inertia:', inertia)
    # print('volume:', volume)
    # print('mass:', volume*density)
    # print('inertia:', inertia*density)

    io.add_object(
        name,
        [Contactor(cname)],
        translation=trans,
        #velocity=veloci,
        mass=volume * density,
        time_of_birth=tob,
        inertia=inertia * density)
Exemple #5
0
    # Definition of the ground shape
    io.add_primitive_shape('Ground',
                           'Box', (10, 10, 1),
                           insideMargin=0.01,
                           outsideMargin=0.0)

    # Definition of a non smooth law. As no group ids are specified it
    # is between contactors of group id 0.
    io.add_Newton_impact_friction_nsl('contact',
                                      mu=0.01,
                                      e=0.7,
                                      collision_group1=1,
                                      collision_group2=2)

    # computation of inertia and volume
    ch = ConvexHull(pts)
    inertia, volume = ch.inertia(ch.centroid())

    # The tetra object made with an unique Contactor : the tetrahedron
    # shape.  As a mass is given, it is a dynamic system involved in
    # contact detection and in the simulation.  With no group id
    # specified the Contactor belongs to group 0
    io.add_object('tetra', [Contactor('Tetra', collision_group=1)],
                  translation=[0, 0, 4],
                  velocity=[0, 0, 0, 0, 0, 0],
                  mass=1,
                  inertia=inertia)

    # the ground object made with the ground shape. As the mass is
    # not given, it is a static object only involved in contact
    # detection.
                ],
            ])
            all_pts += list(pts)
            io.add_convex_shape('Chainlink%02d' % (i * num_parts + j), pts)

    # connector: using the 16 points closest to center, create two
    # hulls for upper and lower part
    all_pts = np.array(all_pts)
    connect = all_pts[np.argsort((all_pts[:, 1] - 0)**2)[:16]]
    io.add_convex_shape('Chainlink%02d' % (num_parts * 2 + 0),
                        connect[connect[:, 2] > 0])
    io.add_convex_shape('Chainlink%02d' % (num_parts * 2 + 1),
                        connect[connect[:, 2] < 0])

    # computation of inertia and volume of all points
    ch = ConvexHull(all_pts)
    link_inertia, volume = ch.inertia(ch.centroid())

    # computation of inertia and volume of all points including
    # extrema of the ball
    ball_pos = np.array([0, ball_radius + length * 2 / 3, 0])
    ch = ConvexHull(
        np.vstack((all_pts, [
            ball_pos + [0, ball_radius, 0], ball_pos + [0, 0, ball_radius],
            ball_pos + [0, 0, -ball_radius], ball_pos + [ball_radius, 0, 0],
            ball_pos + [-ball_radius, 0, 0]
        ])))
    ball_inertia, volume = ch.inertia(ch.centroid())

    # ball at the end of the chain
    io.add_primitive_shape('Ball', 'Sphere', [ball_radius])
Exemple #7
0
    orientation_polyhedron = [math.cos(angle/2.0), 0.0, math.sin(angle/2.0), 0.0]
    #orientation_polyhedron = [1.0, 0.0, 0.0, 0.0]
    #orientation_polyhedron = [0.0, 1.0, 0.0, 0.0] #--> cos(\theta/2.0) = 0, sin(\theta/2.0) =1 ==> \theta = pi


    for i in range(n_row):
      for j in range(n_col):
        for n in range(n_polyhedron):
          polyhedron_size_rand = polyhedron_size*(1.0 + 0.5*( random.random()-1.0))
          polyhedron_vertices=[ (-polyhedron_size_rand, polyhedron_size_rand, 0.0),
                                (-polyhedron_size_rand, -polyhedron_size_rand, 0.0),
                                (polyhedron_size_rand, -polyhedron_size_rand, 0.0),
                                (polyhedron_size_rand, polyhedron_size_rand, 0.0),
                                (0.0,0.0, 10.0*polyhedron_size_rand)]
          print('polyhedron_vertices', polyhedron_vertices)
          ch = ConvexHull(polyhedron_vertices)
          cm = ch.centroid()
          print('cm', cm)
          
          # correction of vertices such that o is the centroid
          polyhedron_vertices = numpy.array(polyhedron_vertices)[:]-cm[:]
          print('corrected polyhedron_vertices', polyhedron_vertices)
          ch = ConvexHull(polyhedron_vertices)
          cm = ch.centroid()
          print('cm', cm)
          
          # computation of inertia and volume
          inertia,volume=ch.inertia(cm)
          print ('inertia,volume',inertia,volume)
          mass = volume*density
          inertia = inertia*density
Exemple #8
0
            vertices.extend(vertice)
        vertices=list(set(vertices))
        #print('ver', vertices)
        if (len(vertices) <=  1):
            print('the number of vertices must be mroe than 0')
        vertices_coordinates=[]
        for v in vertices:
            #print(v)
            [vertex]  = [x for x in all_vertices if x[0] == abs(v)]
            #print(vertex)
            vertices_coordinates.append([vertex[1],vertex[2],vertex[3]])
        #print(vertices_coordinates)

        # Definition of a polyhedron as a convex shape
        cname = 'polyhedron' + str(p)
        ch = ConvexHull(vertices_coordinates)
        cm = ch.centroid()
        vertices_coordinates = (numpy.array(vertices_coordinates)[:] - cm[:])
        io.add_convex_shape(cname, vertices_coordinates, insideMargin=0.0)

        ch = ConvexHull(vertices_coordinates)
        inertia,volume=ch.inertia(ch.centroid())

        density=2300
        #print('geometric inertia:', inertia)
        #print('volume:', volume)
        # print('mass:', volume*density)
        # print('inertia:', inertia*density)


        name = 'polyhedron_bdy' + str(p)