Как автоматически генерировать примитивные сетки в единстве с 3-16 вершинами? - PullRequest
0 голосов
/ 10 февраля 2019

В данный момент я генерирую сетки (3,4,5 вершин) для себя, я ищу вершины и генерирую сетки.

Моя проблема в том, что я хочу генерировать сетки следующим образом: https://en.wikipedia.org/wiki/Hexadecagon (и ниже: 15,14,13 .. вершин), и я не хочу делать это за руку.Есть ли способ или хитрость, как я могу сделать это с кодом?Я использовал это: https://github.com/CiaccoDavide/Unity-UI-Polygon, но я не могу добавить коллайдеры и получить фактическую сетку, которая генерируется там.

1 Ответ

0 голосов
/ 11 февраля 2019

Вы хотите разместить свои точки на единичной окружности, а затем масштабировать, если хотите.

Учитывая количество вершин> = 3, угол между каждой вершиной равен 360 / (количество вершин)

например, для 5 вершин каждая вершина должна находиться на расстоянии 72 градуса.

Теперь, с начальным углом 0 градусов, для каждой вершины ваша x-координата является косинусом вашего начального угла,и ваша координата Y является синусом вашего начального угла.После каждой вершины увеличивайте начальный угол на вычисленный выше угол.

Вот код Matlab, который демонстрирует то, что я говорю для многоугольника, содержащего 13 вершин:

num_verts = 13;

angle = 360/num_verts;

vertices = zeros(num_verts+1,2); % extra vertex just to plot the complete polygon
for ii=1:num_verts
    vertices(ii,1) = cosd(angle*ii);
    vertices(ii,2) = sind(angle*ii);
end
vertices(end,:) = vertices(1,:);

figure;
plot(vertices(:,1),vertices(:,2))
axis equal;

Ирезультирующий многоугольник: enter image description here

Если вы хотите ввести некоторую случайность в свои полигоны, вы можете повернуть начальный угол на некоторую случайную величину или умножить свои окончательные координаты на некоторую случайную величину.

См. Например, здесь я создал пятиугольник, повернул его и масштабировал.

num_verts = 5;

angle = 360/num_verts;

vertices = zeros(num_verts+1,2); % extra vertex just to plot the complete polygon
rand_angle_shift = 360*rand();
for ii=1:num_verts
    vertices(ii,1) = cosd(angle*ii + rand_angle_shift);
    vertices(ii,2) = sind(angle*ii + rand_angle_shift);
end
vertices(end,:) = vertices(1,:);
vertices = vertices * 20;

figure;
plot(vertices(:,1),vertices(:,2))
axis equal;

enter image description here

Вы можетеумножьте каждую вершину на случайную величину, чтобы получить новый причудливый (но действительный) многоугольник:

num_verts = 6;

angle = 360/num_verts;

vertices = zeros(num_verts+1,2); % extra vertex just to plot the complete polygon
rand_angle_shift = 360*rand();
for ii=1:num_verts
    vertices(ii,1) = cosd(angle*ii + rand_angle_shift);
    vertices(ii,2) = sind(angle*ii + rand_angle_shift);
end
vertices = vertices .* rand(num_verts+1,2);
vertices(end,:) = vertices(1,:);

figure;
plot(vertices(:,1),vertices(:,2))
axis equal;

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...