奔
@2214312040
奔
@2214312040
-
考虑到原函数逻辑不完善,有卡住的风险,于是对 HalfedgeMesh::isotropic_remesh() 中对 collapse 的调用做了一点改进:
tmp=this->edges.head;
int is_tail=0;
while(1){
if(tmp==this->edges.tail){
is_tail=1;
}
if(tmp->length()<4.0/5.0*aver_len){
collapse_edge(tmp);
}
if(is_tail==1){
break;
}
else{
tmp=tmp->next_node;
}
}
但结果依然卡死,正如一开始提问说到的,问题出现在第 63 次 collapse 操作时删除点的操作之前Post #6 -
void HalfedgeMesh::erase(Edge* e)
{
erased_edges[e->id] = edges.release(e);
}
这是 erase 函数,它实际上是调用了 edges 的 release 函数
Node* LinkedList::release(Node* node)
{
if (node == nullptr || !this->size) {
return nullptr;
}
--this->size;
if (!this->size) {
// Erase the last element in the list
this->head = nullptr;
this->tail = nullptr;
} else if (node == this->head) {
// Erasure for the head node
this->head = this->head->next_node;
this->head->prev_node = nullptr;
} else if (node == this->tail) {
// Erasure for the tail node
this->tail = this->tail->prev_node;
this->tail->next_node = nullptr;
} else {
// Otherwise a general erasure
node->prev_node->next_node = node->next_node;
node->next_node->prev_node = node->prev_node;
}
return node;
}
这是 release 函数,我们可以看到,在这个过程中,tmp 虽然从链表中被剔除,但是它的内存并没有释放,同时,tmp 的 next_node 也没有改变,所以调用 tmp->next_node 理应是合法的,同理,按照您所说,collapse_edge 会百分之一百从链表中删除传入的元素,那么这个程序从 collapse 第一个节点时就会卡死,应该不至于到第 63 次 collapse 才卡死Post #5 -
这是我卡死前的命令行输出,显示卡死前并没有删除 vertex,但是已经进入了 collapse_edge 函数
[Halfedge Mesh] [info] not on_boundar:35897,9465,35936,9464,35938,9462,35937,35905,21345,35939,35941[Halfedge Mesh] [info] not on_boundar:21374,9472,35948,9471,35950,9470,35949,21373,9494,35951,35953
[Halfedge Mesh] [info] vertex
[Halfedge Mesh] [info] face
[Halfedge Mesh] [info] edge
[Halfedge Mesh] [info] halfedge
[Halfedge Mesh] [info] not on_boundar:21374,9472,35948,9471,35950,9470,35949,21373,9494,35951,35953
[Halfedge Mesh] [info] not on_boundar:35943,9494,9496,35984,35951,35952,9474,9469,35987,35986,10081
[Halfedge Mesh] [info] vertex
[Halfedge Mesh] [info] face
[Halfedge Mesh] [info] edge
[Halfedge Mesh] [info] halfedge
[Halfedge Mesh] [info] not on_boundar:35943,9494,9496,35984,35951,35952,9474,9469,35987,35986,10081
[Halfedge Mesh] [info] not on_boundar:10057,9496,35984,9494,35986,9493,35985,10056,35951,35987,35989
Post #3 -
每次都会在同一个地方卡住,这是我 collapse_edge 函数对不在边界的边的处理:
可见,在开头和结尾会输出参与此次操作的半边 id,然后成功删除点后会输出 vertex,删除其他元素同理
Post #2 -
toolbar.cpp
scene.cpp
group.cpp
object.cpp
camera.cpp
C:\data\submissions\dandelion\src\scene\camera.cpp(55,17): error C2220: 以下警告被视为错误 [C:\data\submissions\tmp\build\dandelion.vcxproj]
C:\data\submissions\dandelion\src\scene\camera.cpp(55,17): warning C4189: “right”: 局部变量已初始化但不引用 [C:\data\submissions\tmp\build\dandelion.vcxproj]
light.cpp
stb_image_wrapper.cpp
kinetic_state.cpp
logger.cpp
rasterizer.cpp
rasterizer_renderer.cpp
C:\data\submissions\dandelion\src\render\rasterizer_renderer.cpp(101,41): error C2220: 以下警告被视为错误 [C:\data\submissions\tmp\build\dandelion.vcxproj]
C:\data\submissions\dandelion\src\render\rasterizer_renderer.cpp(101,41): warning C4244: “=”: 从“float”转换到“int”,可能丢失数据 [C:\data\submissions\tmp\build\dandelion.vcxproj]
C:\data\submissions\dandelion\src\render\rasterizer_renderer.cpp(102,41): warning C4244: “=”: 从“float”转换到“int”,可能丢失数据 [C:\data\submissions\tmp\build\dandelion.vcxproj]
C:\data\submissions\dandelion\src\render\rasterizer_renderer.cpp(112,52): warning C4267: “初始化”: 从“size_t”转换到“unsigned int”,可能丢失数据 [C:\data\submissions\tmp\build\dandelion.vcxproj]
whitted_renderer.cpp
render_engine.cpp
triangle.cpp
halfedge_mesh.cpp
正在生成代码...
正在编译...
meshedit.cpp
C:\data\submissions\dandelion\src\geometry\meshedit.cpp(76,15): error C2220: 以下警告被视为错误 [C:\data\submissions\tmp\build\dandelion.vcxproj]
C:\data\submissions\dandelion\src\geometry\meshedit.cpp(76,15): warning C4189: “e2”: 局部变量已初始化但不引用 [C:\data\submissions\tmp\build\dandelion.vcxproj]
C:\data\submissions\dandelion\src\geometry\meshedit.cpp(76,28): warning C4189: “e3”: 局部变量已初始化但不引用 [C:\data\submissions\tmp\build\dandelion.vcxproj]
C:\data\submissions\dandelion\src\geometry\meshedit.cpp(74,30): warning C4189: “p2”: 局部变量已初始化但不引用 [C:\data\submissions\tmp\build\dandelion.vcxproj]
halfedge.cpp
vertex.cpp
edge.cpp
face.cpp
solver.cpp
imgui.cpp
imgui_demo.cpp
imgui_draw.cpp
imgui_tables.cpp
imgui_widgets.cpp
imgui_impl_glfw.cpp
imgui_impl_opengl3.cpp
正在生成代码...
2.8 显示提交错误,产生了一大堆看不懂且毫无反馈效果的东西Post #5 -
经过实践,id 为空是不可以的,类中没有定义参数为空的构造函数
Post #4 -
是添加了的

这是我 cmakelist 的写法,我使用了 fetchcontent:
Post #4 -
您好,能说的更具体一些吗,是有什么问题,这是我文件的初始状态:

运行 cmake .

接着 make:

最后执行:
Post #3