Как нарисовать односторонний правильный многоугольник в декартовых координатах?
Я пытался выяснить, как написать простую программу для вычисления точек x, y для создания правильного многоугольника из n сторон. Может ли кто-нибудь дать мне несколько примеров кода, которые не используют ранее существовавшие функции, которые рисуют полигоны? Я хочу понять процесс, который, как я предполагаю, выглядит примерно так:
- выберите угол для начала с радиуса и центральной точки
- каким-то образом вычислить положение x, y на этом расстоянии от центра (как?)
- разделите 360 на количество сторон, переместите это расстояние и нарисуйте следующую строку с первой точки x, y
- продолжайте, пока угол = 360 не будет разделен на это число.
Предполагая, что мои предположения верны, главное - понять, как вычислить точки x, y.
Предпочитайте ответы в визуальном базовом (или даже в старом стиле Microsoft/Atari/Commodore BASIC) или человекообразном наборе шагов на английском языке. Если вам нужно ответить математической формулой, сделайте это на компьютерном языке, чтобы я мог ее прочитать, даже на C или С++ я могу понять это, но я не знаю, как читать математические обозначения. Язык, который я использую, - это язык, основанный на Visual Basic, который почти не содержит графических примитивов, отличных от рисования.
Ответы
Ответ 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++;
}
}
Ответ 5
Я знаю, что вы просили ответа в Visual Basic, однако вот решение в JavaScript.
Ответ 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)