Racket如何判断点在正方形内及解决tl未定义报错问题
报错原因&修正方案
1. 直接报错的根源
你在定义全局变量z时,直接使用了未预先声明赋值的tl和side两个变量,程序找不到这两个标识符的定义,所以抛出了你看到的报错。
同时你不应该把正方形的右下角计算逻辑写在全局作用域,应该放到判断函数内部,基于传入的正方形参数S计算,否则不管你传入什么正方形,函数只会用全局固定的z做判断,逻辑完全错误。
2. 代码中存在的其他逻辑错误
- 结构体访问语法错误:
(posn-x SQ-tl z)是错误写法,应该先调用SQ-tl拿到正方形左上角的Posn对象,再传入posn-x取坐标,正确写法为(posn-x (SQ-tl z)) - 比较运算符使用错误:
(<= (posn-x P) (posn-x a) S)里最后一个参数S是SQ结构体,不能和坐标数值做大小比较,属于多余参数 - 函数内误用全局变量:你定义的
point-in-square?参数是S(待判断的正方形),但函数内部全部调用的是全局的z,没有使用传入的参数
3. 修正后的完整代码
; 定义正方形结构体:tl是左上角Posn,side是边长 (define-struct SQ (tl side)) ; Posn, SQ -> Boolean ; 判断点P是否落在正方形S内部(包含边界) (define (point-in-square? P S) (let* ([tl (SQ-tl S)] [min-x (posn-x tl)] [max-x (+ min-x (SQ-side S))] [min-y (posn-y tl)] [max-y (+ min-y (SQ-side S))] [p-x (posn-x P)] [p-y (posn-y P)]) (and (<= min-x p-x max-x) (<= min-y p-y max-y))))
4. 测试示例
你可以用下面的代码验证功能是否正常:
; 测试用正方形:左上角(0,0),边长为5 (define test-square (make-SQ (make-posn 0 0) 5)) ; 测试点(2,3):返回#t (point-in-square? (make-posn 2 3) test-square) ; 测试点(6,2):返回#f (point-in-square? (make-posn 6 2) test-square)
内容的提问来源于stack exchange,提问作者Lucky Rabbit
相关产品推荐
相关产品推荐

