use halfedge::build_icosphere;
use halfedge::traversal::{
FaceHalfEdges, FaceVertices, VertexAdjacentFaces, VertexAdjacentVerts, VertexRing,
is_boundary_edge, is_boundary_vertex,
};
fn main() {
let mesh = build_icosphere(0);
println!(
"icosphere(0):{} 顶点 / {} 面 / {} 半边",
mesh.vertex_count(),
mesh.face_count(),
mesh.halfedge_count()
);
let v = mesh.vertex_ids().next().unwrap();
let f = mesh.face_ids().next().unwrap();
let ring: Vec<_> = VertexRing::new(&mesh, v).collect();
println!("\n顶点 {:?} 的 outgoing 半边环({} 条):", v, ring.len());
for he in &ring {
let h = mesh.get_halfedge(*he).unwrap();
let origin = mesh.get_halfedge(h.twin.unwrap()).unwrap().vertex;
println!(" {:?}: {:?}→{:?}", he, origin, h.vertex);
}
let neighbors: Vec<_> = VertexAdjacentVerts::new(&mesh, v).collect();
println!(
"\n顶点 {:?} 的邻居({} 个):{:?}",
v,
neighbors.len(),
neighbors
);
let adj_faces: Vec<_> = VertexAdjacentFaces::new(&mesh, v).collect();
println!(
"顶点 {:?} 的邻接面({} 个):{:?}",
v,
adj_faces.len(),
adj_faces
);
let face_he: Vec<_> = FaceHalfEdges::new(&mesh, f).collect();
println!("\n面 {:?} 的边界环({} 条半边):", f, face_he.len());
for he in &face_he {
let h = mesh.get_halfedge(*he).unwrap();
println!(" {:?}: tip={:?}", he, h.vertex);
}
let face_verts: Vec<_> = FaceVertices::new(&mesh, f).collect();
println!("面 {:?} 的顶点:{:?}", f, face_verts);
println!("\n边界判定:");
let sample_he = mesh.halfedge_ids().next().unwrap();
println!(
" is_boundary_edge({:?}) = {}(闭合球面应无边界)",
sample_he,
is_boundary_edge(&mesh, sample_he)
);
println!(
" is_boundary_vertex({:?}) = {}(闭合球面应无边界)",
v,
is_boundary_vertex(&mesh, v)
);
let count = VertexAdjacentVerts::new(&mesh, v).count();
println!(
"\n迭代期修改:顶点 {:?} 有 {} 个邻居,循环内可自由修改 mesh",
v, count
);
for n in VertexAdjacentVerts::new(&mesh, v) {
let p = mesh.get_vertex(n).unwrap().position;
println!(" 邻居 {:?} 位置 {:?}", n, p);
}
}