找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7013|回复: 19

[几何] 点围成的多边形面积

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-7 11:24:44 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::PNTS:Area
调用格式: (XD::PNTS:Area pts)
参数说明: pts ---- 点表
返回值: 实数
函数简介: 点围成的多边形面积
函数来源: 原创
函数作者: Lispboy
适用版本: 不限 
最后更新时间: 2013-06-07
备注: 函数本身并不是重要的,重要的是利用它判断点表的顺、逆时针。

采用的是数学的行列式的方法算得面积,面积有正负,逆时针正,顺时针负。

点表构成的多边形要保证不自交,自交可能结果不对。
演示图片: -

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 Lispboy 于 2013-6-7 11:26 编辑

  1. ;|;;; 点围成的多边形面积

  2. 参数: pts ----点表
  3. 返回值: 实数

  4. 副作用: 如果点表是逆时针,面积正, 顺时针 面积负
  5. |;
  6. (defun XD::PNTS:Area (pts / pts1 iSum p0 p1 p2 x0 x1 x2 y0 y1 y2)
  7.   (setq pts1 pts)
  8.   (setq iSum 0)
  9.   (setq p0 (car pts)
  10.         x0 (car p0)
  11.         y0 (cadr p0)
  12.   )
  13.   (while (cdr pts1)
  14.     (setq p1 (car pts1)
  15.           x1 (car p1)
  16.           y1 (cadr p1)
  17.           p2 (cadr pts1)
  18.           y2 (cadr p2)
  19.           x2 (car p2)
  20.           iSum (+ iSum (- (* x1 y2) (* x2 y1)))
  21.           pts1 (cdr pts1)
  22.     )
  23.   )
  24.   (/ (+ iSum (- (* (caar pts1) y0) (* x0 (cadar pts1)))) 2.0)
  25. )



评分

参与人数 1D豆 +5 收起 理由
wowan1314 + 5 懒得去看公式了。直接收藏。

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 347个

财富等级: 日进斗金

发表于 2013-6-7 13:18:16 | 显示全部楼层
算法很简单,这才是高手呀!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3032个

财富等级: 富可敌国

发表于 2013-6-7 16:02:53 | 显示全部楼层
配合楼主的另一个多边形点表排序,就可以得到多边形面积。
以顺、逆时针算出来的多边形面积的“正、负”,就可以代表是实心,或是空洞。
赞一个。

点评

精彩解读,你能写一个你上面说的测试命令吗?  详情 回复 发表于 2013-6-8 13:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 394个

财富等级: 日进斗金

发表于 2013-6-8 12:02:05 | 显示全部楼层
想问一下这个如果有凸度是不是面积也能算出来的?

点评

函数参数不是 点表吗,没凸度。 对于有弧线的,你可以先模拟成折线,在用这个函数。 这个函数出发点不是为了求各种复杂多边形型心的,是为了配合编程时候的一些需要。更主要的是判断点表的逆顺时针。  详情 回复 发表于 2013-6-8 13:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-8 13:06:14 | 显示全部楼层
kwok 发表于 2013-6-8 12:02
想问一下这个如果有凸度是不是面积也能算出来的?

函数参数不是 点表吗,没凸度。
对于有弧线的,你可以先模拟成折线,在用这个函数。

这个函数出发点不是为了求各种复杂多边形型心的,是为了配合编程时候的一些需要。更主要的是判断点表的逆顺时针。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-8 13:35:46 | 显示全部楼层
auva 发表于 2013-6-7 16:02
配合楼主的另一个多边形点表排序,就可以得到多边形面积。
以顺、逆时针算出来的多边形面积的“正、负”, ...

精彩解读,你能写一个你上面说的测试命令吗?

点评

这是行周培德老师的计算几何-算法设计与分析(第三版)里面节录出来的。 1.求P与Q的凸壳,设为C 2.计算P与Q的交点,并记录交点于A中。 3.从凸壳C中点pi(或qi)出发,沿P边(或Q边)按逆时针方向行进,碰到交点改沿另  详情 回复 发表于 2013-6-8 20:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3032个

财富等级: 富可敌国

发表于 2013-6-8 20:13:52 | 显示全部楼层
本帖最后由 auva 于 2013-6-8 20:14 编辑
Lispboy 发表于 2013-6-8 13:35
精彩解读,你能写一个你上面说的测试命令吗?

这是从周培德老师的计算几何-算法设计与分析(第三版)里面节录出来的。

1.求P与Q的凸壳,设为C
2.计算P与Q的交点,并记录交点于A中。
3.从凸壳C中点pi(或qi)出发,沿P边(或Q边)按逆时针方向行进,碰到交点改沿另一多边形边逆时针方向行进,   直至回到出发点,便得到P∪Q的外围边界。
If  A=  then 输出结果,终止。
Else
从A中任一剩馀点出发,按顺时针方向沿多边形边(该边前进方向上另一端点不在另一多边形内而且该边前进
方向上无交点或奇数个交点,或者该边前进方向上另一端点在另一多边形内并且该边前进方向上有偶数个交
点),碰到交点改沿另一多边形边行进,直至回到出发点,即得到P∪Q的空洞边界。该过程继续下去,直至
A=。输出结果,终止。

配合楼主的面积函数可得到外围及空洞的面积,那也就可以得到二个多边形合并后的面积值了。下图虚线为凸壳,斜线部份为空洞。因为手边刚好有资料,所以知道楼主的函数超实用的。

01.jpg


点评

哇,受教。 兄台能否给写个LISP的具体应用?  详情 回复 发表于 2013-6-8 20:20

评分

参与人数 1D豆 +5 收起 理由
Lispboy + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-6-8 20:20:39 | 显示全部楼层
auva 发表于 2013-6-8 20:13
这是从周培德老师的计算几何-算法设计与分析(第三版)里面节录出来的。

1.求P与Q的凸壳,设为C

哇,受教。 兄台能否给写个LISP的具体应用?

点评

哈哈,楼主太抬举我了,我对LISP只是皮毛,使用的多,写得少。  详情 回复 发表于 2013-6-8 20:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3032个

财富等级: 富可敌国

发表于 2013-6-8 20:32:54 | 显示全部楼层
Lispboy 发表于 2013-6-8 20:20
哇,受教。 兄台能否给写个LISP的具体应用?

哈哈,楼主太抬举我了,我对LISP只是皮毛,使用的多,写得少。;P

点评

看你贴出的资料,不用LISP写程序,那也一定用其他的,敢问您常用什么语言开发?  详情 回复 发表于 2013-6-8 20:45
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2013-6-8 20:45:22 | 显示全部楼层
auva 发表于 2013-6-8 20:32
哈哈,楼主太抬举我了,我对LISP只是皮毛,使用的多,写得少。

看你贴出的资料,不用LISP写程序,那也一定用其他的,敢问您常用什么语言开发?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-6-18 07:20:49 | 显示全部楼层
有用,XD::Pnts:Centroid里面有的函数!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-7-2 10:13:37 | 显示全部楼层
;;n个点的面积
[pcode=lisp,true](defun Area-of-Verties (pts / area x1 y1 x2 y2)
  (setq area 0)
  (setq pts (cons (last pts) pts))
  (setq x1 (caar pts))
  (setq y1 (cadar pts))
  (repeat (1- (length pts))
    (setq pts (cdr pts))
    (setq x2 (caar pts))
    (setq y2 (cadar pts))
    (setq area (+ (- (* x1 y2) (* x2 y1)) area))
    (setq x1 x2)
    (setq y1 y2)
  )
  (abs (* area 0.5))
)[/pcode]
这个更简单,计算量更少。

点评

最后别ABS, 一ABS, 这个函数的精华就没了。  详情 回复 发表于 2013-7-2 11:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-7-2 11:15:59 | 显示全部楼层
Highflybird 发表于 2013-7-2 10:13
;;n个点的面积
(defun Area-of-Verties (pts / area x1 y1 x2 y2)
  (setq area 0)

最后别ABS, 一ABS, 这个函数的精华就没了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-7-2 11:19:27 | 显示全部楼层
关于自交的多边形,现在XDRX API里面有个函数  xdrx_polyline_XTrim 能处理成多个非自交的多边形了。

判断是否自交也有个函数:xdrx_polyline_isSelfIntersect

我看看写个通用的函数处理下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 275个

财富等级: 日进斗金

发表于 2013-7-2 21:03:05 | 显示全部楼层
弄到CAD里面,没反应啊,这个怎么用啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 04:22 , Processed in 0.480081 second(s), 66 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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