You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:27:02