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

二维与三维多边形的拉伸及求交实现技术问询

二维多边形拉伸与三维网格求交实现需求

问题概述

我拥有两类几何对象:

  • 二维复杂多边形:由简单多边形通过联合、求交操作生成,是带孔洞的不规则平面多边形
  • 三维Delaunay网格:通过Delaunay库生成的三角化曲面网格
  • 核心目标:将上述二维多边形拉伸为三维棱柱体,再实现其与三维网格的求交运算,得到两者的交集区域

点集数据

主多边形点集

X;Y;Z
35.15914956;78.54966107;95.93334616
10.12339147;67.726565;46.50762135
33.10041262;15.73882909;74.98416587
85.48932167;39.96002663;51.1448619
46.21523336;12.8587336;82.77562765
73.51383593;70.97941968;55.47440207
59.23688436;13.73958801;95.48606682
93.75441311;13.33222224;52.73499021
4.63521786;55.419832;40.61956532
31.47652114;21.34945653;91.52713898
22.71813192;34.23637355;41.80055647
58.86958222;50.30008143;15.05395915
2.931573131;25.40095661;18.36407754
95.81746964;49.26879815;17.09406125
35.51813508;86.66841997;24.66978039
25.98525334;26.23867571;3.439123517
43.46037934;84.31233676;37.85340872
65.38035821;65.36974586;37.48370415
7.873179491;4.211695591;3.93149063
63.23358861;70.47483704;53.38962635
29.19558775;57.38421168;0.777288362
89.96781199;99.00388762;47.35335182
43.03355464;69.72619569;9.535672797
26.63144582;38.40883667;55.53900963
16.64738749;86.89070942;85.62953194

孔洞多边形点集

X;Y;Z
40.25977006;41.54966107;95.93334616
45.12339147;46.726565;46.50762135
37.10041262;30.73882909;74.98416587

当前已实现的R代码

library(sp)
library(deldir)
library(rgeos)
library(delaunay)

pathCsvKPaths <- "C:/Users/Anton/OneDrive/Desktop/KPaths.csv"
csvPathsFile <- read.csv(pathCsvKPaths, sep = ";")

# 生成二维复杂多边形
cloudOfPointsX <- array(csvPathsFile[["X"]])
cloudOfPointsY <- array(csvPathsFile[["Y"]])
cloudOfPointsZ <- array(csvPathsFile[["Z"]])

listOfPoints = data.frame(cloudOfPointsX, cloudOfPointsY, cloudOfPointsZ)
plot(listOfPoints$cloudOfPointsX, listOfPoints$cloudOfPointsY)
plot(listOfPoints$cloudOfPointsX, listOfPoints$cloudOfPointsY)
i <- 1
polygonRef <- 0
polygonTemp <- 0

while(nrow(listOfPoints) > 2){
  
  pMaxX = listOfPoints[which.max(listOfPoints$cloudOfPointsX),]
  listOfPoints <- listOfPoints[-(match(pMaxX[1], listOfPoints$cloudOfPointsX)),]
  pMaxY = listOfPoints[which.max(listOfPoints$cloudOfPointsY),]
  listOfPoints <- listOfPoints[-(match(pMaxY[2], listOfPoints$cloudOfPointsY)),]
  pMinX = listOfPoints[which.min(listOfPoints$cloudOfPointsX),]
  listOfPoints <- listOfPoints[-(match(pMinX[1], listOfPoints$cloudOfPointsX)),]
  pMinY = listOfPoints[which.min(listOfPoints$cloudOfPointsY),]
  listOfPoints <- listOfPoints[-(match(pMinY[2], listOfPoints$cloudOfPointsY)),]
  
  pts <- matrix(
    c(
      as.numeric(pMinY[1]), as.numeric(pMinY[2]),
      as.numeric(pMaxX[1]), as.numeric(pMaxX[2]),
      as.numeric(pMaxY[1]), as.numeric(pMaxY[2]),
      as.numeric(pMinX[1]), as.numeric(pMinX[2])
    ),
    ncol = 2, byrow = TRUE
  )
  Poly.2 <- Polygon(pts)      # 构建Polygon对象
  Poly.2 <- SpatialPolygons(list(Polygons(list(Poly.2), ID = 1)))
  plot(Poly.2, add = TRUE, col = "green")
  
  if(i == 1){
    polygonRef <- Poly.2
  }else{
    polygonTemp <- Poly.2
    polygonRef <- gUnion(polygonRef, polygonTemp, byid = FALSE)
  }
  
  i <- i + 1
}
plot(polygonRef, col="magenta")

# 扣除孔洞得到最终二维多边形
obstacleNumber <- 2
for(i in 1:obstacleNumber){
  pathStringObstacle <- paste("C:/Users/Anton/OneDrive/Desktop/Obstacle_", i, ".csv", sep = "")
  obstaclePolygon <- read.csv(pathStringObstacle, sep = ";")
  
  cloudOfPointsX <- array(obstaclePolygon[["X"]])
  cloudOfPointsY <- array(obstaclePolygon[["Y"]])
  
  listOfPoints = data.frame(cloudOfPointsX, cloudOfPointsY)
  plot(listOfPoints$cloudOfPointsX, listOfPoints$cloudOfPointsY)
  
  pts <- data.matrix(listOfPoints, rownames.force = NA)
  
  Poly.2 <- Polygon(pts)      # 构建Polygon对象
  Poly.2 <- SpatialPolygons(list(Polygons(list(Poly.2), ID = 1)))
  plot(Poly.2, col = "red")
  
  polygonRef <- gDifference(polygonRef, Poly.2, drop_lower_td = TRUE)
  plot(polygonRef, col="green")
}

# 生成三维Delaunay网格
pts <- cbind(cloudOfPointsX, cloudOfPointsY, cloudOfPointsZ)
del <- delaunay(pts, elevation = TRUE)
# 可视化网格
mesh <- del[["mesh"]]
library(rgl)
open3d(windowRect = c(100, 100, 562, 562))
shade3d(mesh, color = "limegreen")
wire3d(mesh)

寻求技术方案

需要实现以下两个核心操作:

  • 二维多边形拉伸:将已生成的带孔洞二维平面多边形沿指定方向(如Z轴)拉伸为三维棱柱体
  • 三维几何求交:实现上述三维棱柱体与Delaunay三角网格的求交运算,得到交集区域

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:42:10