You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于边界与最小距离条件在凸包内生成随机点的技术求助

生成满足距离约束的随机点解决方案

以下是实现需求的完整代码,在你原有代码基础上添加了生成符合条件的随机点的逻辑:

# Packages
library(sf)
library(ggplot2)

# Create some points
set.seed(1)
df <- data.frame(
  gr = c(rep("a",5),rep("b",5)),
  x  = rnorm(10),
  y = rnorm(10)
)
df <- st_as_sf(df,coords = c("x","y"),remove = F, crs = 4326)
df.laea = st_transform(
  df,
  crs = "+proj=laea +x_0=4600000 +y_0=4600000 +lon_0=0.13 +lat_0=0.24 +datum=WGS84 +units=m"
)
# Create a contour of the area
ch <- st_convex_hull(st_union(df.laea))

# --------------------------
# 生成符合条件的随机点部分
# --------------------------
# 为每个原始点创建10米缓冲区,然后取并集
buffer_zones <- st_buffer(df.laea, dist = 10) %>% st_union()
# 计算可生成随机点的区域:凸包减去所有缓冲区
safe_area <- st_difference(ch, buffer_zones)

# 在安全区域内生成10个随机点
set.seed(2) # 设置种子保证结果可复现
new_points <- st_sample(safe_area, size = 10, type = "random")

# 可视化验证
ggplot() + 
  geom_sf(data = ch, fill = "white", color = "black") +
  geom_sf(data = df.laea, color = "black", size = 2) +
  geom_sf(data = buffer_zones, fill = "lightgray", alpha = 0.5) + # 显示缓冲区
  geom_sf(data = new_points, color = "red", size = 2) # 显示新生成的点

关键步骤说明

  • 创建安全区域:通过st_buffer给每个原始点生成10米的缓冲区,再用st_difference从凸包中减去这些缓冲区,得到的区域就是既在凸包内、又和所有原始点保持至少10米距离的区域。
  • 生成随机点:使用st_sample在安全区域内随机抽取指定数量的点,设置set.seed可以让结果固定可复现。
  • 可视化验证:把缓冲区和新点都画出来,直观确认新点满足约束条件。

内容的提问来源于stack exchange,提问作者Leprechault

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:20:53