Files
doodle-mini/miniprogram/focusPages/lineRecognition/lineRecognition.ts
T
2025-12-19 09:48:37 +08:00

147 lines
4.6 KiB
TypeScript
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.
import LineRecognitionDraw from '../shared/service/lineRecognitionDraw';
import { createFocusPage } from '../shared/common/focusPageMixin';
import {
LineRecognitionData,
LineType,
LineTypeConfig,
} from '../shared/service/lineRecognitionDraw';
import { NUMBER_COLORS } from '../../constants/colors';
/**
* 广告位IDadunit-89cff2de998f1146
请返回广告位列表,获取广告位代码,将代码插入小程序页面中适合位置,发布后即展现对应广告位。
*/
// 线条类型配置
const LINE_TYPES: Array<{ type: LineType; name: string }> = [
{ type: 'straight', name: '直线' },
{ type: 'dashed', name: '虚线' },
{ type: 'wavy', name: '波浪线' },
{ type: 'zigzag', name: '锯齿线' },
{ type: 'spiral', name: '电话线' },
];
createFocusPage({
canvas: null as Canvas | null,
ctx: null as RenderingContext | null,
boxHeight: 0,
boxWidth: 0,
drawService: null as LineRecognitionDraw | null,
lineData: null as LineRecognitionData | null,
data: {
pageTitle: '线条识别',
functionId: '',
hasContent: false,
showShareDialog: false,
},
onLoad(options: { id?: string }) {
const functionId = options.id || 'line-recognition';
this.setData({
functionId,
});
this.initPageInfo(functionId, '线条识别');
},
onReady() {
this.initCanvas({
createDrawService: (
canvas: Canvas,
ctx: RenderingContext,
options?: Record<string, any>,
) => {
return new LineRecognitionDraw(canvas, ctx, options);
},
drawServiceOptions: {
title: this.data.pageTitle,
subTitle: '认识不同线条,画出颜色对应的线条',
functionId: this.data.functionId,
},
onCanvasReady: () => {
// 初始随机生成
this.onRandom();
},
});
},
/**
* 绘制Canvas内容
*/
async drawCanvas() {
if (!this.ctx || !this.drawService || !this.lineData) {
return;
}
try {
await this.drawService.draw(this.lineData);
this.setData({ hasContent: true });
} catch (error) {
console.error('绘制失败:', error);
this.setData({ hasContent: false });
}
},
/**
* 随机生成
*/
onRandom() {
// 从NUMBER_COLORS中随机选择5种颜色(排除11和12:柔和棕色和柔和黑灰)
const colorKeys = Object.keys(NUMBER_COLORS)
.map(Number)
.filter((key) => key !== 11 && key !== 12); // 排除柔和棕色和柔和黑灰
const shuffledColors = [...colorKeys].sort(() => Math.random() - 0.5);
const selectedColorKeys = shuffledColors.slice(0, 5);
// 创建5个线条配置(随机排列)
const shuffledLineTypes = [...LINE_TYPES].sort(
() => Math.random() - 0.5,
);
const referenceLines: LineTypeConfig[] = shuffledLineTypes.map(
(lineType, index) => ({
type: lineType.type,
name: lineType.name,
color: NUMBER_COLORS[selectedColorKeys[index]],
}),
);
// 创建练习区域的16个色块(2列×8行)
const practiceBlocks: Array<{
color: string;
lineType: LineType;
x: number;
y: number;
}> = [];
// 为每行生成色块
for (let row = 0; row < 8; row++) {
for (let col = 0; col < 2; col++) {
// 随机选择一个线条类型和颜色
const randomLineIndex = Math.floor(
Math.random() * referenceLines.length,
);
const selectedLine = referenceLines[randomLineIndex];
// 生成随机错落感(X轴偏移:-20到20,Y轴偏移:-8到8,确保不重叠)
// 行高55,色块35,所以Y轴偏移最大8,确保不重叠
const xOffset = (Math.random() - 0.5) * 40;
const yOffset = (Math.random() - 0.5) * 16;
practiceBlocks.push({
color: selectedLine.color,
lineType: selectedLine.type,
x: xOffset,
y: yOffset,
});
}
}
this.lineData = {
referenceLines,
practiceBlocks,
};
this.drawCanvas();
},
});