Позиционировать полигон точно в Corona SDK? (относительно известных вершин - проблема в том, что он создает свой собственный центр

Вопрос: Как можно расположить многоугольник относительно одной из его известных точек вершин?

Другими словами, как я могу вычислить, где автоматически сгенерированный центр многоугольника находится относительно одной из известных вершин (т.е. используется в пути)?

Например, изображение, помещающее конкретную фигуру на карту, которую вы составляете многоугольником, затем вы хотите расположить на карте, но вы не можете сделать это точно, не зная, где находится центр, созданный движком Corona. Извлечение из API: "Локальное начало находится в центре многоугольника, и точка привязки инициализируется для этого локального начала".

PS На самом деле интересно, стоит ли мне использовать линию и добавляющие точки для создания эффективного многоугольника, однако, возможно, вы не можете добавить цвет фона в этом случае (?)

1 ответ

Решение

Центр, рассчитанный короной, является центром ограничительной рамки многоугольника.

Я предполагаю, что у вас есть таблица со всеми точками вашего многоугольника, которые хранятся так:

local polygon = {x1,y1,x2,y2,...,xn,yn}

1) чтобы найти ограничивающий прямоугольник ваших исходных точек, выполните цикл по всем точкам; наименьшее значение x и наименьшее значение y дадут вам координаты верхней левой точки; самые большие значения x и y относятся к нижней правой точке;

local minX = -math.huge
local minY = -math.huge
local maxX = math.huge
local maxY = math.huge

for i=1, #polygon, 2 do
    local px = polygon[i]
    local py = polygon[i+1]
    if px > maxX then maxX = px end
    if py > maxY then maxY = py end
    if px < minX then minX = py end
    if py < minY then minY = py end
end

2) найдите центр этой ограничительной рамки:

local centerX = (maxX - minX)/2
local centerY = (maxY - minY)/2

3) добавить центральную точку к верхней левой точке

local offsetX = centerX + minX
local offsetY = centerY + minY    

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

Должен работать бот, я его не проверял. Дай мне знать.

Я использовал вариант решения выше, так как не смог заставить его работать. По сути, я нашел минимальные координаты вершин в каждом измерении и добавил их в положение многоугольника. Сравнивая их с позициями contentBounds, я могу вычислить разницу между тем, где, как я думал, будут минимумы, и тем, где они находятся.

local min_x = math.huge
local min_y = math.huge
for v = 1, #vertices, 2 do
    min_x = math.min(min_x, vertices[v])
    min_y = math.min(min_y, vertices[v + 1])
end

local poly = display.newPolygon(x, y, vertices)
local offset_x = (x + min_x) - poly.contentBounds.xMin
local offset_y = (x + min_y) - poly.contentBounds.yMin
poly:translate(offset_x, offset_y)
Другие вопросы по тегам