星空识别助手应用


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

image-20260409180200351

image-20260409180239465

image-20260409180248837

image-20260409180253683

1.1 应用简介

星空识别助手是一款科技探索类应用,为天文爱好者和星空探索者提供专业的星空识别与天文知识科普服务。应用以深蓝色为主色调,象征浩瀚宇宙的神秘与深邃。界面设计采用沉浸式星空风格,让用户仿佛置身于璀璨星河之中。

应用通过模拟AR技术识别夜空中的星星与星座,提供丰富的天文知识科普内容,帮助用户认识星空、了解宇宙。无论是初学者还是资深天文爱好者,都能在这里找到探索星空的乐趣。仰望星空,探索宇宙的奥秘,从这里开始。

1.2 核心功能

功能模块 功能描述 实现方式
AR识别 模拟星空识别 CustomPaint绘制
星座图鉴 16种星座展示 网格卡片布局
天文知识 知识科普内容 分类列表展示
观测记录 记录观测历史 本地数据存储
星等系统 五等星分类 枚举类型定义
今晚亮点 天文事件推荐 信息卡片展示

1.3 星座分类体系

应用支持16种星座识别:

类型 星座名称 英文名 观测期 象征意义
黄道 白羊座 Aries 3月21日-4月19日 勇敢的先驱者
黄道 金牛座 Taurus 4月20日-5月20日 坚定的守护者
黄道 双子座 Gemini 5月21日-6月21日 智慧的传播者
黄道 巨蟹座 Cancer 6月22日-7月22日 温柔的守护者
黄道 狮子座 Leo 7月23日-8月22日 王者之风
黄道 处女座 Virgo 8月23日-9月22日 完美主义者
黄道 天秤座 Libra 9月23日-10月23日 公正的裁决者
黄道 天蝎座 Scorpio 10月24日-11月22日 神秘的探索者
黄道 射手座 Sagittarius 11月23日-12月21日 自由的冒险家
黄道 摩羯座 Capricorn 12月22日-1月19日 坚韧的攀登者
黄道 水瓶座 Aquarius 1月20日-2月18日 创新的先驱
黄道 双鱼座 Pisces 2月19日-3月20日 浪漫的梦想家
北天 猎户座 Orion 冬季星座 猎人
北天 大熊座 Ursa Major 全年可见 北斗七星
北天 仙后座 Cassiopeia 全年可见 W形
夏季 天鹅座 Cygnus 夏季星座 北十字

1.4 星等分类系统

星等 名称 亮度系数 颜色 示例
一等星 First 1.0 #FFFFFF 天狼星、织女星
二等星 Second 0.8 #F5F5F5 北极星
三等星 Third 0.6 #E0E0E0 参宿三
四等星 Fourth 0.4 #BDBDBD 普通可见星
五等星 Fifth 0.2 #9E9E9E 肉眼极限

1.5 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
状态管理 setState -
动画系统 AnimationController -
目标平台 鸿蒙OS / Web API 21+

1.6 项目结构

lib/
└── main_star_recognition.dart
    ├── StarRecognitionApp           # 应用入口
    ├── ConstellationType            # 星座类型枚举
    ├── StarBrightness               # 星等枚举
    ├── Star                         # 星星模型
    ├── AstronomyKnowledge           # 天文知识模型
    ├── ObservationRecord            # 观测记录模型
    ├── StarRecognitionHomePage      # 主页面(底部导航)
    ├── _buildScanPage               # 识别页面
    ├── _buildConstellationPage      # 星座页面
    ├── _buildKnowledgePage          # 知识页面
    ├── _buildRecordsPage            # 记录页面
    ├── StarFieldPainter             # 星空绘制器
    └── ScanLinePainter              # 扫描线绘制器

二、设计理念

2.1 星空识别可视化

星空识别助手

AR识别

星座图鉴

天文知识

观测记录

星空模拟

扫描动画

星座识别

黄道星座

北天星座

季节星座

恒星物理

星系知识

宇宙奥秘

观测统计

历史记录

添加记录

2.2 探索流程模型

星空探索

识别阶段

打开AR识别

扫描星空

识别星座

学习阶段

浏览星座图鉴

阅读天文知识

了解观测指南

记录阶段

添加观测记录

查看历史记录

统计观测数据

2.3 色彩体系

应用采用深蓝色为主色调:

颜色类型 色值 RGB 用途
主色 #1A237E 26,35,126 导航、按钮、强调
深空色 #0D1B2A 13,27,42 星空背景
夜空色 #1B263B 27,38,59 渐变背景
星光色 #FFFFFF 255,255,255 星星颜色
强调色 #FFC107 255,193,7 重要信息标识

2.4 星座识别流程

结果展示 星座数据库 扫描动画 AR界面 用户 结果展示 星座数据库 扫描动画 AR界面 用户 点击开始识别 启动扫描动画 模拟识别过程 返回星座信息 显示识别结果

三、系统架构

3.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
StarRecognitionHomePage

识别页

星座页

知识页

记录页

星空模拟器

扫描动画

识别结果

星座网格

星座详情

知识分类

知识卡片

统计卡片

记录列表

星空生成器
随机星星生成

识别引擎
模拟星座识别

知识管理
科普内容

Star
星星模型

ConstellationType
星座枚举

AstronomyKnowledge
知识模型

ObservationRecord
记录模型

3.2 类图设计

manages

manages

uses

has

belongs to

references

paints

StarRecognitionApp

+Widget build()

«enumeration»

ConstellationType

+aries 白羊座

+taurus 金牛座

+gemini 双子座

+cancer 巨蟹座

+leo 狮子座

+virgo 处女座

+libra 天秤座

+scorpio 天蝎座

+sagittarius 射手座

+capricorn 摩羯座

+aquarius 水瓶座

+pisces 双鱼座

+orion 猎户座

+ursaMajor 大熊座

+cassiopeia 仙后座

+cygnus 天鹅座

+String chineseName

+String englishName

+String period

+Color color

+String description

«enumeration»

StarBrightness

+first 一等星

+second 二等星

+third 三等星

+fourth 四等星

+fifth 五等星

+String label

+double intensity

+Color color

Star

+String id

+String name

+double x

+double y

+StarBrightness brightness

+ConstellationType constellation

+String description

AstronomyKnowledge

+String id

+String title

+String category

+String content

+IconData icon

+Color color

ObservationRecord

+String id

+DateTime date

+ConstellationType constellation

+String notes

+int starCount

StarRecognitionHomePage

-int _currentIndex

-List<Star> _visibleStars

-List<ObservationRecord> _records

-bool _isScanning

-ConstellationType _selectedConstellation

-AnimationController _twinkleController

-AnimationController _scanController

+void _generateStars()

+void _startScan()

+void _addNewRecord()

StarFieldPainter

-List<Star> stars

-double twinkleValue

+void paint()

ScanLinePainter

-double progress

+void paint()

3.3 星空绘制流程

星星数据 Canvas 星空绘制器 动画控制器 星星数据 Canvas 星空绘制器 动画控制器 loop [每颗星星] 触发重绘(twinkleValue) 遍历星星列表 返回星星属性 计算闪烁效果 绘制星星 完成绘制

四、核心功能实现

4.1 星座类型枚举

定义16种星座类型:

enum ConstellationType {
  aries('白羊座', 'Aries', '3月21日-4月19日', Color(0xFFFF5722), '勇敢的先驱者'),
  taurus('金牛座', 'Taurus', '4月20日-5月20日', Color(0xFF4CAF50), '坚定的守护者'),
  gemini('双子座', 'Gemini', '5月21日-6月21日', Color(0xFFFFEB3B), '智慧的传播者'),
  cancer('巨蟹座', 'Cancer', '6月22日-7月22日', Color(0xFF2196F3), '温柔的守护者'),
  leo('狮子座', 'Leo', '7月23日-8月22日', Color(0xFFFF9800), '王者之风'),
  virgo('处女座', 'Virgo', '8月23日-9月22日', Color(0xFF9C27B0), '完美主义者'),
  libra('天秤座', 'Libra', '9月23日-10月23日', Color(0xFF00BCD4), '公正的裁决者'),
  scorpio('天蝎座', 'Scorpio', '10月24日-11月22日', Color(0xFFE91E63), '神秘的探索者'),
  sagittarius('射手座', 'Sagittarius', '11月23日-12月21日', Color(0xFF795548), '自由的冒险家'),
  capricorn('摩羯座', 'Capricorn', '12月22日-1月19日', Color(0xFF607D8B), '坚韧的攀登者'),
  aquarius('水瓶座', 'Aquarius', '1月20日-2月18日', Color(0xFF03A9F4), '创新的先驱'),
  pisces('双鱼座', 'Pisces', '2月19日-3月20日', Color(0xFF8BC34A), '浪漫的梦想家'),
  orion('猎户座', 'Orion', '冬季星座', Color(0xFF3F51B5), '猎人'),
  ursaMajor('大熊座', 'Ursa Major', '全年可见', Color(0xFF009688), '北斗七星'),
  cassiopeia('仙后座', 'Cassiopeia', '全年可见', Color(0xFFFFC107), 'W形'),
  cygnus('天鹅座', 'Cygnus', '夏季星座', Color(0xFF673AB7), '北十字');

  final String chineseName;
  final String englishName;
  final String period;
  final Color color;
  final String description;

  const ConstellationType(this.chineseName, this.englishName, 
      this.period, this.color, this.description);
}

4.2 星等枚举

定义五等星分类:

enum StarBrightness {
  first('一等星', 1.0, Color(0xFFFFFFFF)),
  second('二等星', 0.8, Color(0xFFF5F5F5)),
  third('三等星', 0.6, Color(0xFFE0E0E0)),
  fourth('四等星', 0.4, Color(0xFFBDBDBD)),
  fifth('五等星', 0.2, Color(0xFF9E9E9E));

  final String label;
  final double intensity;
  final Color color;

  const StarBrightness(this.label, this.intensity, this.color);
}

4.3 星空生成器

随机生成星星数据:

void _generateStars() {
  final random = Random();
  _visibleStars = [];

  for (int i = 0; i < 150; i++) {
    final brightness = StarBrightness.values[random.nextInt(StarBrightness.values.length)];
    final constellation = random.nextDouble() > 0.6
        ? ConstellationType.values[random.nextInt(ConstellationType.values.length)]
        : null;

    _visibleStars.add(Star(
      id: 'star_$i',
      name: constellation != null ? '${constellation.chineseName}区星${i + 1}' : '星${i + 1}',
      x: random.nextDouble(),
      y: random.nextDouble(),
      brightness: brightness,
      constellation: constellation,
      description: brightness.label,
    ));
  }
}

4.4 星空绘制器

使用CustomPaint绘制星空:

class StarFieldPainter extends CustomPainter {
  final List<Star> stars;
  final double twinkleValue;

  
  void paint(Canvas canvas, Size size) {
    final random = Random(42);

    for (final star in stars) {
      final x = star.x * size.width;
      final y = star.y * size.height;
      final baseRadius = 1.0 + star.brightness.intensity * 2;
      final twinkle = 0.7 + 0.3 * sin((random.nextDouble() * 2 * pi) + twinkleValue * pi);
      final radius = baseRadius * twinkle;

      final paint = Paint()
        ..color = star.brightness.color.withOpacity(star.brightness.intensity * twinkle)
        ..maskFilter = MaskFilter.blur(BlurStyle.normal, radius * 0.5);

      canvas.drawCircle(Offset(x, y), radius, paint);

      if (star.brightness == StarBrightness.first) {
        final glowPaint = Paint()
          ..color = Colors.white.withOpacity(0.1 * twinkle)
          ..maskFilter = MaskFilter.blur(BlurStyle.normal, radius * 3);
        canvas.drawCircle(Offset(x, y), radius * 3, glowPaint);
      }
    }
  }
}

4.5 扫描动画

实现AR扫描效果:

class ScanLinePainter extends CustomPainter {
  final double progress;

  
  void paint(Canvas canvas, Size size) {
    final y = size.height * progress;

    final linePaint = Paint()
      ..color = const Color(0xFF1A237E).withOpacity(0.5)
      ..strokeWidth = 2;

    canvas.drawLine(Offset(0, y), Offset(size.width, y), linePaint);

    final glowPaint = Paint()
      ..color = const Color(0xFF1A237E).withOpacity(0.2)
      ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 20);
    canvas.drawRect(Rect.fromLTWH(0, y - 20, size.width, 40), glowPaint);

    final targetPaint = Paint()
      ..color = Colors.white.withOpacity(0.3)
      ..style = PaintingStyle.stroke
      ..strokeWidth = 1;

    final centerX = size.width / 2;
    final centerY = size.height / 2;
    final targetSize = 80.0;

    canvas.drawRect(
      Rect.fromCenter(center: Offset(centerX, centerY), width: targetSize, height: targetSize),
      targetPaint,
    );
  }
}

4.6 星座详情弹窗

展示星座详细信息:

void _showConstellationDetail(ConstellationType constellation) {
  showModalBottomSheet(
    context: context,
    isScrollControlled: true,
    builder: (context) => DraggableScrollableSheet(
      initialChildSize: 0.7,
      maxChildSize: 0.9,
      builder: (context, scrollController) {
        return Container(
          child: Column(
            children: [
              Container(
                padding: const EdgeInsets.all(24),
                decoration: BoxDecoration(
                  gradient: LinearGradient(
                    colors: [
                      constellation.color.withOpacity(0.2),
                      constellation.color.withOpacity(0.05),
                    ],
                  ),
                ),
                child: Column(
                  children: [
                    Icon(Icons.star, color: constellation.color, size: 48),
                    Text(constellation.chineseName, style: TextStyle(fontSize: 28)),
                    Text(constellation.englishName, style: TextStyle(color: constellation.color)),
                  ],
                ),
              ),
              ElevatedButton.icon(
                onPressed: () {
                  Navigator.pop(context);
                  setState(() {
                    _selectedConstellation = constellation;
                    _currentIndex = 0;
                  });
                },
                icon: const Icon(Icons.camera_alt),
                label: const Text('开始识别此星座'),
              ),
            ],
          ),
        );
      },
    ),
  );
}

五、UI设计规范

5.1 配色方案

应用采用深蓝色为主色调:

颜色类型 色值 用途
主色 #1A237E 导航、按钮、强调
深空色 #0D1B2A 星空背景
夜空色 #1B263B 渐变背景
星光色 #FFFFFF 星星颜色
强调色 #FFC107 重要信息标识

5.2 字体规范

元素 字号 字重 颜色
页面标题 20px Bold #000000
星座名称 16px Bold #000000
英文名称 12px Regular 星座颜色
观测期 11px Regular #00000054
知识内容 14px Regular #00000087

5.3 组件规范

5.3.1 AR识别界面
┌─────────────────────────────────────────┐
│ [AR模拟]                          [REC] │
├─────────────────────────────────────────┤
│                                         │
│      ✦        ✧           ✦            │
│   ✧     ✦         ✧          ✦         │
│        ✦    ✧        ✦                  │
│   ┌─────────────────┐                   │
│   │    ───┼───      │                   │
│   │       │         │                   │
│   └─────────────────┘                   │
│        ✦         ✧      ✦               │
│                                         │
│ ┌─────────────────────────────────────┐ │
│ │ [★] 白羊座 Aries                    │ │
│ │ 观测期:3月21日-4月19日              │ │
│ │ 勇敢的先驱者                         │ │
│ └─────────────────────────────────────┘ │
│                                         │
│         [ 🔍 开始识别 ]                 │
└─────────────────────────────────────────┘
5.3.2 星座卡片
┌───────────────────┐
│                   │
│    [★]            │
│                   │
│   白羊座          │
│   Aries           │
│                   │
│  3月21日-4月19日   │
│  勇敢的先驱者      │
│                   │
└───────────────────┘
5.3.3 知识卡片
┌─────────────────────────────────────────┐
│ [☀️] 恒星的生命周期              [>]   │
│      恒星物理                           │
│ 恒星从星云中诞生,经历主序星阶段...     │
└─────────────────────────────────────────┘

六、交互设计

6.1 识别页面交互

点击识别

快速入口

今晚亮点

查看星座

用户操作

操作类型

启动扫描动画

跳转对应页面

查看天文事件

模拟识别过程

显示识别结果

展示星座信息

跳转星座详情

开始识别此星座

6.2 星座浏览流程

详情弹窗 星座卡片 星座页面 用户 详情弹窗 星座卡片 星座页面 用户 进入星座图鉴 展示16种星座 点击星座 显示星座详情 点击识别按钮 跳转到识别页面

6.3 页面切换状态

点击星座Tab

点击知识Tab

点击记录Tab

点击识别Tab

点击知识Tab

点击记录Tab

点击识别Tab

点击星座Tab

点击记录Tab

点击识别Tab

点击星座Tab

点击知识Tab

识别页

星座页

知识页

记录页


七、数据分析

7.1 统计指标

统计项 计算方式 说明
观测次数 _records.length 总观测记录数
识别星座数 去重统计 已识别的星座种类
累计时长 模拟计算 总观测时长
星等分布 按星等统计 观测星星质量

7.2 星座识别统计

Map<ConstellationType, int> _calculateConstellationStats() {
  final stats = <ConstellationType, int>{};
  for (var record in _records) {
    stats[record.constellation] = (stats[record.constellation] ?? 0) + 1;
  }
  return stats;
}

7.3 知识分类分析

分类 知识数量 应用价值
恒星物理 1 了解恒星演化
天文历史 1 了解星座起源
星系 1 了解银河系
导航 1 学习定向知识
天文现象 1 了解流星雨等
宇宙奥秘 1 探索黑洞等
卫星 1 了解月相变化
太阳系 1 了解行星观测

八、扩展功能规划

8.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 AR模拟界面 星座图鉴 天文知识 观测记录 真实AR识别 星图导航 天文日历 望远镜控制 社区分享 AI天文助手 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 星空识别助手开发计划

8.2 功能扩展建议

8.2.1 真实AR识别

接入设备摄像头实现真实星空识别:

  • 设备陀螺仪定位
  • 实时星空匹配
  • 星座连线绘制
  • 行星位置追踪
8.2.2 星图导航

提供详细的星图导航功能:

  • 方位角计算
  • 高度角指示
  • 最佳观测时间
  • 光污染地图
8.2.3 天文社区

建立天文爱好者社区:

  • 观测分享
  • 位置推荐
  • 活动组织
  • 知识问答

九、注意事项

9.1 开发注意事项

  1. 星空模拟:使用CustomPaint实现高性能星空渲染

  2. 动画优化:闪烁动画使用repeat(reverse: true)实现平滑效果

  3. 内存管理:星星数量控制在150颗以内,避免性能问题

  4. 用户体验:扫描动画时长3秒,给用户足够的识别感知

9.2 常见问题

问题 原因 解决方案
星星不闪烁 动画未启动 检查twinkleController
扫描无结果 随机选择失败 确保星座枚举完整
知识不显示 数据未初始化 检查_knowledgeBase
记录保存失败 数据格式错误 验证输入数据

9.3 使用提示

🌌 星空识别助手使用小贴士 🌌

选择晴朗无月的夜晚进行观测。
远离城市光污染,获得更好的观测效果。
使用星图APP辅助定位星座位置。
记录每一次观测,积累天文知识。

提示:定期查看今晚亮点,不错过精彩天文事件。


十、运行说明

10.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+

10.2 运行命令

# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_star_recognition.dart --web-port 8136

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_star_recognition.dart

# 运行到Windows
flutter run -d windows -t lib/main_star_recognition.dart

# 代码分析
flutter analyze lib/main_star_recognition.dart

十一、总结

星空识别助手是一款科技探索类应用,为天文爱好者和星空探索者提供专业的星空识别与天文知识科普服务。应用以深蓝色为主色调,采用沉浸式星空风格,让用户仿佛置身于璀璨星河之中。

从技术实现来看,应用使用枚举类型定义16种星座和5等星分类,通过CustomPaint实现高性能星空渲染,使用AnimationController实现星星闪烁和扫描动画效果。星空模拟器随机生成150颗星星,支持不同星等的视觉表现。

从用户体验来看,应用提供直观的AR模拟界面,让用户能够体验星空识别的乐趣。星座图鉴展示16种星座的详细信息,天文知识库提供丰富的科普内容,观测记录功能帮助用户记录探索历程。

应用不仅是一个星空识别工具,更是一个探索宇宙的窗口。它提醒我们:选择晴朗无月的夜晚进行观测,远离城市光污染,使用星图APP辅助定位,记录每一次观测积累知识。在探索星空的道路上,星空识别助手为天文爱好者提供了一站式的辅助工具。

仰望星空,探索宇宙


Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐