1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//! methods related to line mesh topology

/// making vertex indexes list of line mesh from vertex surrounding vertex
/// * `vtx2idx` - vertex to index list
/// * `idx2vtx` - index to vertex list
pub fn from_vtx2vtx(
    vtx2idx: &Vec<usize>,
    idx2vtx: &Vec<usize>) -> Vec<usize> {
    let mut line2vtx = Vec::<usize>::with_capacity(idx2vtx.len() * 2);
    for i_vtx in 0..vtx2idx.len() - 1 {
        for &j_vtx in &idx2vtx[vtx2idx[i_vtx]..vtx2idx[i_vtx + 1]] {
            line2vtx.push(i_vtx);
            line2vtx.push(j_vtx);
        }
    }
    line2vtx
}

pub fn from_sepecific_edges_of_uniform_mesh(
    elem2vtx: &[usize],
    num_node: usize,
    edge2node: &[usize],
    num_vtx: usize) -> Vec<usize>
{
    let vtx2elem = crate::vtx2elem::from_uniform_mesh(
        elem2vtx, num_node, num_vtx);
    let vtx2vtx = crate::vtx2vtx::from_specific_edges_of_uniform_mesh(
        elem2vtx, num_node,
        edge2node,
        &vtx2elem.0, &vtx2elem.1,
        false);
    from_vtx2vtx(&vtx2vtx.0, &vtx2vtx.1)
}

/// generate line mesh as edges of polygon mesh
/// polygon mesh is a mixture of triangle, quadrilateal, pentagon mesh
/// * `num_vtx` - number of vertex
pub fn edge_of_polygon_mesh(
    elem2idx: &[usize],
    idx2vtx: &[usize],
    num_vtx: usize) -> Vec<usize> {
    let vtx2elem = crate::vtx2elem::from_polygon_mesh(
        elem2idx, idx2vtx,
        num_vtx);
    let vtx2vtx = crate::vtx2vtx::edges_of_polygon_mesh(
        elem2idx, idx2vtx,
        &vtx2elem.0, &vtx2elem.1,
        false);
    crate::edge2vtx::from_vtx2vtx(&vtx2vtx.0, &vtx2vtx.1)
}