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

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

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

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

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


person Greg    schedule 14.06.2015    source источник


Ответы (2)


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

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

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) добавьте это смещение к полигону короны, чтобы поместить его в то же положение, что и исходный полигон.

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

person g.sciacchitano    schedule 16.06.2015
comment
спасибо - попробую. Я не думаю, что вы можете добавлять точки к многоугольнику постфактум, не так ли? Значит, позиция/центр не должны снова меняться? - person Greg; 17.06.2015

Я использовал вариант решения выше, так как не мог заставить его работать. По сути, я нашел минимальные координаты вершин в каждом измерении и добавил их к положению полигона. Сравнивая их с позициями 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)
person personalnadir    schedule 23.05.2019