首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在笛卡尔坐标下绘制n边正多边形?

如何在笛卡尔坐标下绘制n边正多边形?
EN

Stack Overflow用户
提问于 2011-08-26 06:53:55
回答 6查看 29.3K关注 0票数 28

我一直在试图弄清楚如何编写一个简单的程序来计算x,y点,从而创建一个n边的正多边形。有人能给我一些不使用绘制多边形的已有函数的代码示例吗?我想要了解这个过程,我假设是这样的:

  1. 从半径和中心点开始选择一个角度
  2. 以某种方式计算距离center(how?)
  3. divide 360的x,y位置的边数,移动该距离并从第一个x,y点
  4. 开始绘制下一条线,直到angle=360除以该数字。

假设我的假设是正确的,主要的事情是理解如何计算x,y点。

更喜欢用visual basic (或者甚至是老式的Microsoft/Atari/Commodore BASIC)或者一套人类可读的英文步骤来回答问题。如果你必须回答一个数学公式,用一种计算机语言来做,这样我就能读懂了,即使是用C或C++,我也能算出来,但我不知道怎么读数学符号。我使用的语言是一种类似Visual Basic的语言,除了线条画之外,几乎没有任何图形基元。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-26 06:58:34

让我们假设您想要绘制一个半径为r的N边多边形,以(0,0)为中心。然后n个顶点由下式给出:

代码语言:javascript
复制
x[n] = r * cos(2*pi*n/N)
y[n] = r * sin(2*pi*n/N)

其中0 <= N cos和sin是以弧度工作的,而不是度(这在大多数编程语言中很常见)。

如果你想要一个不同的中心,那么只需将中心点的坐标添加到每个(xn,yn)。如果你想要一个不同的方向,你只需要添加一个恒定的角度。所以一般的形式是:

代码语言:javascript
复制
x[n] = r * cos(2*pi*n/N + theta) + x_centre
y[n] = r * sin(2*pi*n/N + theta) + y_centre
票数 49
EN

Stack Overflow用户

发布于 2011-08-26 06:57:18

代码语言:javascript
复制
angle = start_angle
angle_increment = 360 / n_sides
for n_sides:
    x = x_centre + radius * cos(angle)
    y = y_centre + radius * sin(angle)
    angle += angle_increment

在实践中,当绘制直线而不仅仅是计算角点时,您还需要通过重复第一个点来“连接”多边形。

此外,如果sin()cos()以弧度而不是度为单位工作,则需要2 * PI而不是360

票数 7
EN

Stack Overflow用户

发布于 2011-08-26 15:01:33

如果你想以一些错误累积为代价来使它更快,使用(复数)原始的n次方根并利用它的力量(或者使用你的语言中内置的复数支持或者手工编写乘法)。在C中:

代码语言:javascript
复制
complex double omega=cexp(2*M_PI*I/n), z;
for (i=0, z=1; i<n; i++, z*=omega) {
    /* do something with z */
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7198144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档