```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;
}
```