直骨架的研究:边事件

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

}

```

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • 直骨架的研究/边事件.txt
  • 最后更改: 2025/10/15 15:29
  • 张叶安