差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
| 直骨架的研究 [2025/09/25 18:17] – 张叶安 | 直骨架的研究 [2025/10/16 11:17] (当前版本) – 张叶安 | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | https:// | ||
| + | |||
| + | {{ : | ||
| + | |||
| - [[直骨架的研究: | - [[直骨架的研究: | ||
| - [[直骨架的研究: | - [[直骨架的研究: | ||
| 行 72: | 行 76: | ||
| - [[直骨架的研究: | - [[直骨架的研究: | ||
| + | {{pasted: | ||
| + | |||
| + | 利用原始多边形和由它导出的摩托图,我们构建一个平面图,即为扩展的波前, | ||
| + | |||
| + | 在整个算法中,我们对波前中的边进行离散事件模拟,即维护一个最小优先级队列,波前中所有的边构成队列的元素(事件),边的消失时间为对应事件的优秀级。我们从初始的拓展波前$W*(G, | ||
| + | |||
| + | | ||
| + | |||
| + | Edge Event: 两个凸点 u,v 间的边 e 消亡,如图 9(a) 所示。我们将 e 从原图中删除,并将 u,v 点合并为一个新的凸点 w。 | ||
| + | 与点 w 相连的两条边将决定 w 的速度,因此,我们需要更新与 w 相连的两条边的消亡时间,并在 Q 中修改相应的项。当w 的两条边平行的时候,如果按这两条边来求 w 得速度,w的速度将趋向于无穷大,这将会导致后续的计算出现问题。我们对这种情况做特殊处理,将 w 的速度设为 0。最后,我们需要向直骨架中添加两条边 vw 和 uw。 | ||
| + | |||
| + | Split Event: | ||
| + | |||
| + | Start Event: | ||
| + | 一般情况下 Start Event 不会向直骨架中贡献一条边,特殊情况(1)中三角形消失,其中的凸点会给直骨架增加一条边。 | ||
| + | |||
| + | |||
| + | Switch Event: | ||
| + | |||
| + | Multi Start Event: | ||
| - | I’m going to do three things to move this forward: | + | Multi Split Event:连接凹点v1.., |
| - | • Inspect the tail of your latest debug log to see where time stalls happen and whether our time “kick” is taking effect. | + | l1,r1, |
| - | • Search the codebase for places that may be re-enqueuing edges with stale/zero times. | + | |
| - | • Patch those spots to enforce strictly monotonic event times. | + | |
| - | What I did just now: | + | Remainning Event:如果两个 Moving Steiner Vertex 构成的边 e消失,直接删除相应的边以及顶点即可。该事件不会增加直骨架边。 |
| - | 1) Read the latest log tail | + | 除了上面七种事件外,其他的点的组合构成的事件不会发生。 |
| - | • Observations: | + | |
| - | 2) Searched the code for MovedPosition and direct heap updates | + | [[直骨架的研究:代码分析]] |
| - | • I searched all MovedPosition call sites and the event re-queue/ | + | |
| - | • I found several direct calls to eventQueue.HeapUpdateKey(...) inside: | + | |
| - | ◦ Skeleton.handleMultiStartEvent.cs | + | |
| - | ◦ Skeleton.handleMultiSplitEvent.cs | + | |
| - | • These were re-queueing edges using raw Graph.calcEdgeVanishTime(e) without clamping to the current algorithm time. That can reintroduce near-current or back-in-time events and cause micro-step loops. | + | |
| - | 3) Applied patches to enforce monotonic event times in MultiStart/ | + | [[直骨架的研究:鞋带公式]] |
| - | • Replaced all direct eventQueue.HeapUpdateKey(...) in MultiStart/ | + | |
| - | ◦ __RecomputeAndUpdateEdge(e) | + | |
| - | • For new edges inserted during MultiStart, I also clamp the initial vanish time before insertion: | + | |
| - | ◦ t = Graph.calcEdgeVanishTime(e) | + | |
| - | ◦ if (double.IsNaN(t) || t < _dbgCurTime + 1e-9) t = _dbgCurTime + 1e-9 | + | |
| - | ◦ e.VanishTime = t; eventQueue.minHeapInsert(e) | + | |
| - | • These changes ensure any event times after MultiStart/ | + | |
| - | What I propose next | + | [[直骨架的研究:射线法]] |
| - | • Please rerun the star/ | + | |
| - | • If it still appears stuck, share the last ~200 lines of the updated log again so I can confirm whether: | + | |
| - | ◦ Any remaining direct re-queues with stale times exist. | + | |
| - | ◦ The “kick” is firing repeatedly. | + | |
| - | ◦ Any adjacency violations or iteration-cap warnings are printed. | + | |
| - | If the issue persists, my next steps will be: | + | [[直骨架的研究:边事件]] |
| - | • Audit any remaining places that compute vanish times (e.g., Graph code that sets initial vanish times when building motorcycle/ | + | |
| - | • Consider increasing the stall “kick” magnitude slightly if the geometry scale demands it, but I’d prefer to keep it minimal unless the logs indicate repeated re-kicks at the same time. | + | |
| - | Would you like me to tail the new log once you run it again? If so, I can open the last 200–1000 lines to verify event progression. | + | [[直骨架的研究: |