霜华齐韵 发表于 2014-5-10 20:37:15

[跪求各路大神不吝赐教]AUTOLISP递归问题求纠错

本帖最后由 ZZXXQQ 于 2014-5-13 21:49 编辑

有对问题描述有疑议的尽管问~~
总之,跪求各路大神不吝赐教。

======================下面说正事======================

这个程序想要实现如下功能:先在一个四边形中心绘制一个随机的四边形,然后判断其是否满足如下规则:新四边形为凸四边形、点的位置符合要求。然后依据延长线划分出来的四边形进行这个操作。附图如下
现在出现的问题是这样:递归之后,在1号四边形中心绘制的第一个小四边形没问题,但是函数输入的四个点变成2号四边形之后,生成点的函数却没有获取新的四个外轮廓点的数据,依然在按照1号四边形的计算。所以想请各路大神帮忙看下是不是递归函数语句哪里逻辑错误了,或者某个自定义函数输出的结果有问题。下面附上程序代码。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;                <=====程序说明=====>
;
;      1、当前程序为绘制正交且随机尺寸的随机骨料投放编写;
;      2、定义所有随机投放的骨料均为正方形,但其位置、边长均为随机数;
;      3、所有定位均由左下角开始;
;      4、待划分的胞元为正方形或矩形;
;
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;标记变量内容
;LEVEL_SIER 定义谢尔宾斯基变换阶数,从0开始。0阶为正方形
;P0 定义待处理正方形的左下角坐标
;P1 定义待处理正方形的右上角坐标
;LARGEUR 定义待处理正方形的宽度
;HAUTEUR 定义待处理正方形的高度
;DIM_GRANULE 定义骨料边长。
;LEVEL_FINI 定义处理完成的谢尔宾斯基地毯的阶数,只作为返回值出现,不参与绘图

;X_POSITION 定义内部块左下角坐标沿X轴偏移距离
;Y_POSITION 定义内部块左下角坐标沿Y轴偏移距离
;P2 定义内部块左下角坐标。通过P0向右上偏移的距离计算
;P3 定义内部块右上角坐标。通过P2向右上偏移骨料尺寸计算

;MU 正态分布均值
;SIGMA_CARRE 正态分布方差




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                主函数
;                (DEFUN 主函数(迭代阶数 四个顶点,从左下开始逆时针表示 / 中心四边形个顶点 边上各交叉点 各式判别变量)
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;绘图主程序
(DEFUN SIER_RANDOMINCLI(LEVEL_SIER P_LEFTDOWN P_RIGHTDOWN P_RIGHTUP P_LEFTUP / P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P1X P1Y P2X P2Y P3X P3Y P4X P4Y
                        JUDGEPOINT1 JUDGEPOINT2 JUDGEPOINT3 JUDGEPOINT4 JUDGEQUAD JUDGEAB JUDGEBC JUDGECD JUDGEDA JUDGETOTAL I)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                             ;
;                                                 ;
;                0.文件头,更新错误函数               ;
;                                             ;
;                                             ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;这个没有什么直接关系,就是在AUTO CAD界面里能够把这一个函数内的操作一键CTRL+Z

(SETQ *ERROR*_BAK *ERROR*)      ;备份错误处理函数
(DEFUN *ERROR* (MSG)                ;更新错误处理函数为我定义的错误函数
    (PRINC "\n 程序错误中断执行!!")
    (PRINC (STRCAT "\n" MSG))      ;输出错误信息
    (COMMAND "_.UNDO" "END")      ;一键UNDO的结束
    (COMMAND "_.UNDO" "1")      ;一键UNDO整个LISP操作防止影响用户
    (SETVAR "OSMODE" *OSMODE_BAK)      ;还原捕捉
    (SETVAR "COMDECHO" 1)      ;打开命令提示
    (SETQ *ERROR* *ERROR*_BAK)      ;还原错误处理函数
    (PRINC)
    )

(SETVAR "CMDECHO" 0)                ;关闭命令提示

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                1.函数输入部分
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                2.函数计算部分
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;这个也没用
(SETQ *OSMODE_BAK (GETVAR "OSMODE"))      ;备份捕捉
(SETVAR "OSMODE" 0)                        ;关闭捕捉
(COMMAND "_.UNDO" "BE")                ;一键UNDO的开始



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                3.函数的输出部分开始
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;迭代主要部分
(IF (= LEVEL_SIER 1)                ;如果阶数为1
    (COMMAND "LINE" P1 P2 P3 P4 "C")      ;在中心绘制四边形,意思是依次连接点P1、P2、P3、P4,然后闭合

    (PROGN       ;AUTOLISP的IF语句比较各色,如果要执行好多命令必须使用(PROGN ……)函数把这一系列命令括起来。

      ;产生中心四边形的四顶点
      ;随机产生符合标准的内部四点
      (CREER4INTERPOINTS P_LEFTDOWN P_RIGHTDOWN P_RIGHTUP P_LEFTUP)

      ;依次在相应位置迭代
      (SIER_RANDOMINCLI (- LEVEL_SIER 1) P_LEFTDOWN P5 P1 P12)                ;1号待处理四边形
      (SIER_RANDOMINCLI (- LEVEL_SIER 1) P5 P6 P2 P1)                        ;2号待处理四边形
      (SIER_RANDOMINCLI (- LEVEL_SIER 1) P6 P_RIGHTDOWN P7 P2)                ;3号待处理四边形
      (SIER_RANDOMINCLI (- LEVEL_SIER 1) P12 P1 P4 P11)                        ;4号待处理四边形
      (SIER_RANDOMINCLI (- LEVEL_SIER 1) P2 P7 P8 P3)                        ;5号待处理四边形
      (SIER_RANDOMINCLI (- LEVEL_SIER 1) P11 P4 P10 P_LEFTUP)                ;6号待处理四边形
      (SIER_RANDOMINCLI (- LEVEL_SIER 1) P4 P3 P9 P10)                        ;7号待处理四边形
      (SIER_RANDOMINCLI (- LEVEL_SIER 1) P3 P8 P_RIGHTUP P9)                ;8号待处理四边形

      (COMMAND "LINE" P1 P2 P3 P4 "C")      ;在中心绘制四边形
    )
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                4.函数的输出部分结束
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;没有用的
(COMMAND "_.UNDO" "END")      ;一键UNDO的结束。用户可以一键UNDO整个LISP函数的操作
(SETVAR "OSMODE" *OSMODE_BAK)      ;还原捕捉
(SETVAR "CMDECHO" 1)                ;打开命令提示
(SETQ *ERROR* *ERROR*_BAK)      ;还原错误处理函数
(PRINC)                        ;整个程序执行后没有多余的提示
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                5.其它自定义函数1
;                (DEFUN 标准化处理生成的均布随机数 (平均值 方差 / 随机数1 随机数2))
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;标准化处理生成的均布随机数,使随机数变成正态分布的。调完
;没有直接影响,不用看了
(DEFUN RETURN_BMRDM(MU SIGMA_CARRE / U1 U2)
(SETQ U1 (RND 0 1 4))
(SETQ U2 (RND 0 1 4))
(SETQ X (+ MU (* (SQRT (* -2 (LOG U2))) SIGMA_CARRE (COS (* 2 PI U1)))))
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                6.其它自定义函数2
;                (DEFUN 生成随机数 (希望生成的随机数的最小值 希望生成随机数的最大值 精度 / 临时随机数 临时精度))
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;生成随机数,调完。没有直接影响了,不用看
;JD int格式,保留的小数点位数,CPUTICKS方法精度不能大于9位,因为(expt 10 10)会出错,小于4位
(DEFUN RND(DOMAINE_MIN DOMAINE_MAX JD / N JD_BAK)
(SETQ JD_BAK (IF (<= JD 0) 3 JD))
(SETQ N (* (EXPT 10 (* -1.0 JD_BAK)) (REM (GETVAR "CPUTICKS") (EXPT 10 JD_BAK))))
(READ (RTOS (+ DOMAINE_MIN (* (- DOMAINE_MAX DOMAINE_MIN) N)) 2 JD));按初始精度格式化
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                7.其它自定义函数3
;                (DEFUN 判断一个点是否在规则四边形内 (被检测点坐标 四边形四个顶点坐标 / 临时随机数 临时精度))
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;计算一个点是否落在规则的四边形内。要求其与四个顶点连线形成的四个三角形面积之和等于原四边形面积
;没有大用,确定没错
(DEFUN JUDGEINTER(P_INTERIEUR PA PB PC PD / AREAABC AREAACD AREAQUAD AREAAIB AREABIC AREACID AREADIA AREA4TRI JUDGERST)

;通过被对角线划分的两个三角形面积之和计算四边形面积
(SETQ AREAABC (AREATRIANGLE PA PB PC))
(SETQ AREAACD (AREATRIANGLE PA PC PD))
(SETQ AREAQUAD (+ AREAABC AREAACD))

;计算待验证点与四个顶点连线形成的四个三角形面积之和
(SETQ AREAAIB (AREATRIANGLE PA P_INTERIEUR PB))
(SETQ AREABIC (AREATRIANGLE PB P_INTERIEUR PC))
(SETQ AREACID (AREATRIANGLE PC P_INTERIEUR PD))
(SETQ AREADIA (AREATRIANGLE PA P_INTERIEUR PD))

(SETQ AREA4TRI (+ AREAAIB AREABIC AREACID AREADIA))

(SETQ JUDGERST (AND (<= (ABS (- AREAQUAD AREA4TRI)) 0.00000001) (/= AREAAIB 0) (/= AREABIC 0) (/= AREACID 0) (/= AREADIA 0)))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                8.其它自定义函数4
;                (DEFUN 计算一个三角形面积 (三个顶点坐标 / 三边长 周长 周长的一半 面积))
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;原理:海伦公式。不需要测量三角形的高,即可算出三角形面积
;没有直接联系,应该没错

(DEFUN AREATRIANGLE (PA PB PC / DISAB DISAC DISBC TOURABC PCALCUL AREAABC)
(SETQ DISAB (DISTANCE PA PB))
(SETQ DISAC (DISTANCE PA PC))
(SETQ DISBC (DISTANCE PB PC))
(SETQ TOURABC (+ DISAB DISAC DISBC))
(SETQ PCALCUL (/ TOURABC 2))
(SETQ AREAABC (SQRT (* PCALCUL (- PCALCUL DISBC) (- PCALCUL DISAC) (- PCALCUL DISAB))))
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;                9.其它自定义函数5
;                (DEFUN 主函数(四个顶点,从左下开始逆时针表示 / 中心正方形左下角 中心正方形右上角 中心正方形左下角点距离起始点的X距离
;                              中心正方形左下角点距离起始点的Y距离 各正方形左下角点)
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;生成随机坐标点的函数
(DEFUN CREER4INTERPOINTS(P_LEFTDOWN P_RIGHTDOWN P_RIGHTUP P_LEFTUP / P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P1X P1Y P2X P2Y P3X P3Y P4X P4Y
                        JUDGEPOINT1 JUDGEPOINT2 JUDGEPOINT3 JUDGEPOINT4 JUDGEQUAD JUDGEAB JUDGEBC JUDGECD JUDGEDA JUDGETOTAL I)
(SETQ JUDGETOTAL NIL)      ;设定总判断值为假,总判定值即为——每边四个点的位置均按预设排列
(WHILE (= JUDGETOTAL NIL)      ;如果总判定值为假则一直循环

    (SETQ JUDGEQUAD NIL)      ;设定判定是否为凸四边形值为假
    (WHILE (= JUDGEQUAD NIL)      ;如果判定凸四边形值为假则一直循环

      ;随机产生第一点,即为右下点
      (SETQ JUDGEPOINT1 NIL)      ;设定判定第二点不在指定四边形之内
      (SETQ I 0)      ;计数起始为0
      (WHILE (AND (= JUDGEPOINT1 NIL) (< I 1000))      ;第二点不在指定四边形之内,且计数小于1000则一直循环
      ;1点随机坐标,暂定设定其在ABCD外接矩形内。函数定义——(RETURN_BMRDM 平均值 方差)
      (SETQ P1X (RETURN_BMRDM (/ (- (CAR P_RIGHTDOWN) (CAR P_LEFTDOWN)) 3) SIGMA_CARRE))      ;横坐标
      (PRINC "\n 显示P1X")      ;在命令行中显示横坐标,查错用
      (PRINC P1X)      
      (SETQ P1Y (RETURN_BMRDM (/ (- (CADR P_RIGHTUP) (CADR P_LEFTDOWN)) 3) SIGMA_CARRE))      ;纵坐标
      (PRINC "\n 显示P1Y")      ;查错用
      (PRINC P1Y)
      (SETQ P1 (LIST P1X P1Y))      ;将横纵坐标值组成坐标点
      (PRINC "\n 显示P1")      ;查错用
      (PRINC P1)
      ;判断P1是否在四边形ABCD内部
      (SETQ JUDGEPOINT1 (JUDGEINTER P1 P_LEFTDOWN P_RIGHTDOWN P_RIGHTUP P_LEFTUP))      
      (SETQ I (1+ I))                ;每随机一次计数加1

      ;查错用
      (PRINC "\n P_LEFTDOWN")
      (PRINC P_LEFTDOWN)
      (PRINC "\n P_RIGHTDOWN")
      (PRINC P_RIGHTDOWN)
      (PRINC "\n P_RIGHTUP")
      (PRINC P_RIGHTUP)
      (PRINC "\n P_LEFTUP")
      (PRINC P_LEFTUP)
      (PRINC "\n I")
      (PRINC I)

      (PRINC "\n 显示点1判别")
      (PRINC JUDGEPOINT1)
      )


      ;随机产生第二点,即为右下点
      (SETQ JUDGEPOINT2 NIL)      ;设定判定第二点不在指定四边形之内
      (SETQ I 0)      ;计数起始为0
      (WHILE (AND (= JUDGEPOINT2 NIL) (< I 1000))      ;第二点不在指定四边形之内则一直循环
      ;2点随机坐标,暂定设定其在ABCD外接矩形内。函数定义——(RETURN_BMRDM 平均值 方差)
      (SETQ P2X (RETURN_BMRDM (- (CAR P_RIGHTDOWN) (/ (- (CAR P_RIGHTDOWN) (CAR P_LEFTDOWN)) 3)) SIGMA_CARRE));横坐标
      (PRINC "\n 显示P2X")      ;查错用
      (PRINC P2X)
      (SETQ P2Y (RETURN_BMRDM (/ (- (CADR P_RIGHTUP) (CADR P_LEFTDOWN)) 3) SIGMA_CARRE))      ;纵坐标
      (PRINC "\n 显示P2Y")      ;查错用
      (PRINC P2Y)
      (SETQ P2 (LIST P2X P2Y))      ;组建坐标
      (PRINC "\n 显示P2")
      (PRINC P2)
      ;判断P2是否在四边形ABCD内部
      (SETQ JUDGEPOINT2 (JUDGEINTER P2 P_LEFTDOWN P_RIGHTDOWN P_RIGHTUP P_LEFTUP))
      (SETQ I (1+ I))

      ;查错用
      (PRINC "\n P_LEFTDOWN")
      (PRINC P_LEFTDOWN)
      (PRINC "\n P_RIGHTDOWN")
      (PRINC P_RIGHTDOWN)
      (PRINC "\n P_RIGHTUP")
      (PRINC P_RIGHTUP)
      (PRINC "\n P_LEFTUP")
      (PRINC P_LEFTUP)
      (PRINC "\n I")
      (PRINC I)
      (PRINC "\n 显示点2判别")
      (PRINC JUDGEPOINT2)
      )

      ;根据1、2点生成点12、点7
      (SETQ P12 (INTERS P1 P2 P_LEFTDOWN P_LEFTUP NIL))      ;点1、2连线延长线与AD连线交点
      (PRINC "\n 显示P12")
      (PRINC P12)
      (SETQ P7 (INTERS P1 P2 P_RIGHTDOWN P_RIGHTUP NIL))      ;点1、2连线延长线与BC连线交点
      (PRINC "\n 显示P7")
      (PRINC P7)

      ;随机产生第四点,即为左上点
      (SETQ JUDGEPOINT4 NIL)      ;设定判定第四点不在指定四边形之内
      (SETQ I 0)
      (WHILE (AND (= JUDGEPOINT4 NIL) (< I 1000))      ;第四点不在指定四边形之内则一直循环
      ;4点随机坐标,暂定设定其在12 7 C D外接矩形内。函数定义——(RETURN_BMRDM 平均值 方差)
      (SETQ P4X (RETURN_BMRDM (/ (- (CAR P_RIGHTDOWN) (CAR P_LEFTDOWN)) 3) SIGMA_CARRE))
      (PRINC "\n 显示P4X")
      (PRINC P4X)
      (SETQ P4Y (RETURN_BMRDM (- (CADR P_RIGHTUP) (/ (- (CADR P_RIGHTUP) (CADR P_LEFTDOWN)) 3)) SIGMA_CARRE))
      (PRINC "\n 显示P4Y")
      (PRINC P4Y)
      (SETQ P4 (LIST P4X P4Y))
      (PRINC "\n 显示P4")
      (PRINC P4)
      ;判断P4是否在12 7 C D内部
      (SETQ JUDGEPOINT4 (JUDGEINTER P4 P12 P7 P_RIGHTUP P_LEFTUP))
      (SETQ I (1+ I))
      
      (PRINC "\n P_LEFTDOWN")
      (PRINC P_LEFTDOWN)
      (PRINC "\n P_RIGHTDOWN")
      (PRINC P_RIGHTDOWN)
      (PRINC "\n P_RIGHTUP")
      (PRINC P_RIGHTUP)
      (PRINC "\n P_LEFTUP")
      (PRINC P_LEFTUP)
      (PRINC "\n I")
      (PRINC I)
      (PRINC "\n 显示点4判别")
      (PRINC JUDGEPOINT4)
      )

      ;根据点1、4生成点10、5
      (SETQ P10 (INTERS P1 P4 P_RIGHTUP P_LEFTUP NIL))      ;点1、4连线延长线与CD连线交点
      (PRINC "\n 显示P10")
      (PRINC P10)
      (SETQ P5 (INTERS P1 P4 P_LEFTDOWN P_RIGHTDOWN NIL))      ;点1、4连线延长线与AB连线交点
      (PRINC "\n 显示P5")
      (PRINC P5)

      ;随机产生第三点,即为右上点
      (SETQ JUDGEPOINT3 NIL)      ;设定判定第三点不在指定四边形之内
      (SETQ I 0)
      (WHILE (AND (= JUDGEPOINT3 NIL) (< I 1000))      ;第三点不在指定四边形之内则一直循环
      ;3点随机坐标,暂定设定其在1 7 C 10外接矩形内。函数定义——(RETURN_BMRDM 平均值 方差)
      (SETQ P3X (RETURN_BMRDM (- (CAR P_RIGHTDOWN) (/ (- (CAR P_RIGHTDOWN) (CAR P_LEFTDOWN)) 3)) SIGMA_CARRE))
      (PRINC "\n 显示P3X")
      (PRINC P3X)
      (SETQ P3Y (RETURN_BMRDM (- (CADR P_RIGHTUP) (/ (- (CADR P_RIGHTUP) (CADR P_LEFTDOWN)) 3)) SIGMA_CARRE))
      (PRINC "\n 显示P3Y")
      (PRINC P3Y)
      (SETQ P3 (LIST P3X P3Y))
      (PRINC "\n 显示P3")
      (PRINC P3)
      ;判断P3是否在1 7 C 10内部
      (SETQ JUDGEPOINT3 (JUDGEINTER P3 P1 P7 P_RIGHTUP P10))
      (SETQ I (1+ I))
      
      (PRINC "\n P_LEFTDOWN")
      (PRINC P_LEFTDOWN)
      (PRINC "\n P_RIGHTDOWN")
      (PRINC P_RIGHTDOWN)
      (PRINC "\n P_RIGHTUP")
      (PRINC P_RIGHTUP)
      (PRINC "\n P_LEFTUP")
      (PRINC P_LEFTUP)
      (PRINC "\n I")
      (PRINC I)
      (PRINC "\n 显示点3判别")
      (PRINC JUDGEPOINT3)
      )

      ;根据点3、2、4生成点6、8、9、11
      (SETQ P6 (INTERS P2 P3 P_LEFTDOWN P_RIGHTDOWN NIL))      ;点2、3连线延长线与AB连线交点
      (PRINC "\n 显示P6")
      (PRINC P6)
      (SETQ P8 (INTERS P3 P4 P_RIGHTDOWN P_RIGHTUP NIL))      ;点3、4连线延长线与BC连线交点
      (PRINC "\n 显示P8")
      (PRINC P8)
      (SETQ P9 (INTERS P2 P3 P_RIGHTUP P_LEFTUP NIL))      ;点2、3连线延长线与CD连线交点
      (PRINC "\n 显示P9")
      (PRINC P9)
      (SETQ P11 (INTERS P3 P4 P_LEFTDOWN P_LEFTUP NIL))      ;点3、4连线延长线与AD连线交点
      (PRINC "\n 显示P11")
      (PRINC P11)

      ;判定生成的四边形是否为凸四边形。如果生成的四边形对角线不能相交则为凹四边形
      (SETQ JUDGEQUAD (INTERS P1 P3 P2 P4))      ;判断新形成的四边形是否为凸四边形
      (PRINC "\n 显示凸四边形判别")
      (PRINC JUDGEQUAD)
      )


    ;判定各点位置关系是否正确
    (SETQ JUDGEAB (< (CAR P_LEFTDOWN) (CAR P5) (CAR P6) (CAR P_RIGHTDOWN)))      ;AB边上从左向右依次排列点A、5、6、B,即横坐标由小到大
    (PRINC "\n 显示AB边判别")
    (PRINC JUDGEAB)
    (SETQ JUDGEBC (< (CADR P_RIGHTDOWN) (CADR P7) (CADR P8) (CADR P_RIGHTUP)))      ;BC边上从下向上依次排列点B、7、8、C
    (PRINC "\n 显示BC边判别")
    (PRINC JUDGEBC)
    (SETQ JUDGECD (< (CAR P_LEFTUP) (CAR P10) (CAR P9) (CAR P_RIGHTUP)))      ;CD边上从左向右依次排列点D、10、9、C
    (PRINC "\n 显示CD边判别")
    (PRINC JUDGECD)
    (SETQ JUDGEDA (< (CADR P_LEFTDOWN) (CADR P12) (CADR P11) (CADR P_LEFTUP)))      ;DA边上从下向上依次排列点A、12、11、D
    (PRINC "\n 显示DA边判别")
    (PRINC JUDGEDA)
    (SETQ JUDGETOTAL (AND JUDGEAB JUDGEBC JUDGECD JUDGEDA))      ;如果满足如上四条则判定满足总判定值
    (PRINC "\n 显示总判别")
    (PRINC JUDGETOTAL)
    )
)





lostbalance 发表于 2014-5-10 23:42:28

不是大神,程序太长看的头晕。没看明白楼主是用什么方式进行递归的。。
一般来说,出现这种情况,基本上是没有设置计数器等,输入的新数据没有进入计算过程。
如果用的是while或者repeat,检查下计数器(比如n或者i)之类的有没有+1或者-1;
如果是defun的子函数然后嵌套,那就检查下子函数的数据更新传递代码是不是除了问题。

霜华齐韵 发表于 2014-5-11 09:10:40

lostbalance 发表于 2014-5-10 23:42 static/image/common/back.gif
不是大神,程序太长看的头晕。没看明白楼主是用什么方式进行递归的。。
一般来说,出现这种情况,基本上是 ...

用的是WHILE,递归时调用了子函数。
计数器工作倒能确定是正常,子函数有可能有问题,尤其是CREER4INTERPOINTS函数。
但是我自己觉得写得是对的,有点调不明白了
所以才来求助……

lostbalance 发表于 2014-5-11 10:12:17

本帖最后由 lostbalance 于 2014-5-11 10:35 编辑

之前看错了
刚才无意中发现有一个代码好像有点问题
      ;随机产生符合标准的内部四点
      (CREER4INTERPOINTS P_LEFTDOWN P_RIGHTDOWN P_RIGHTUP P_LEFTDOWN)


怎么有两个左下,没有左上

ysq101 发表于 2014-5-11 12:32:51

这正是明经币的正确用法。。。顶一个

xyp1964 发表于 2014-5-11 13:23:25

代码超长,能认真看全的估计没几个,还不如重写来得快

霜华齐韵 发表于 2014-5-11 13:28:50

lostbalance 发表于 2014-5-11 10:12 static/image/common/back.gif
之前看错了
刚才无意中发现有一个代码好像有点问题
      ;随机产生符合标准的内部四点


哦哦哦,I M SRY,这是我粘贴的问题。我为了给大家呈现的代码比较易读,所以特意改了变量名。我原来用的是PA、PB、PC和PD。
多谢指正

霜华齐韵 发表于 2014-5-11 13:29:33

ysq101 发表于 2014-5-11 12:32 static/image/common/back.gif
这正是明经币的正确用法。。。顶一个

请多关照……

霜华齐韵 发表于 2014-5-11 13:30:51

xyp1964 发表于 2014-5-11 13:23 static/image/common/back.gif
代码超长,能认真看全的估计没几个,还不如重写来得快

我重写估计也不能跳出这个圈子了。还得请各位大神费心了

霜华齐韵 发表于 2014-5-11 13:32:36

插播一下,我现在不知道为什么不能够修改编辑自己的帖子了,上面有一个错误,是变量命名的错误,
(CREER4INTERPOINTS P_LEFTDOWN P_RIGHTDOWN P_RIGHTUP P_LEFTDOWN)应该写作(CREER4INTERPOINTS P_LEFTDOWN P_RIGHTDOWN P_RIGHTUP P_LEFTUP)
页: [1] 2 3
查看完整版本: [跪求各路大神不吝赐教]AUTOLISP递归问题求纠错