專案

一般

配置概況

動作

Feature #180

已結束
SC SC

新增多邊形 ROI 繪製工具、Undo/Redo 歷史堆疊機制,及多邊形計分與視覺化

Feature #180: 新增多邊形 ROI 繪製工具、Undo/Redo 歷史堆疊機制,及多邊形計分與視覺化

是由 Sashiba Chou16 天 前加入. 於 16 天 前更新.

狀態:
Closed
優先權:
Normal
被分派者:
開始日期:
2026-03-19
完成日期:
2026-03-19
完成比例:

100%

預估工時:
2:00 小時
耗用工時:

概述

背景

教師後台的 ROI 標記工具原本僅支援圓圈(Circle),無法精確標記不規則形狀的病灶區域。本次迭代新增多
邊形(Polygon)繪製工具,支援直線段與二次貝茲曲線段,並將 Undo/Redo 升級為完整的歷史堆疊機制。

變更範圍

  1. TeacherTool.jsx — 多邊形繪製工具與歷史堆疊
  • 新增 activeTool 狀態,提供 Circle / Polygon 工具切換選擇器
  • 實作多邊形繪製邏輯:點擊放置錨點(直線)、Shift+點擊拖曳建立二次貝茲曲線控制點、點擊起始錨點封
    多邊形
  • 支援 Shift+點擊封閉以曲線收尾(closingCurveRef 追蹤封閉拖曳狀態)
  • 新增 Undo/Redo/Clear All 歷史堆疊,快照結構為 { rois, drawingPolygon },使用 historyIndexRef
    避免閉包陳舊值
  • Canvas 渲染擴充:已完成的 polygon ROI(紅色實線)、進行中的 polygon(橘色虛線 + 預覽線 +
    錨點圓點 + 綠色封閉提示)
  • 儲存時若有未封閉 polygon 會彈出確認提示
  • 切換工具/圖片/分類時正確重置所有新狀態
  1. server/index.js — 多邊形計分邏輯
  • 新增
    isPointInCircle()、bezierToLineSegments()、isPointInPolygon()(ray-casting)、isPointInROI()
    工具函式
  • scoreAnswer() 中的兩處內聯距離判斷改為呼叫 isPointInROI(),支援 circle 與 polygon 兩種 ROI 類型
  1. GameClient.jsx / PracticeGame.jsx — 多邊形視覺化
  • 答題後顯示的真值 ROI 區段新增 polygon 分支,使用 moveTo/lineTo/quadraticCurveTo
    繪製,套用各自的座標轉換(zoom + panOffset)
  • 視覺風格與現有圓圈 ROI 一致:綠色虛線 #00ff88 + 半透明填充
  1. 文件更新
  • architecture.md:更新 ROI 資料結構、計分碰撞檢測說明、題庫管理功能描述、檔案行數
  • README.md:新增主要功能摘要、展開專案結構至元件層級
  • ROI.md:從需求 prompt 改為需求與實作紀錄

ROI 資料結構

Circle: { type: "circle", x, y, radius }
Polygon: { type: "polygon", points: [{x,y},...], segments: [{type:"line"} | {type:"curve", cpx,
cpy},...] }

SC 是由 Sashiba Chou16 天 前更新 動作 #1

  • 狀態New 變更為 Closed
動作

匯出至 PDF Atom