MinkowskiMesh::edge_faces sorting against incorrect value
This commit is contained in:
parent
da6b800d4e
commit
72d8186ba4
@ -472,22 +472,22 @@ impl MeshQuery<MinkowskiFace,MinkowskiDirectedEdge,MinkowskiVert> for MinkowskiM
|
|||||||
fn edge_faces(&self,edge_id:MinkowskiEdge)->Cow<[MinkowskiFace;2]>{
|
fn edge_faces(&self,edge_id:MinkowskiEdge)->Cow<[MinkowskiFace;2]>{
|
||||||
match edge_id{
|
match edge_id{
|
||||||
MinkowskiEdge::VertEdge(v0,e1)=>{
|
MinkowskiEdge::VertEdge(v0,e1)=>{
|
||||||
let e1f=self.mesh1.edge_faces(e1);
|
//tracking index with an external variable because .enumerate() is not available
|
||||||
let e1f0_n=self.mesh1.face_nd(e1f[0]).0;
|
let mut i=0;
|
||||||
let e1f1_n=self.mesh1.face_nd(e1f[1]).0;
|
Cow::Owned(self.mesh1.edge_faces(e1).map(|edge_face_id1|{
|
||||||
Cow::Owned([(e1f[0],e1f0_n,e1f1_n,true),(e1f[1],e1f1_n,e1f0_n,false)].map(|(edge_face_id1,edge_face1_n,other_edge_face1_n,face_parity)|{
|
let face_parity=i==0;
|
||||||
|
i+=1;
|
||||||
let mut best_edge=None;
|
let mut best_edge=None;
|
||||||
let mut best_d=Planar64::MAX;
|
let mut best_d=Planar64::ZERO;
|
||||||
|
let edge_face1_n=self.mesh1.face_nd(edge_face_id1).0;
|
||||||
for &directed_edge_id0 in self.mesh0.vert_edges(v0).iter(){
|
for &directed_edge_id0 in self.mesh0.vert_edges(v0).iter(){
|
||||||
let edge0_n=self.mesh0.directed_edge_n(directed_edge_id0);
|
let edge0_n=self.mesh0.directed_edge_n(directed_edge_id0);
|
||||||
if edge_face1_n.dot(edge0_n)<Planar64::ZERO{
|
let d=edge_face1_n.dot(edge0_n);
|
||||||
let d=other_edge_face1_n.dot(edge0_n);
|
|
||||||
if d<best_d{
|
if d<best_d{
|
||||||
best_d=d;
|
best_d=d;
|
||||||
best_edge=Some(directed_edge_id0);
|
best_edge=Some(directed_edge_id0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
best_edge.map_or(
|
best_edge.map_or(
|
||||||
MinkowskiFace::VertFace(v0,edge_face_id1),
|
MinkowskiFace::VertFace(v0,edge_face_id1),
|
||||||
|directed_edge_id0|MinkowskiFace::EdgeEdge(directed_edge_id0.as_undirected(),e1,directed_edge_id0.parity()^face_parity)
|
|directed_edge_id0|MinkowskiFace::EdgeEdge(directed_edge_id0.as_undirected(),e1,directed_edge_id0.parity()^face_parity)
|
||||||
@ -495,22 +495,21 @@ impl MeshQuery<MinkowskiFace,MinkowskiDirectedEdge,MinkowskiVert> for MinkowskiM
|
|||||||
}))
|
}))
|
||||||
},
|
},
|
||||||
MinkowskiEdge::EdgeVert(e0,v1)=>{
|
MinkowskiEdge::EdgeVert(e0,v1)=>{
|
||||||
let e0f=self.mesh0.edge_faces(e0);
|
let mut i=0;
|
||||||
let e0f0_n=self.mesh0.face_nd(e0f[0]).0;
|
Cow::Owned(self.mesh0.edge_faces(e0).map(|edge_face_id0|{
|
||||||
let e0f1_n=self.mesh0.face_nd(e0f[1]).0;
|
let face_parity=i==0;
|
||||||
Cow::Owned([(e0f[0],e0f0_n,e0f1_n,true),(e0f[1],e0f1_n,e0f0_n,false)].map(|(edge_face_id0,edge_face0_n,other_edge_face0_n,face_parity)|{
|
i+=1;
|
||||||
let mut best_edge=None;
|
let mut best_edge=None;
|
||||||
let mut best_d=Planar64::MAX;
|
let mut best_d=Planar64::ZERO;
|
||||||
|
let edge_face0_n=self.mesh0.face_nd(edge_face_id0).0;
|
||||||
for &directed_edge_id1 in self.mesh1.vert_edges(v1).iter(){
|
for &directed_edge_id1 in self.mesh1.vert_edges(v1).iter(){
|
||||||
let edge1_n=self.mesh1.directed_edge_n(directed_edge_id1);
|
let edge1_n=self.mesh1.directed_edge_n(directed_edge_id1);
|
||||||
if edge_face0_n.dot(edge1_n)<Planar64::ZERO{
|
let d=edge_face0_n.dot(edge1_n);
|
||||||
let d=other_edge_face0_n.dot(edge1_n);
|
|
||||||
if d<best_d{
|
if d<best_d{
|
||||||
best_d=d;
|
best_d=d;
|
||||||
best_edge=Some(directed_edge_id1);
|
best_edge=Some(directed_edge_id1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
best_edge.map_or(
|
best_edge.map_or(
|
||||||
MinkowskiFace::FaceVert(edge_face_id0,v1),
|
MinkowskiFace::FaceVert(edge_face_id0,v1),
|
||||||
|directed_edge_id1|MinkowskiFace::EdgeEdge(e0,directed_edge_id1.as_undirected(),directed_edge_id1.parity()^face_parity)
|
|directed_edge_id1|MinkowskiFace::EdgeEdge(e0,directed_edge_id1.as_undirected(),directed_edge_id1.parity()^face_parity)
|
||||||
|
Loading…
Reference in New Issue
Block a user