Files
Timeline_Generator/IMPROVEMENTS_v3.md
beabigegg 2d37d23bcf v9.5: 實作標籤完全不重疊算法
- 新增 _calculate_lane_conflicts_v2() 分開返回標籤重疊和線穿框分數
- 修改泳道選擇算法,優先選擇無標籤重疊的泳道
- 兩階段搜尋:優先側別無可用泳道則嘗試另一側
- 增強日誌輸出,顯示標籤範圍和詳細衝突分數

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 11:35:29 +08:00

231 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 時間軸標籤避碰改進v3.0 - 平滑曲線與時間分離
## 新增改進v3.0
### 1. **平滑曲線連接 - 避免視覺阻礙**
#### 問題
- Z 形折線雖然清晰,但仍可能阻礙其他文字框或連線
- 多條連線交叉時造成視覺混亂
#### 解決方案
使用**平滑曲線 + 虛線 + 半透明**組合:
```python
# 5 個控制點創建平滑曲線
line_x_points = [
event_x, # 起點:事件點
event_x, # 垂直上升
curve_x, # 曲線控制點(帶偏移)
label_x, # 水平接近
label_x # 終點:標籤
]
# Y 座標使用漸進式高度
line_y_points = [
0, # 起點
mid_y * 0.7, # 70% 高度
mid_y, # 中間高度
mid_y * 0.7, # 70% 高度
label_y # 終點
]
# 視覺優化
line: {
'color': event_color,
'width': 1,
'dash': 'dot', # 虛線
}
opacity: 0.6 # 半透明
```
**優勢**
- ✅ 虛線樣式不會完全遮擋背後內容
- ✅ 半透明60%)減少視覺阻礙
- ✅ 平滑曲線更自然、更專業
- ✅ 5 個控制點創造弧形路徑,避免直線交叉
---
### 2. **時間與標題分離顯示**
#### 問題
- 標籤框同時顯示標題和時間,導致框體過大
- 框體越大,避碰越困難
#### 解決方案
**時間顯示在事件點旁邊**,標籤框只顯示標題:
```python
# 時間標籤(靠近事件點)
annotations.append({
'x': event_x,
'y': -0.15, # 在時間軸下方
'text': f"{date_str}<br>{time_str}",
'font': {'size': 9},
'bgcolor': 'rgba(255, 255, 255, 0.95)',
'bordercolor': event_color,
'borderwidth': 1,
'borderpad': 2
})
# 標題標籤(在連線終點)
annotations.append({
'x': label_x,
'y': label_y,
'text': f"<b>{title}</b>", # 只顯示標題
'font': {'size': 11},
'borderwidth': 2,
'borderpad': 6
})
```
**優勢**
- ✅ 標籤框更小,避碰更容易
- ✅ 時間緊貼事件點,對應關係清晰
- ✅ 標題框可以更大、更醒目
- ✅ 視覺層次更分明
---
### 3. **時間精度到時分秒**
#### 改進前
```
日期: 2024-01-01
```
#### 改進後
```
2024-01-01
14:30:00
```
**格式**
- 日期:`%Y-%m-%d`
- 時間:`%H:%M:%S`
- Hover 提示:`%Y-%m-%d %H:%M:%S`
---
## 完整改進對比
### v1.0(初版)
- ❌ 直線連接
- ❌ 標籤固定位置
- ❌ 只有日期
- ❌ 容易重疊
### v2.02D 避碰)
- ✅ Z 形折線
- ✅ 標籤可偏移
- ✅ 智能避碰
- ⚠️ 折線可能阻礙
### v3.0(平滑曲線 + 時間分離)
-**平滑曲線(虛線 + 半透明)**
-**時間顯示在點旁邊**
-**標題與時間分離**
-**時分秒精度**
-**最小視覺阻礙**
---
## 視覺效果
### 連線樣式
```
事件點 ●
┆ (虛線60% 透明)
╰─→ 標題框
```
### 時間標籤位置
```
┌─────────┐
│ 標題 │ ← 標籤框(只有標題)
└─────────┘
┆ (平滑曲線)
┌────────┐
│2024-01 │ ← 時間標籤(在點旁邊)
│14:30:00│
└────────┘
```
---
## 關鍵參數
```python
# 連線樣式
line_width = 1 # 細線
line_dash = 'dot' # 虛線
line_opacity = 0.6 # 60% 透明
# 時間標籤
time_font_size = 9 # 小字體
time_position_y = -0.15 # 軸下方
# 標題標籤
title_font_size = 11 # 較大字體
title_borderwidth = 2 # 較粗邊框
title_borderpad = 6 # 較大內距
```
---
## 測試方法
```batch
start_dev.bat
```
訪問 http://localhost:12010測試示範檔案
- `demo_project_timeline.csv` - 15 個事件
- `demo_life_events.csv` - 11 個事件
- `demo_product_roadmap.csv` - 14 個事件
**預期效果**
- ✅ 平滑虛線連接,半透明不阻擋
- ✅ 時間標籤緊貼事件點
- ✅ 標題框簡潔醒目
- ✅ 時分秒精度顯示
- ✅ 整體視覺清爽專業
---
## 技術實現
### 平滑曲線演算法
使用 5 個控制點創建漸進式曲線:
1. **起點**:事件點 (event_x, 0)
2. **上升點**(event_x, mid_y × 0.7)
3. **曲線頂點**(curve_x, mid_y) - 帶水平偏移
4. **下降點**(label_x, mid_y × 0.7)
5. **終點**:標籤位置 (label_x, label_y)
**曲線偏移計算**
```python
x_diff = abs((label_x - event_x).total_seconds())
curve_offset = timedelta(seconds=x_diff * 0.2) # 20% 偏移
```
---
## 未來改進方向
1. **貝茲曲線**:使用真正的貝茲曲線(需要更複雜的數學計算)
2. **路徑避障**:實現 A* 演算法自動繞過文字框
3. **動態透明度**:根據重疊程度調整透明度
4. **智能顏色**:根據背景自動調整連線顏色
---
**版本**: v3.0
**更新日期**: 2025-11-05
**作者**: Claude AI