Подтвердить что ты не робот

Как нарисовать односторонний правильный многоугольник в декартовых координатах?

Я пытался выяснить, как написать простую программу для вычисления точек x, y для создания правильного многоугольника из n сторон. Может ли кто-нибудь дать мне несколько примеров кода, которые не используют ранее существовавшие функции, которые рисуют полигоны? Я хочу понять процесс, который, как я предполагаю, выглядит примерно так:

  • выберите угол для начала с радиуса и центральной точки
  • каким-то образом вычислить положение x, y на этом расстоянии от центра (как?)
  • разделите 360 на количество сторон, переместите это расстояние и нарисуйте следующую строку с первой точки x, y
  • продолжайте, пока угол = 360 не будет разделен на это число.

Предполагая, что мои предположения верны, главное - понять, как вычислить точки x, y.

Предпочитайте ответы в визуальном базовом (или даже в старом стиле Microsoft/Atari/Commodore BASIC) или человекообразном наборе шагов на английском языке. Если вам нужно ответить математической формулой, сделайте это на компьютерном языке, чтобы я мог ее прочитать, даже на C или С++ я могу понять это, но я не знаю, как читать математические обозначения. Язык, который я использую, - это язык, основанный на Visual Basic, который почти не содержит графических примитивов, отличных от рисования.

4b9b3361

Ответ 1

Предположим, вы хотите нарисовать N-сторонний многоугольник радиуса r, центрированный на (0,0). Тогда n вершин задаются:

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

где 0 <= n < N. Обратите внимание, что cos и sin здесь работают в радианах, а не в градусах (это довольно часто встречается на большинстве языков программирования).

Если вам нужен другой центр, просто добавьте координаты центральной точки к каждой (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

Ответ 2

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.

Ответ 3

Если вы хотите сделать это быстрее за счет некоторого скопления ошибок, используйте (сложный) примитивный n-й корень из единицы и возьмите его полномочия (используя встроенную поддержку комплексного номера на вашем языке или кодируя умножение рукой). В C:

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

Ответ 4

Вот полная программа на С++, которая выводит точки правильного многоугольника. В этом случае 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++;
 }
}

Ответ 6

Ответ "for n_sides:" является самым простым. Для парня, который предположил, что вы можете упростить вычисления, используя сложные числа, почти все математические библиотеки имеют табличные методы cos() и sin() с эффективной интерполяцией, поэтому нет необходимости вникать в относительно неясные решения. Обычно регулярный n-угольник может быть инициализирован, а аппаратное масштабирование 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)