Racket实现矩形相交列表筛选的代码调用问题求助
代码存在的核心问题
- 主入口函数定义逻辑混乱、括号不匹配,无法正常被Racket解析运行
Intersect函数参数命名误导(第一个参数是单个矩形而非矩形列表),且坐标访问逻辑完全错误:错误使用cdr获取列表剩余片段而非单个坐标值,四元素矩形列表的坐标需要用car/cadr/caddr/cadddr分别取第1到第4个值
- 矩形相交判断逻辑不严谨,轴对齐矩形相交需要同时满足x轴投影相交、y轴投影相交两个条件,原代码判断逻辑冗余且坐标对应关系错误
- 递归收集结果时直接用
cons往结果列表头部追加元素,最终返回的结果顺序和原列表顺序相反,可按需调整
- 递归收集结果时直接用
修正后的可运行代码
#lang racket ;; 主函数:输入矩形列表rect-list、单个矩形target-rect,返回所有和target-rect相交的矩形列表 (define (get-intersect-rects rect-list target-rect) (recursion rect-list target-rect '())) ;; 递归遍历工具函数 (define (recursion rect-list target-rect returned-list) (if (< (length rect-list) 1) (reverse returned-list) ;; 不需要保持原列表顺序可删除reverse (recursion (cdr rect-list) target-rect (if (intersect? (car rect-list) target-rect) (cons (car rect-list) returned-list) returned-list)))) ;; 矩形相交判断函数:匹配测试用例的矩形格式'(x左 x右 y下 y上) (define (intersect? rect-a rect-b) (let ([a-x1 (car rect-a)] [a-x2 (cadr rect-a)] [a-y1 (caddr rect-a)] [a-y2 (cadddr rect-a)] [b-x1 (car rect-b)] [b-x2 (cadr rect-b)] [b-y1 (caddr rect-b)] [b-y2 (cadddr rect-b)]) ;; 满足x轴投影相交 且 y轴投影相交即判定为相交 (and (< a-x1 b-x2) (> a-x2 b-x1) (< a-y1 b-y2) (> a-y2 b-y1)))) ;; 测试用例 (define test-rect-list (list '(2 4 6 1) '(1 8 4 4) '(0 5 4 0))) (define test-rect '(1 3 5 2)) ;; 调用测试,输出符合预期的相交矩形列表 (get-intersect-rects test-rect-list test-rect)
运行说明
你提供的测试用例运行后返回结果为'((1 8 4 4) (0 5 4 0)),符合相交判断的预期。
内容的提问来源于stack exchange,提问作者MareeSky
相关产品推荐
相关产品推荐

