技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2347|回复: 7
收起左侧

【非原创】一个有趣的数学题,可以给出编程解法

[复制链接]

1

主题

2

帖子

24

积分

用户组: 初·技术宅

UID
411
精华
0
威望
1 点
宅币
20 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2014-8-4
发表于 2014-8-4 20:24:04 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
这是几个月前我遇到的一个编程问题,网上有解法,但是最好自己动手试试,数学嘛,自己解才有意思。
設 A1 (x1 , y1) , A2 (x2 , y2) , … , An (xn,yn) 為 n 邊形之頂點坐標且為逆時針定向,則此 n 邊形的面積為?

1010

主题

2246

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
200
威望
265 点
宅币
16897 个
贡献
33725 次
宅之契约
0 份
在线时间
1608 小时
注册时间
2014-1-26
发表于 2014-8-7 04:32:12 | 显示全部楼层
这个嘛,很简单,既然是逆时针方向,那么统计每个三角形的面积最后求和就行了。

1

主题

2

帖子

24

积分

用户组: 初·技术宅

UID
411
精华
0
威望
1 点
宅币
20 个
贡献
0 次
宅之契约
0 份
在线时间
1 小时
注册时间
2014-8-4
 楼主| 发表于 2014-8-15 17:05:03 | 显示全部楼层
0xAA55 发表于 2014-8-7 04:32
这个嘛,很简单,既然是逆时针方向,那么统计每个三角形的面积最后求和就行了。 ...

有没有更简单的,编程实现,考虑多一点,还有,当时没有说明是逆时针的,有没有想过这些点如果是乱序的话,如何解?

1010

主题

2246

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
200
威望
265 点
宅币
16897 个
贡献
33725 次
宅之契约
0 份
在线时间
1608 小时
注册时间
2014-1-26
发表于 2014-8-15 17:17:47 | 显示全部楼层
闲人 发表于 2014-8-15 09:05
有没有更简单的,编程实现,考虑多一点,还有,当时没有说明是逆时针的,有没有想过这些点如果是乱序的话 ...

当然想过乱序的,我做过2D物理引擎的时候就接触到。
乱序的话,如果是凸多边形就好办多了。否则就可能有各种组合而导致有不同的解。
我记得Havok和PhysX的物理引擎都有从多个点计算凸多边形物体的功能

1

主题

8

帖子

58

积分

用户组: 小·技术宅

UID
434
精华
0
威望
2 点
宅币
46 个
贡献
0 次
宅之契约
0 份
在线时间
3 小时
注册时间
2014-8-21
发表于 2014-8-22 00:29:53 | 显示全部楼层
我想到一个解法,就描述下吧:

既然逆时针图形,那么可以近似的看做为圆形。


首先判定边界,在所有X与Y点中找出X轴和Y轴的极大值和极小值,定义为Xmax、Xmin、Ymax、Ymin,令Sfull=|Xmax-Xmin|*|Ymax-Ymin|,先求出能囊括这个圆形的正方形面积。

再求出正方形不包含该圆形部分的阴影面积,相减就是所求面积。

图形描述

图形描述


阴影面积由两部分组成,令每个点在Y轴方向上划直线,分割阴影面积,那么可得到四个三角形阴影以及多个梯形阴影。


同时还有:如果一个轴的方向上出现2个点乃至多个点都在极大值、极小值的位置的情况,那么就记下当它们在X轴方向有极大值的A点集合,记为数组AXmax,再在AXmax中找出Y轴上拥有最大值与最小值的两个点AXmaxYmax、AXmaxYmin,同样可得X轴方向有极小值的点AXmixYmax、AXminYmin。
同理不排除Y轴也有类似情况,若有,则也要获得该类点的集合,记为数组Bmax,并筛选出BXmaxYmax、BXminYmax、BXmaxYmin、BXminYmin。

QQ图片20140822002316.jpg

最少4个顶点,最多8个顶点。

接下来的事情就简单了,为方便,这里选定水平方向的X轴为基准,从Y轴方向的顶点出发,先求出上半部分阴影的2个三角形阴影,再向左、向右逐步求出多个梯形阴影面积,公式大家都知道的,我不啰嗦,问题得解。

1

主题

8

帖子

58

积分

用户组: 小·技术宅

UID
434
精华
0
威望
2 点
宅币
46 个
贡献
0 次
宅之契约
0 份
在线时间
3 小时
注册时间
2014-8-21
发表于 2014-8-22 01:00:00 | 显示全部楼层
本帖最后由 向日葵 于 2014-8-22 01:13 编辑

第二个方法,搜索到一个公式,如下图:

QQ图片20140822004608.jpg

用程序实现也能解,实际上这个公式的思路还是分解多边形为多个三角形,求三角形和实现求面积的解。

单个三角形的面积,S△=1/2 * |(x2-x1)(y3-y1)-(x3-x1)(y2-y1)|,本来我也看不出,感觉和上图公式相似,高数早还给老师了!

1

主题

8

帖子

58

积分

用户组: 小·技术宅

UID
434
精华
0
威望
2 点
宅币
46 个
贡献
0 次
宅之契约
0 份
在线时间
3 小时
注册时间
2014-8-21
发表于 2014-8-22 01:04:23 | 显示全部楼层
本帖最后由 向日葵 于 2014-8-22 01:09 编辑

找到了相关的算法资料,任意多边形面积计算:
http://www.cnblogs.com/vbspine/archive/2013/03/28/2987818.html
原来我第一个方法是所谓的扫描线算法,我感觉也是有些复杂,第二个方法才是主流啊。
直接拷贝了。
任意多边形的面积可由任意一点与多边形上依次两点连线构成的三角形矢量面积求和得出。

       矢量面积=三角形两边矢量的叉乘。

       如下图:
28225014-8a8e835f0a52475189c9f6c7beb5963b.png

按定理,多边形面积由P点与A-G的各顶点连接所构成的三角形矢量面积构成,假定多边形顶点坐标顺序为A-G,逆时针为正方向,则有如下结论:

PAB,PBC,PCD均为顺时针,面积为负;

PDE,PEF,PFG,PGA均未逆时针,面积为正;

但无论正负,均可通过P点与顶点连线的矢量叉乘完成,叉乘结果中已包含面积的正负。

什么是矢量叉乘我早就还给老师,得去补课了。。。

上文后面还有实现程序,有兴趣的自己去看吧。

0

主题

44

帖子

56

积分

用户组: 小·技术宅

UID
4536
精华
0
威望
2 点
宅币
8 个
贡献
0 次
宅之契约
0 份
在线时间
5 小时
注册时间
2018-12-6
发表于 2018-12-6 15:14:07 | 显示全部楼层
很好的一个问题

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-12-15 11:04 , Processed in 0.108432 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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