Compare commits

...

2 Commits

Author SHA1 Message Date
Outbreak2096 066f9b82df
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (72 of 72 strings)

Translation: Topola/Topola
Translate-URL: https://translate.codeberg.org/projects/topola/topola/zh_Hans/
2025-11-19 18:30:14 +00:00
Mikolaj Wielgus 5e8d5974f4 refactor(astar): Add interface to separately push single node and pop 2025-11-19 19:29:38 +01:00
3 changed files with 34 additions and 26 deletions

View File

@ -94,6 +94,7 @@ allowed_scopes = [
"router/router", "router/router",
"router/thetastar", "router/thetastar",
"specctra/design", "specctra/design",
"astar",
"stepper", "stepper",
"triangulation", "triangulation",
] ]

View File

@ -51,17 +51,17 @@ tr-menu-route-options-squeeze-through-under-bends = 弯曲处挤线
tr-menu-view-kdb-scroll-delta-factor = 键盘滚动增量因子 tr-menu-view-kdb-scroll-delta-factor = 键盘滚动增量因子
tr-menu-debug-show-pathfinding-scores = 显示路径查找分数 tr-menu-debug-show-pathfinding-scores = 显示路径查找分数
tr-menu-place-place-route-plan = 放置布线规划 tr-menu-place-place-route-plan = 放置布线规划
tr-menu-route-topo-autoroute = 拓扑平面自动布线 tr-menu-route-topo-autoroute = 拓扑平面自动布线
tr-menu-debug-show-triangulation = 显示三角剖分 tr-menu-debug-show-triangulation = 显示三角剖分
tr-menu-debug-show-triangulation-constraints = 显示三角剖分约束条件 tr-menu-debug-show-triangulation-constraints = 显示三角剖分约束条件
tr-menu-route-options-presort-by = 预排序依据 tr-menu-route-options-presort-by = 预排序依据
tr-menu-route-options-presort-by-ratline-intersection-count-and-length = 交叉点数量及长度 tr-menu-route-options-presort-by-ratline-intersection-count-and-length = 交叉点数量及长度
tr-menu-route-options-permutate = 排列组合 tr-menu-route-options-permutate = 排列组合
tr-menu-debug-show-guide-circles = 显示辅助圆 tr-menu-debug-show-guide-circles = 显示辅助圆
tr-menu-debug-show-guide-bitangents = 显示双切线 tr-menu-debug-show-guide-bitangents = 显示双切线
tr-menu-debug-show-primitive-indices = 显示图元索引 tr-menu-debug-show-primitive-indices = 显示图元索引
tr-menu-route-planar-autoroute = 平面自动布线 tr-menu-route-planar-autoroute = 平面自动布线
tr-menu-route-fanout-clearance = 扇出间距 tr-menu-route-fanout-clearance = 扇出间距
tr-menu-debug = 调试 tr-menu-debug = 调试
tr-menu-debug-fix-step-rate = 固定步进速率 tr-menu-debug-fix-step-rate = 固定步进速率
tr-menu-debug-highlight-obstacles = 高亮障碍物 tr-menu-debug-highlight-obstacles = 高亮障碍物

View File

@ -36,30 +36,37 @@ impl<N: Clone + Ord, S: Add<S, Output = S> + Copy + Default + PartialOrd> Astar<
} }
pub fn expand(&mut self, new_nodes: &[(S, S, N)]) -> Option<N> { pub fn expand(&mut self, new_nodes: &[(S, S, N)]) -> Option<N> {
let curr_g_score = self.g_scores.get(&self.curr_node).unwrap().clone(); for new_node in new_nodes {
self.push(new_node.clone());
for (edge_g_cost, h_heuristic, node) in new_nodes {
match self.g_scores.entry(node.clone()) {
Entry::Occupied(mut entry) => {
let entry_score = *entry.get();
if curr_g_score + *edge_g_cost >= entry_score {
continue;
}
entry.insert(curr_g_score + *edge_g_cost);
}
Entry::Vacant(entry) => {
entry.insert(curr_g_score + *edge_g_cost);
}
}
self.frontier.push(MinScored(
curr_g_score + *edge_g_cost + *h_heuristic,
node.clone(),
));
} }
self.pop()
}
pub fn push(&mut self, new_node: (S, S, N)) {
let curr_g_score = self.g_scores.get(&self.curr_node).unwrap().clone();
let (edge_g_cost, h_heuristic, node) = new_node;
match self.g_scores.entry(node.clone()) {
Entry::Occupied(mut entry) => {
let entry_score = *entry.get();
if curr_g_score + edge_g_cost >= entry_score {
return;
}
entry.insert(curr_g_score + edge_g_cost);
}
Entry::Vacant(entry) => {
entry.insert(curr_g_score + edge_g_cost);
}
}
self.frontier
.push(MinScored(curr_g_score + edge_g_cost + h_heuristic, node));
}
pub fn pop(&mut self) -> Option<N> {
MinScored(_ /*f_score*/, self.curr_node) = self.frontier.pop()?; MinScored(_ /*f_score*/, self.curr_node) = self.frontier.pop()?;
Some(self.curr_node.clone()) Some(self.curr_node.clone())
} }