设计中,用到需要判断点是否在正六边形内,先是在网上搜了好几篇文章,发现都搞的挺复杂的,往往要使用向量运算计算面积夹角距离方向等,或者是射线法算交点,或者是切分三角形,这种思路通用于任意多边形。我考虑到正六边形的特殊性,发现这个问题其实可以很讨巧的超简单解决,而且算法简单到连小学生都能理解,核心只要比较两个线段的长度。
Bing搜了一下“判断点是否在正六边形内”,头两条都是关于此问题的,搜到的豆瓣和魅族论坛里的帖子,里面讨论到的方法都不够简洁。
常用蜂窝网格单元的排列方式有2种,一种是相对2个顶点在Y轴,另一种是相对2个顶点在X轴,判断方式是一样的。
下图以2个顶点在Y轴为例。
要判断点P是否在该正六边形(边长a)内,由于只需判断是否在内,与象限无关,所以先将点P坐标取绝对值x,y
1.首先判断P是否在正六边形的外包矩形内,若 y>=a || x>=(√3)a/2 则不在内部,否则继续下一步判断
2.若MP>MN则P在内部,否则不在内部,等于则在边线上。即判断 a-y>x/(√3)是否成立。
上述是判断指定点是否在指定正六边形内,实际开发者更常见的另一种是判断指定点在一组正六边形蜂窝结构的哪一个单元格中,也可以借鉴这个来判定。
作者:cuixiping 发表于2013-9-24 15:08:16 原文链接
阅读:21 评论:1 查看评论