Skip to content

feat: 屋内マップでの壁による電波遮断表示機能の実装 #21

@harutiro

Description

@harutiro

概要

屋内マップにアンテナを配置した際、扇形の電波範囲を表示する際に壁(黒い部分)による遮断を考慮し、白い部分(廊下)では電波がまっすぐ通り、黒い部分(壁)に当たった場所で線が止まるように実装しました。

実装内容

新規追加されたコンポーネント

1. WaveRangeWithOcclusionView

  • 場所: UWBViewerSystem/Presentation/Components/AntennaMarker.swift (307-390行)
  • 機能: 0.1度刻みで電波の線を描画し、壁に当たった場所で線を停止
  • 特徴:
    • Canvas APIを使用した高精度描画
    • アンテナの回転角度を考慮した方向計算
    • 詳細なデバッグログ出力

2. WallDetector

  • 場所: UWBViewerSystem/Presentation/Components/AntennaMarker.swift (391-581行)
  • 機能: フロアマップ画像から壁部分を検出
  • 特徴:
    • クロスプラットフォーム対応(iOS/macOS)
    • iOS版: ピクセルデータキャッシュによる高速化
    • macOS版: NSBitmapImageRepによる効率的なピクセルアクセス
    • 輝度30%以下を壁として判定

3. SimpleSectorView

  • 場所: UWBViewerSystem/Presentation/Components/AntennaMarker.swift (246-285行)
  • 機能: フォールバック用の従来の扇形描画
  • 用途: フロアマップ画像が利用できない場合

拡張されたコンポーネント

1. SensorRangeViewの拡張

  • フロアマップ画像とキャンバスジオメトリ情報を受け取るように拡張
  • 壁検出の有無に応じて適切な描画方式を選択

2. AntennaDisplayDataの拡張

  • floorMapImagecanvasGeometryプロパティを追加
  • 壁検出に必要な情報を格納

更新されたView

1. AntennaPositioningView

  • 場所: UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift (172-174行)
  • 変更: AntennaDisplayData作成時にフロアマップ情報を渡すように修正

2. SimpleCalibrationView

  • 場所: UWBViewerSystem/Presentation/Scenes/FloorMapTab/SystemCalibrationPage/SimpleCalibrationView.swift (279-280行)
  • 変更: AntennaDisplayData作成時にフロアマップ情報を渡すように修正

技術的詳細

壁検出アルゴリズム

  1. 座標変換: キャンバス座標 → 正規化座標 → ピクセル座標
  2. 線の描画: 0.1度刻みで-60°から+60°まで(計120°の扇形)
  3. 壁検出: 各角度での線上を1ピクセルずつ検査
  4. 停止条件: 輝度30%以下のピクセルに到達した時点で線を停止

最適化

  • iOS: ピクセルデータの事前キャッシュによる高速アクセス
  • macOS: NSBitmapImageRepのcolorAt()メソッドによる効率的アクセス
  • メモリ管理: 適切なdeinitでピクセルデータを解放

デバッグ機能

  • 詳細ログ出力: 座標変換、壁検出プロセスを可視化
  • 設定可能: enableDebugLoggingフラグで制御
  • パフォーマンス監視: チェック回数と結果の統計

テスト結果

  • ✅ 全89テスト通過
  • ✅ ビルド成功
  • ✅ SwiftFormat適用済み

影響範囲

  • 新機能の追加(破壊的変更なし)
  • 既存のフォールバック機能により後方互換性を維持
  • パフォーマンス向上(特にiOS版)

今後の改善点

  1. 壁検出しきい値の調整可能化
  2. 角度刻みの設定可能化
  3. より高度な壁検出アルゴリズム(グラデーション対応等)

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions