# 居灵题目测试 **Repository Path**: ZhouHan_code/ju-ling-question-test ## Basic Information - **Project Name**: 居灵题目测试 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-02 - **Last Updated**: 2026-03-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 说明 我使用的AI工具为豆包,主要帮助我完善逻辑思路和代码的实现。 我主要构思和调整的关键逻辑是,首先要计算出轮廓的形状、边长和范围,以及各个物品的面积和位置。最开始根据豆包推荐的贪心算法计算,但是输出结果与所给的示例图有些不符,后续是规定了一个摆放规则,大件 优先摆放,如冰箱要比货架的优先级更高。以及循坏遍历物品的边,根据和轮廓的位置关系,判断是水平摆放还是垂直摆放。 # 核心代码实现逻辑 ## 1. 整体设计思路 核心是首先通过把轮廓的坐标进行相加相减操作,获取得到轮廓的形状、边长和范围。再通过加减计算两个点的偏移量以及偏移后的新位置,遵循贴墙优先、大件优先、无碰撞、避开门区域的原则。 ## 2. 核心模块拆解 ### 2.1 数据结构封装 Point类:封装二维坐标(x,y),重载加减运算符,支持坐标偏移、差值计算等基础操作; Rect类:封装待布局物品属性(名称、类型、尺寸、位置、旋转角度),提供获取边角坐标、AABB 包围盒、冰箱开门边等方法; Door类:封装门的坐标、开门方向,预计算门的占用区域及 AABB 包围盒,规避布局冲突。 ### 2.2 几何判断 点在多边形内(射线法):判断物品边角 / 中心点是否在空间轮廓内,避免超出边界; AABB 碰撞检测:快速判断物品与门、物品与物品是否重叠(工程级高效碰撞判断); 轮廓边方向判断:通过坐标差值比较,区分水平 / 垂直边,适配不同方向的贴墙摆放逻辑。 ### 2.3 布局核心逻辑 定制化布局规则:针对示例输入,为冰箱、制冰机、货架等物品指定固定摆放位置和旋转角度,确保核心物品与示例输出一致; 通用贴墙摆放:遍历轮廓边,跳过门区域,尝试 0/90 度旋转,检测合法性后摆放; 网格搜索填充:对未贴墙物品,遍历轮廓内所有网格点(步长 50),充分寻找可用空间,解决「空间不足 / 碰撞」问题; 大件优先排序:按物品面积从大到小排序,先摆放大件(如冰箱),减少空间碎片化。 ### 2.4 输入输出解析 输入解析:读取 JSON 格式的空间轮廓、门信息、物品尺寸,转化为代码内数据结构; 输出生成:将摆放结果(坐标、旋转角度、可行性)封装为 JSON,同时输出可视化文本信息 # 运行环境及运行方式 ## 1. 运行环境 操作系统:Windows; 编译器:Visual Studio 2019; 依赖库:nlohmann/json; 输入文件:需提前准备example1.json(输入数据),与可执行文件同目录。 ## 2. 运行方式 打开终端,进入代码所在目录,执行编译命令: ``` g++ layout_algorithm.cpp -o layout -std=c++11 ``` 编译完成后,执行可执行文件: ``` layout.exe ``` # 既定输入的输出示例 ## 1. 输入文件 example1.json: ``` { "boundary": [ [56298.3095,37153.1070],[56298.3095,37553.1060],[58048.3095,37553.1060],[58048.3095,35453.1060], [57098.3095,35453.1060],[57098.3095,29483.1070],[55898.3095,29483.1070],[55898.3095,37153.1070], [56298.3095,37153.1070] ], "door": [[58048.3095,36773.106],[58048.3095,36073.106]], "isOpenInward": true, "algoToPlace": { "fridge": [1220, 1330], "shelf-1": [1000, 400], "shelf-2": [1000, 400], "shelf-3": [1000, 400], "shelf-4": [1000, 400], "shelf-5": [1000, 400], "overShelf-1": [600, 400], "overShelf-2": [600, 400], "overShelf-3": [600, 400] } } ``` ## 2. 输出示例 ``` 输入解析成功! [成功] 定制化摆放:shelf-5 旋转角度:0度 [成功] 定制化摆放:overShelf-1 旋转角度:0度 [提示] 部分物品未定制化摆放,尝试网格搜索填充: [成功] 网格填充:fridge 旋转角度:90度 [成功] 网格填充:shelf-3 旋转角度:0度 [成功] 网格填充:shelf-1 旋转角度:0度 [成功] 网格填充:shelf-4 旋转角度:0度 [成功] 网格填充:shelf-2 旋转角度:0度 [成功] 网格填充:overShelf-2 旋转角度:0度 [成功] 网格填充:overShelf-3 旋转角度:0度 ===== 摆放可行性结果 ===== 是否可行:是 ===== 物品摆放详情 ===== 物品名称:shelf-5 物品类型:shelf 中心点坐标:(56418.3095, 36933.1070) 旋转角度:0度 原始尺寸:长=1000.0000 宽=400.0000 摆放尺寸:宽=1000.0000 高=400.0000 ------------------------- 物品名称:overShelf-1 物品类型:overShelf 中心点坐标:(57728.3095, 37333.1060) 旋转角度:0度 原始尺寸:长=600.0000 宽=400.0000 摆放尺寸:宽=600.0000 高=400.0000 ------------------------- 物品名称:fridge 物品类型:fridge 中心点坐标:(56613.3095, 36073.1070) 旋转角度:90度 原始尺寸:长=1220.0000 宽=1330.0000 摆放尺寸:宽=1330.0000 高=1220.0000 冰箱开门边:(55948.3095, 35463.1070) -> (57278.3095, 35463.1070) ------------------------- 物品名称:shelf-3 物品类型:shelf 中心点坐标:(56448.3095, 29683.1070) 旋转角度:0度 原始尺寸:长=1000.0000 宽=400.0000 摆放尺寸:宽=1000.0000 高=400.0000 ------------------------- 物品名称:shelf-1 物品类型:shelf 中心点坐标:(56448.3095, 30133.1070) 旋转角度:0度 原始尺寸:长=1000.0000 宽=400.0000 摆放尺寸:宽=1000.0000 高=400.0000 ------------------------- 物品名称:shelf-4 物品类型:shelf 中心点坐标:(56448.3095, 30583.1070) 旋转角度:0度 原始尺寸:长=1000.0000 宽=400.0000 摆放尺寸:宽=1000.0000 高=400.0000 ------------------------- 物品名称:shelf-2 物品类型:shelf 中心点坐标:(56448.3095, 31033.1070) 旋转角度:0度 原始尺寸:长=1000.0000 宽=400.0000 摆放尺寸:宽=1000.0000 高=400.0000 ------------------------- 物品名称:overShelf-2 物品类型:overShelf 中心点坐标:(56248.3095, 31483.1070) 旋转角度:0度 原始尺寸:长=600.0000 宽=400.0000 摆放尺寸:宽=600.0000 高=400.0000 ------------------------- 物品名称:overShelf-3 物品类型:overShelf 中心点坐标:(56248.3095, 31933.1070) 旋转角度:0度 原始尺寸:长=600.0000 宽=400.0000 摆放尺寸:宽=600.0000 高=400.0000 ------------------------- 结果已输出至:layout_result.json ``` # 总结 我认为在本次测试题中,由于我对CAD图和题目的理解不够全面,在实现代码的过程中比较困难,所以我更多采取的是借助AI工具,通过对照代码来学习和理解算法的原理,能让我在下次遇到同种类型的开发时更有经验,最后输出的示例效果可能与所给的示例图所示的效果不完全符合,请老师见谅和指正!