搜索
bottom↓
回复: 11

有熟悉图像编程的朋友么,请教个计算曲线面积的问题

[复制链接]

出130入129汤圆

发表于 2012-7-30 22:49:12 | 显示全部楼层 |阅读模式
本帖最后由 68336016 于 2012-7-31 09:37 编辑

红色是设计曲线蓝色是实际曲线,目的就是计算超过部分面积(左图绿色区块),不足部分面积(左图红色区块
方法一:用像素法,我能计算出面积,但是误差比较大。因为实际曲线半径一般都是10米级多,缩小成像素,一个点就相当于实际一本书的面积了,图形边界造成的误差比较大,接近10%了

方法二:我把曲线中的圆弧都分解成多段线段,那么设计面积和实际面积我就能通过三角形面积和算出来,这步实现了,结果跟CAD里面比较误差0.05%,可以说很精确了。
现在为了求绿色红色部分面积,就得把两曲线交集面积(白色部分)计算出来,但是想不到什么思路。
我现在有的就是曲线点的坐标(不是所有连续点坐标,因为曲线也是N多直线连接成的),用的是VC6.0

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-7-31 09:06:09 | 显示全部楼层
本帖最后由 xivisi 于 2012-7-31 09:09 编辑

楼主你有曲线点的坐标 相当于已经将曲线进行矢量化了,如此计算所有交点,相邻交点之间的曲线就是绿色或红色的区域,判断红色或者绿色就看在红色曲线内或者外,这样基本上就转换为各个独立区域。
对于凸多边形 按你的三角形法即可计算,
对于凹多边形,可以将大于180度的角的边延长与该多边形另一边相交分解为两个凸多边形,再用凸多边形计算即可,以此类推直至计算完毕。

PS:计算中有各种小技巧,即可加快效率,待楼主挖掘。   竞赛应该有很多类似的题目的

出130入129汤圆

 楼主| 发表于 2012-7-31 09:34:31 | 显示全部楼层
本帖最后由 68336016 于 2012-7-31 09:36 编辑
xivisi 发表于 2012-7-31 09:06
楼主你有曲线点的坐标 相当于已经将曲线进行矢量化了,如此计算所有交点,相邻交点之间的曲线就是绿色或红 ...


肉眼很直观的问题,转换成程序就很难

我得想想怎么求交点

求出交点后,还得判断哪些点(哪个曲线上的)跟交点组成相交部分图形(也就是内部白色部分面积)

出0入0汤圆

发表于 2012-7-31 10:11:14 | 显示全部楼层
本帖最后由 xivisi 于 2012-7-31 10:17 编辑
68336016 发表于 2012-7-31 09:34
肉眼很直观的问题,转换成程序就很难

我得想想怎么求交点


高中数学里有 判断一个点 与一条直线之间关系的方法

另外,做算法真的费脑子的,可以简单的取红色相邻两点,求线性方程,然后取另一曲线两点(一般取靠近的) 如果在直线方程两边,则必有交点,但未必是取的这条线段上,只有向两边相邻不停地取下去了,直到交点在取的线段上

出0入0汤圆

发表于 2012-7-31 10:26:41 | 显示全部楼层
楼主做什么?  感觉像什么运动的东西 计算误差

出130入129汤圆

 楼主| 发表于 2012-7-31 10:53:21 | 显示全部楼层
本帖最后由 68336016 于 2012-7-31 10:55 编辑
xivisi 发表于 2012-7-31 10:26
楼主做什么?  感觉像什么运动的东西 计算误差


计算隧道,涵洞之类开挖土方用的,挖太多浪费混凝土,挖少了混凝土太薄也不行,所以要计算面积,得到实际用量

在CAD里面很简单就能解决,把区块填充,查询面积就可以。

但是VC里面一个个点,线都得自己控制

出130入129汤圆

 楼主| 发表于 2012-7-31 20:01:10 | 显示全部楼层
xivisi 发表于 2012-7-31 10:26
楼主做什么?  感觉像什么运动的东西 计算误差


网上搜了一天,终于解决了,暂时也是拷贝的,自己没消化
像素法非常慢,现在这个办法很快,而且计算精确,跟CAD对比相差0.03%
  1.         CRgn intersectRgn;
  2.         intersectRgn.CreateRectRgn(0,0,0,0);
  3.         int nIntersect = intersectRgn.CombineRgn(&区域1, &区域2 ,RGN_AND);

  4.         //计算相交部分的面积
  5.         Region   intersectRegion((HRGN)intersectRgn);
  6.         Matrix   matrix;
  7.         Rect*   rects   =   NULL;
  8.         int   count   =   0;   
  9.        
  10.         CClientDC   dc(this);
  11.         Graphics   graphics(dc.GetSafeHdc());
  12.         graphics.GetTransform(&matrix);
  13.         count = intersectRegion.GetRegionScansCount(&matrix);
  14.         rects = (Rect*)malloc(count*sizeof(Rect));
  15.         intersectRegion.GetRegionScans(&matrix, rects, &count);
  16.        
  17.         double   dbTotalArea=0;
  18.         for(int j=0; j<count; ++j)
  19.                 dbTotalArea +=(rects[j].GetBottom()-rects[j].GetTop())* (rects[j].GetRight()-rects[j].GetLeft());
  20.        
  21.         free(rects);
  22.         graphics.ReleaseHDC(dc.GetSafeHdc());
  23.         //返回面积值
复制代码

出0入0汤圆

发表于 2012-7-31 23:21:42 | 显示全部楼层
不知道 内部实现 是怎样的

出130入129汤圆

 楼主| 发表于 2012-7-31 23:29:27 | 显示全部楼层
xivisi 发表于 2012-7-31 23:21
不知道 内部实现 是怎样的

利用这个方法计算,我感觉非常方便
对任何的轮廓,只要能矢量化成多边形,就可以求交集,和,差,
变成纯粹的图像计算,自己想计算方法说不定有些漏洞

出0入8汤圆

发表于 2012-7-31 23:51:24 | 显示全部楼层
按路径积分可以求出精确面积
对于多边形(单连通域),实质是求梯形面积和
对于图中的圆弧可以用弧面积公式

出130入129汤圆

 楼主| 发表于 2012-8-1 00:05:13 | 显示全部楼层
canspider 发表于 2012-7-31 23:51
按路径积分可以求出精确面积
对于多边形(单连通域),实质是求梯形面积和
对于图中的圆弧可以用弧面积公式 ...

你说的跟这文章意思差不多,面积越大精度越高

基于 Windows GDI 的几何形状测量
http://www.doc88.com/p-90826581347.html

出0入0汤圆

发表于 2012-8-1 12:46:49 | 显示全部楼层
canspider 发表于 2012-7-31 23:51
按路径积分可以求出精确面积
对于多边形(单连通域),实质是求梯形面积和
对于图中的圆弧可以用弧面积公式 ...

汗,一说路径积分就想起来了 高数教材就有
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 23:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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