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

时间:2011-08-25 22:53:55

标签: language-agnostic polygon point-in-polygon

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

  1. 选择从半径和中心点开始的角度
  2. 以某种方式计算距中心距离的x,y位置(如何?)
  3. 将360除以边数,移动该距离并从第一个x,y点绘制下一行
  4. 继续,直到角度= 360除以该数字。
  5. 假设我的假设是正确的,那么主要的是要了解如何计算x,y点。

    倾向于使用Visual Basic(甚至旧式Microsoft / Atari / Commodore BASIC)或英语中可读的一组步骤来回答答案。如果你必须用数学公式回答,用计算机语言来做,这样我就可以读它,即使用C或C ++我也可以弄明白,但我不知道如何阅读数学符号。我正在使用的语言是一种类似Visual Basic的语言,除了线条图之外几乎没有任何图形基元。

6 个答案:

答案 0 :(得分:39)

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

x[n] = r * cos(2*pi*n/N)
y[n] = r * sin(2*pi*n/N)

其中0 <= n &lt; 名词的。请注意,cossin这里的工作弧度,而不是度数(这在大多数编程语言中都很常见)。

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

x[n] = r * cos(2*pi*n/N + theta) + x_centre
y[n] = r * sin(2*pi*n/N + theta) + y_centre

答案 1 :(得分:6)

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

答案 2 :(得分:2)

如果你想以一些错误累积为代价来加快速度,可以使用统一的第n个根(复数)并获取它的幂(使用你语言中的内置复数支持或编码乘法用手)。在C:

complex double omega=cexp(2*M_PI*I/n), z;
for (i=0, z=1; i<n; i++, z*=omega) {
    /* do something with z */
}

答案 3 :(得分:2)

这是一个完整的c ++程序,可以打印出正多边形的点。在这种情况下,p是边数,r是多边形的半径,d是第一个点距中心的方向或角度。也许这会有所帮助。

//g++ ck.cpp -o ck && ./ck
#include <stdio.h>
#include <math.h>

int p=3; //number of sides
double r=1000,d=3/4.0;

int main()
{
 int i=0;
 double x,y,t;
 while(i<p)
 {
  t=2*M_PI*((double)i/p+d);
  x=cos(t)*r;
  y=sin(t)*r;
  printf("x%i:%f y%i:%f\n",i,x,i,y);
  i++;
 }
}

答案 4 :(得分:1)

我知道你在Visual Basic中要求答案,但here is a solution in JavaScript

答案 5 :(得分:1)

“for n_sides:”答案是最简单的。对于那些建议您可以使用复数来简化计算的人来说,几乎所有的数学库都有基于表的cos()和sin()例程,并且有效插值,因此无需深入研究相对模糊的解决方案。通常可以初始化常规n-gon,并且OpenGL的硬件缩放用于对任何特定实例进行缩放/转换。

如果您想成为硬核,请预先生成所需的所有n-gons并将其加载到顶点缓冲区中。

顺便说一句,这是Lua的上述解决方案。它只打印出坐标,但你当然可以自由地返回数组/表中的坐标。返回的坐标可用于初始化OpenGL GL_LINE_LOOP网格原语。

require 'math'

-- computes coordinates for n-sided, regular polygon of given radius and start angle
-- all values are in radians

function polypoints(sides, radius, start)
    local x_center = 0.0
    local y_center = 0.0
    local angle = start
    local angle_increment = 2 * math.pi / sides
    local x=0.0
    local y=0.0

    print(string.format("coordinates for a %d sided regular polygon of radius %d\nVertex",sides,radius),"X"," ","Y")
    for i=1,sides do
        x = x_center + radius * math.cos(angle)
        y = y_center + radius * math.sin(angle)
        print(string.format("%d\t%f\t%f",i,x,y))
        angle = angle + angle_increment
    end
end

-- Generate a regular hexagon inscribed in unit circle 
polypoints(6, 1.0, 0.0)