#python #r #ggplot2 #coordinates #coordinate-transformation
Вопрос:
Примечание: Я работаю в R, но мой вопрос больше связан с логическим мышлением, чем с конкретным вопросом R.
Я создаю блестящее приложение, в котором пользователи рисуют фигуру на сетке 20 на 20, как черная фигура, показанная на рисунке ниже. Форма представлена в функции сервера таблицей, подобной той, что показана ниже. В таблице каждая сторона фигуры представлена строкой, указывающей точки, где начинается и заканчивается сторона, а именно ( x
, y
) и ( xend
, yend
).
Как я могу использовать эту таблицу для вычисления другой, соответствующей красной фигуре, показанной на рисунке. Я бы хотел, чтобы новая форма инкапсулировала введенную пользователем форму, оставив пробел в 1 балл.
Вы можете использовать следующий код для воспроизведения таблицы на вашем конце.
structure(list(sideNo = 1:8, x = c(4L, 4L, 8L, 8L, 4L, 8L, 15L,
18L), y = c(3L, 7L, 16L, 19L, 3L, 16L, 7L, 3L), xend = c(18L,
15L, 15L, 18L, 4L, 8L, 15L, 18L), yend = c(3L, 7L, 16L, 19L,
7L, 19L, 16L, 19L)), row.names = c(NA, -8L), class = c("tbl_df",
"tbl", "data.frame"))
Комментарии:
1. Я бы сначала подумал об
st_buffer
sf
этом, чтобы вычислить это, но, похоже, это не делает квадратные углы. Я бы избегал пользовательского кода, так как форма объектов может стать довольно сложной, поэтому функции буфера могут быть простым способом. Одним из решений может быть перемещение фигуры 4 раза (вверх, вниз, влево, вправо) и объединение этих четырех фигур? например:2. что-то вроде этого:
p<-st_polygon(list(cbind(c(0,1,1,0,0),c(0,0,1,1,0)))); a<-list(p c(1,1),p-c(0,1), p c(-1,1), p, p c(-1,0), p c(1,0),p c(1,-1),p c(0,-1), p c(-1,-1), p c(0,1)); plot(Reduce(st_union,a))