Позиционировать полигон точно в 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)