二维与三维多边形的拉伸及求交实现技术问询
二维多边形拉伸与三维网格求交实现需求
问题概述
我拥有两类几何对象:
- 二维复杂多边形:由简单多边形通过联合、求交操作生成,是带孔洞的不规则平面多边形
- 三维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
相关产品推荐
相关产品推荐

