```cpp void PSLGSSkeleton::handleEdgeEvent(PSLGEdge* event) { sslog::Logf(3, L"[EDGE] t=%.6f types=(%d,%d)", event->vanishTime, (int)event->tailvex->type, (int)event->headvex->type); //����ñ��˻�Ϊһ���� if (event->headvex == event->tailvex) {//如果头尾的节点一样,则删除这个事件 delete event->headvex; delete event; return; } //�����¶�������� QPointF collisionPoint = event->tailvex->movedPosition( event->vanishTime ); PSLGVertex* collisionvex = new PSLGVertex(collisionPoint, event->vanishTime); //边向内收缩时首次相遇的“交汇点” //�γ�����ֱ�Ǽ� if ( !PSLGVertex::equalPosition( event->tailvex->oriPosition, collisionPoint ) ) { skeleton.push_back( QLineF( event->tailvex->oriPosition, collisionPoint ) );//离的不太近就加入骨架 } if ( !PSLGVertex::equalPosition( event->headvex->oriPosition, collisionPoint ) ) { skeleton.push_back( QLineF( event->headvex->oriPosition, collisionPoint ) ); } //���������ʷ֣�����Ϊ��ʱ�� addTriangleMesh( event->tailvex, event->headvex, collisionPoint, event->vanishTime ); addTriangleMesh( event->tailvex->firstin->tailvex, event->tailvex, collisionPoint, event->vanishTime ); addTriangleMesh( event->headvex, event->headvex->firstout->headvex, collisionPoint, event->vanishTime ); //当场把骨架算法过程中新冒出来的三角形“补”进一张可渲染的三角网(或者说 三维屋顶网格)。一句话:“边每收缩一次,就用一个三角形把旧边和新碰撞点缝起来。 //�����¶��������ڱߵ����ӹ�ϵ PSLGVertex* p1 = event->tailvex;//p1 的“前一条”入边(firstin)原来指向 p1,现在把它的 终点 改成 collisionvex⇒ 这条入边 从 collisionvex 出发,走向 p1 的上游,完成左侧缝合。 PSLGVertex* p2 = event->headvex;//p2 的“后一条”出边(firstout)原来从 p2 出发,现在把它的 起点 改成 collisionvex⇒ 这条出边 从 p2 的下游走向 collisionvex,完成右侧缝合。 p1->firstin->headvex = collisionvex; p2->firstout->tailvex = collisionvex; collisionvex->firstin = p1->firstin; collisionvex->firstout = p2->firstout; collisionvex->type = PSLGVertexType::CONVEX_VERTEX; //����µ������ڱ�ƽ�У�ֱ�Ӹ��������ڱ���ʧʱ��Ϊ��ǰ��ʱ�䣬���ø��µ���ٶ� if ( std::abs( PSLGGraph::determinant( collisionvex->firstin->tailvex, collisionvex, collisionvex->firstout->headvex ) ) < eps ) {//是否共线 //collisionvex->type = PSLGVertexType::CONVEX_VERTEX; if ( collisionvex->firstin->vanishTime != event->vanishTime ) { eventQueue->heapUpdateKey( collisionvex->firstin->heapIndex, event->vanishTime );//共线就都退出序列 } if ( collisionvex->firstout->vanishTime != event->vanishTime ) { eventQueue->heapUpdateKey( collisionvex->firstout->heapIndex, event->vanishTime ); } } else { //�����¶�����ٶ� PSLGGraph::calcConvexVertexSpeed( collisionvex ); //�����¶�����ڱߵ���ʧʱ�� double t = PSLGGraph::calcEdgeVanishTime(collisionvex->firstin); eventQueue->heapUpdateKey(collisionvex->firstin->heapIndex, t); t = PSLGGraph::calcEdgeVanishTime(collisionvex->firstout); eventQueue->heapUpdateKey(collisionvex->firstout->heapIndex, t);//新拐角诞生 → 先给自己算速度 → 再让左右两条边重新‘挂号’,排队等下一次碰撞。 } //�ͷ��������Լ�������Ŀռ䣨���Ѿ��ڶ�����ɾ���� delete p1; delete p2; delete event; event = NULL; } ```