明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7104|回复: 19

[求助]LISP能求出椭圆弧长吗?

  [复制链接]
发表于 2010-8-5 09:24:00 | 显示全部楼层 |阅读模式

LISP能求出椭圆弧长吗?

据网上多位高人说,计算椭圆任意两点间的弧长是世界难题。

因还是看到有人克服战胜困难,我也想请教明经上的高手,有没有一种相对精确而简易可行的计算公式,

或用LISP来计算椭圆任意两点间的弧长。

不知这样的想法,会不会有结果。

就算没结果,能让明经上的高人看看,也算是我的努力了。

感谢这里众多热心的高手。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2010-8-5 10:27:00 | 显示全部楼层
直接可以量出来啊.

(setq n (car (entsel)))
(setq curve (vlax-ename->vla-object n)) 
(setq tlen (vlax-curve-getdistatparam curve (vlax-curve-getendparam curve) )) 
发表于 2010-8-5 10:29:00 | 显示全部楼层
  1. ;;;计算椭圆任意两点间逆时针方向距离
  2. (defun c:tt ()
  3.   (princ "\n选择椭圆:")
  4.   (setq en (car (entsel)))
  5.   (redraw en 3)
  6.   (setq d (vlax-curve-getDistAtparam en (vlax-curve-getendparam en))
  7. d0 (/ d 100)
  8. )
  9.   (setq p1 (osnap (getpoint "\n选择椭圆任意第一点:") "_nea"))
  10.   (grdraw (polar p1 pi d0) (polar p1 0 d0) 1)
  11.   (grdraw (polar p1 (/ pi 2) d0) (polar p1 (* pi 1.5) d0) 1)
  12.   (setq p2 (osnap (getpoint "\n选择椭圆任意第二点:") "_nea"))
  13.   (grdraw (polar p2 pi d0) (polar p2 0 d0) 1)
  14.   (grdraw (polar p2 (/ pi 2) d0) (polar p2 (* pi 1.5) d0) 1)
  15.   (setq p1 (vlax-curve-getclosestpointto en p1)
  16. p2 (vlax-curve-getclosestpointto en p2)
  17. )
  18.   (setq d1 (vlax-curve-getDistAtPoint en p1)
  19. d2 (vlax-curve-getDistAtPoint en p2)
  20. )
  21.   (if (> d2 d1) (setq rtn (- d2 d1)) (setq rtn (+ d (- d2 d1))))
  22.   (princ "\n第一点:X = ")
  23.   (princ (car p1))
  24.   (princ "  Y = ")
  25.   (princ (cadr p1))
  26.   (princ "  第二点:X = ")
  27.   (princ (car p2))
  28.   (princ "  Y = ")
  29.   (princ (cadr p2))
  30.   (princ "  距离 = ")
  31.   (princ rtn)
  32.   (redraw en 4)
  33.   (princ)
  34.   )
 楼主| 发表于 2010-8-5 15:06:00 | 显示全部楼层

感谢楼上两位高手的热心说明.

但我总想找到一种通过点坐标直接计算出弧长的方式.

不知道有无这种方法?

 

或者是在LISP中设定一个椭圆尺寸,再将其设为如24等分,再求出各等分点坐标,再通过坐标求出弧长.

 

或通过给定弧长,反求出坐标点更好.

 

但这些工作都是LISP自动化完成,而不需手工从图中点取坐标.

不知这样的想法是不是太高了.

发表于 2010-8-5 21:54:00 | 显示全部楼层

不知楼主到底要怎么计算?如果不用人选择,数据从哪来?是不是还要人工输入?

发表于 2010-8-5 22:33:00 | 显示全部楼层

如果要直接算出弧长

那应该先去翻一下平面几何的书

椭圆的周长是没有精确解的

自然椭圆弧也不可能有精确解

参照这个你再仔细考虑下你的需求

有没有继续研究的必要

发表于 2010-8-6 08:26:00 | 显示全部楼层
楼主的要求实际上是可以实现的,关键是精度问题。
下面的程序在精度要求不很高的情况下,可以满足。
至于对话框的设计和出错,这个程序就没有考虑了。
有时间写一个精度比较高的。
实际上如果要在lisp中运行,你也可以这样做:
输入参数后,由参数反推椭圆弧的起始角度和终止角度,用参数创建一个椭圆,然后得到弧长,然后删除掉这个弧,这样也能满足精度要求。
  1. ;;; 计算椭圆弧长的程序
  2. ;;; 稍加改造就可以计算任何曲线的弧长
  3. ;;; 或者计算积分
  4. ;;; highflybird  2012-12-21 in Shenzhen
  5. (defun c:test ();;(/ a b x y k c s A1 A2 AA C)
  6.   (initget 7)
  7.   (setq a (getdist "\n请输入椭圆的长轴:"))
  8.   (initget 7)
  9.   (setq b (getdist "\n请输入椭圆的短轴:"))
  10.   (setq x (getreal "\n起点X1= "))   ;建议改成起始角度
  11.   (setq y (getreal "\n终点X2= "))             ;建议改成终止角度
  12.   (if (not (and a b x y))
  13.     (exit)
  14.   )
  15.   (setq k (/ b a))     ;比率
  16.   (setq c (1- (* k k)))
  17.   (setq aa (/ 1.0 a a))
  18.   ;;反求角度
  19.   (setq a1 (atan (sqrt (* b b (- 1 (* x x aa)))) x))
  20.   (setq a2 (atan (sqrt (* b b (- 1 (* y y aa)))) y))
  21.   ;;积分函数
  22.   (defun func (x)
  23.     (sqrt (1+ (* (sin x) (sin x) c)))
  24.   )
  25.   (setq s (* a (qsimp a1 a2)))
  26.   ;;(setq s (* a (qsimp x y)))     ;如果这个地方为角度是不是更精确些呢?
  27.   (princ "\n弧长是:")
  28.   (princ (rtos s 2 20))
  29.   (princ "\n周长是:")
  30.   (princ (rtos (approx a b) 2 20))
  31.   (princ)
  32. )
  33. ;;; 求椭圆周长的公式
  34. (defun approx (a b / c d e)
  35.   (setq c (+ a b))
  36.   (setq d (- a b))
  37.   (setq e (/ (* d d) (* c c)))
  38.   (* pi c (1+ (/ (* 3 e) (+ 10 (sqrt (- 4 (* 3 e)))))))
  39. )
  40. ;;; 步长积分法
  41. (defun trapzd (a b n / DEL IT SUM TNM X)
  42.   (if (= n 1)
  43.     (setq s (* 0.5 (- b a) (+ (func a) (func b))))
  44.     (progn
  45.       (setq it 1)
  46.       (repeat (- n 2)
  47. (setq it (lsh it 1))
  48.       )
  49.       (setq tnm it)
  50.       (setq del (/ (- b a) tnm))
  51.       (setq x (+ a (* 0.5 del)))
  52.       (setq sum 0.0)
  53.       (repeat it
  54. (setq sum (+ sum (func x)))
  55. (setq x (+ x del))
  56.       )
  57.       (setq s (* 0.5 (+ s (/ (* (- b a) sum) tnm))))
  58.     )
  59.   )
  60. )
  61. ;;; 辛普森积分法
  62. (defun qsimp (a b / EPS J JMAX OS OST s ST)
  63.   (setq JMAX 20)
  64.   (setq EPS 1.0e-10)
  65.   (setq ost 0.0
  66. os  0.0
  67.   )
  68.   (setq j 0)
  69.   (while (< j JMAX)
  70.     (setq st (trapzd a b (1+ j)))
  71.     (setq s (/ (- (* 4.0 st) ost) 3.0))
  72.     (if (> j 5)
  73.       (if (or (< (abs (- s os)) (* EPS (abs os)))
  74.        (and (= s 0.0) (= os 0.0))
  75.    )
  76. (setq j JMAX)
  77.       )
  78.     )
  79.     (setq os s)
  80.     (setq ost st)
  81.     (setq j (1+ j))
  82.   )
  83.   s
  84. )
发表于 2010-8-6 09:23:00 | 显示全部楼层

感谢诸位楼主,

收藏学习!

 楼主| 发表于 2010-8-6 14:35:00 | 显示全部楼层

感谢ZZXXQQ版主一针见血的说明,这个问题的的应用在于椭圆构件的展开放样计算。

1、已知椭圆长短圆及椭圆心点(即长短轴交点)坐标;

2、已知椭圆周长要等分成N等分段

求解:

每个等分点的坐标?

 

目前根据ZZXXQQ版主及网上找到的精确椭圆周长计算公式,已可以在误差远远小于万分之一的精度下求出椭圆周长,除N等分段后也就每等分段的椭圆弧长,但根据此弧长,如何求出各等分段弧长分界点的坐标(相对椭圆轴心点的坐标)???

求出了这些坐标点之后,也就可以计算出椭圆构件的展开下料样图了。

 

因为网上都说这类计算是世界难题无精确解,但我想总有个相对精确的答案吧。

这才来明经这个CAD高手如云的地方,请各位高手指点指点。

发表于 2010-8-6 15:42:00 | 显示全部楼层

分成N等分段?
用 Divide 命令不成吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-28 03:06 , Processed in 0.200158 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表