前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >平面几何:求内接或外切于圆的正多边形

平面几何:求内接或外切于圆的正多边形

作者头像
前端西瓜哥
发布于 2024-04-03 12:26:21
发布于 2024-04-03 12:26:21
18500
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是前端西瓜哥。

如题,今天来看两个算法实现。

求和圆内接的正多边形

方法参数有:

  1. center:圆心位置;
  2. start:正多边形上的一个点,和 center 的距离即圆的半径;
  3. count:多边形边数。

返回值为多边形上连续的点数组。

思路是,让起点基于圆心旋转 PI * 2 / count 度数的倍数,执行 count - 1 次,拿到所有的点。

算法实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 计算和圆内接的正多边形
 * @param center 圆心
 * @param start 起点
 * @param count 边数
 */
export const getInternalTanRegularPolygon = (
  center: Point,
  start: Point,
  count: number,
) => {
  const points: Point[] = [{ ...start }];
  const step = (Math.PI * 2) / count;
  for (let i = 1; i < count; i++) {
    points.push(rotate(start, center, step * i));
  }
  return points;
};

这里用到一个辅助方法 rotate:计算一个点以另一个点为旋转中心,旋转特定弧度后的点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const rotate = (p: Point, center: Point, rad: number) => {
  const dx = p.x - center.x;
  const dy = p.y - center.y;
  const cos = Math.cos(rad);
  const sin = Math.sin(rad);
  return {
    x: center.x + dx * cos - dy * sin,
    y: center.y + dx * sin + dy * cos,
  };
};

上面这个写法是很朴实的解析几何推导出来的。

或者用矩阵的方式表达,可读性更好,但通常需要引入一个矩阵库,下面是 pixi.js 的写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const rotate = (p: Point, center: Point, rad: number) => {
  const matrix = new Matrix()
    .translate(-center.x, -center.y) // (3) 坐标轴回到原来位置
    .rotate(rad) // (2) 旋转
    .translate(center.x, center.y); // (1) 坐标轴原点移动到 center

  return matrix.apply(p);
};

这里所有的点都是基于起点 start 旋转不同的度数得到的。

也可以基于旋转后的点,继续旋转,这样可以复用旋转矩阵,计算量会少一点。

二者的结果不完全相同,因为各自的实现有各自的误差,但很小,可以忽略不计。

求和圆外切的正多边形

外切要求的效果如下,start 为多边形其中一边的中点,其他同上。

思路是计算一个新的起点 start,然后应用前的的外切方法。

首先 start 基于 center 旋转 PI / count

然后计算 外切时半径距离<center, start> 的比值 t,为 1 / cos(PI / count)

基于 t 使用 线性插值,计算出外切时的 start。

如果你不知道线性插值是什么,可以看我的这篇文章: 《平面几何算法:求点到直线和圆的最近点

算法实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 计算和圆外切的正多边形
 * @param center 圆心
 * @param start 起点
 * @param count 边数
 */
export const getExternalTanRegularPolygon = (
  center: Point,
  start: Point,
  count: number,
) => {
  // 转换为内接多边形,计算新的 start
  const offsetAngle = Math.PI / count;
  start = rotate(start, center, offsetAngle);
  const t = 1 / Math.cos(offsetAngle);
  start = {
    x: center.x + (start.x - center.x) * t,
    y: center.y + (start.y - center.y) * t,
  };

  return getInternalTanRegularPolygon(center, start, count);
};

效果演示

结尾

内接正多边形的思路为:起点基于圆心旋转边数次数,所产生的点集。

外切正多边形,可以转换为求内接,只需要用三角函数和线性插值计算等价的内接下的起点。

我是前端西瓜哥,关注我,学习更多平面几何知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端西瓜哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
平面几何算法:求点到直线和圆的最近点
比如精细的图形拾取(尤其是一些没有填充只有描边的图形)。如果光标点到最近点的距离小于某个阈值,计算图形就算被选中。
前端西瓜哥
2024/03/04
4070
平面几何算法:求点到直线和圆的最近点
使用 C# Graphics 绘图来绘制一个足球
2022卡塔尔世界杯是足球爱好者的狂欢,这与我毫无关系,作为一个缺乏运动的人,还是不要去看人家玩命的运动了。虽然不看球,不过这波热度的持续冲击,还是让我在朋友圈刷到了结局 ———— 球王梅西如愿以偿捧得金杯,后起之秀姆巴佩加冕金靴。但作为程序员,为了增加一些参与感我就拿 C# 画个足球图案吧。
桑榆肖物
2023/01/03
7000
使用 C# Graphics 绘图来绘制一个足球
网页CAD二次开发实现圆转多边形的详细教程
在线CAD SDK的集成过程中,甲方客户可能有实现圆转多边形功能的需求,作为开发者如何利用WEB CAD SDK展现此功能效果呢?本章节我们重点讲述一下。
梦想云图网页CAD
2024/04/09
1910
网页CAD二次开发实现圆转多边形的详细教程
平面几何:求直线线段的轮廓线
求线段的法向量,乘以线宽的一半,得到位移向量。然后让线段的两个点分别做两个方向的位移,得到多边形的 4 个顶点,将它们按照一定顺序连接起来得到多边形,这个多边形就是我们要求的轮廓多边形。
前端西瓜哥
2024/07/31
1460
平面几何:求直线线段的轮廓线
凸包多边形最小外切矩形算法
其实我对算法不是很在行, 但是项目中有用到某种算法 来实现某种功能, 也得硬着头皮来实现. 这是很早之前的一个项目了, 要计算一个凸包多边形最小外切矩形 . 遇到这种情况肯定是束手无策.. 在翻了一些资料之后. 终于完成了.
chuchur
2022/10/25
8940
凸包多边形最小外切矩形算法
平面几何:判断点是否在凸多边形内
在之前的 求两向量的夹角的文章 中我提到过,对于两个向量,我们可以利用叉积的符合右手定则,判断两个向量的位置关系。
前端西瓜哥
2024/05/15
2620
平面几何:判断点是否在凸多边形内
【Web技术】1139- 手把手教你实现手绘风格图形
https://juejin.cn/post/6942262577460314143
pingan8787
2021/11/17
8820
可视化拖拽组件库一些技术要点原理分析(二)
本文是对《可视化拖拽组件库一些技术要点原理分析》的补充。上一篇文章主要讲解了以下几个功能点:
谭光志
2021/01/20
1.4K0
可视化拖拽组件库一些技术要点原理分析(二)
百度地图电子围栏功能
今年疫情以来,工作都比较紧凑,没能抽出时间来记录工作日常了。最近接触一个项目需要使用到百度地图的围栏功能,作为前期调研,先探探路。 经过一番搜搜,找到一篇不错的文章。专门介绍,百度地图围栏的。地址如下:https://www.cnblogs.com/CherishTheYouth/p/CherishTheYouth_20190416.html
用户5640963
2020/10/26
4.2K0
百度地图电子围栏功能
平面几何:判断点是否在多边形内(射线法)
之前我们讲解了如何利用叉乘 判断点是否在凸多边形内。但该算法限制较大,多边形必须为凸多变形。
前端西瓜哥
2024/05/22
6430
平面几何:判断点是否在多边形内(射线法)
给定一个边与边可能相交的多边形,求它的轮廓线
需要注意的是,轮廓线多边形内不能有空洞,使用的不是常见的非零绕数规则(nonzero)以及奇偶规则(odd-even)。
前端西瓜哥
2024/01/22
2180
给定一个边与边可能相交的多边形,求它的轮廓线
你知道吗?圆弧有3种表达方式
所以我们在原来圆形的圆心、半径参数的基础上,加上极坐标弧度表示的起点和终点,就能表达一段圆弧。
前端西瓜哥
2024/06/03
5160
你知道吗?圆弧有3种表达方式
自定义View实现Dribbble上动感的Gallery App Icon
之前在dribbble看到一个很好看的动画效果,很想要,遂仿之。也为了练一下自定义控件,有段时间了,现在整理出来
Jingbin
2021/11/29
6860
Android关于Path你所知道的和不知道的一切
张风捷特烈
2024/01/26
3020
Android关于Path你所知道的和不知道的一切
Flutter 绘制番外篇 - 圆中取形
对一些有趣的绘制 技能和知识, 我会通过 [番外篇] 的形式加入《Flutter 绘制指南 - 妙笔生花》小册中,一方面保证小册的“与时俱进” 和 “活力”。另一方面,是为了让一些重要的知识有个 好的归宿。
张风捷特烈
2022/03/18
8030
Flutter 绘制番外篇 - 圆中取形
Android 正 N 边形圆角头像的实现
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/79706681
程序员徐公
2018/09/17
1.3K0
Android 正 N 边形圆角头像的实现
可视化导学-相关数学知识
HTML 采用的是窗口坐标系,以参考对象(参考对象通常是最接近图形元素的 position 非 static 的元素)的元素盒子左上角为坐标原点,x 轴向右,y 轴向下,坐标值对应像素值。
Cellinlab
2023/05/17
6330
可视化导学-相关数学知识
二维几何基础
1. 点、线、凸边形 /******************************************************* 二维几何基础 【注意】数组下标从1开始。 *******************************************************/ #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <ioma
hotarugali
2022/03/01
6580
代码挑战画 魔法圣诞树
2022年圣诞节到来啦,很高兴这次我们又能一起度过~ 本文会基于C# GDI+技术 实现魔法圣诞树效果!源码和素材在文末全部都有!
天罡gg
2022/12/25
1.3K0
代码挑战画 魔法圣诞树
Unity LineRenderer 根据圆的中心、半径、朝向在三维空间中画圆
在三维空间中生成一个圆,需要知道圆的中心点位置、圆的半径以及圆的朝向这三个参数,通过这三个参数求得在圆上的点坐标,最终通过LineRenderer组件将圆绘制出来:
CoderZ
2022/08/29
1.5K0
Unity LineRenderer 根据圆的中心、半径、朝向在三维空间中画圆
推荐阅读
相关推荐
平面几何算法:求点到直线和圆的最近点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验