2012-06-06 4 views
1

여기 내 문제입니다. 나는 나는 다음과 같은 코드를 사용하여 구축 된 하이퍼 큐브가 :그리드에서 기하학적 모양 내의 점을 선택하는 방법 R

w : (0,0,sqrt(3)/2) 
x : (0,sqrt(2)/sqrt(3),-1/(2*sqrt(3))) 
y : (-1/sqrt(2),-sqrt(2)/(2*sqrt(3)),-1/(2*sqrt(3))) 
z : (1/sqrt(2),-sqrt(2)/(2*sqrt(3)),-1/(2*sqrt(3))) 
: 다음

X <- seq (-1/sqrt(2),1/sqrt(2),length.out=100) 
Y <- seq (-sqrt(2)/(2*sqrt(3)),sqrt(2)/sqrt(3),length.out=100) 
Z <- seq (-1/(2*sqrt(3)),sqrt(3)/2,length.out=100) 
grid <- data.frame (expand.grid(X=X,Y=Y,Z=Z)) 

, 나는 그리드 data.frame에서 삭제할 것 다음 좌표에 의해 정의 된 사면체 위치하지 않은 모든 점

긴 코드가 없으면이 작업을 수행 할 수 없습니다. 누구든지 나를 도울 수 있습니까 감사합니다 !!!

+0

내가 볼록 선체 외부에 포인트를 찾는 것에 대해 R-도움에 대한 몇 가지 논의를 기억하는 것 – baptiste

답변

0

4 면체를 형성하는 평면을 만들고 점이 각 평면의 오른쪽에 있는지 비교합니다.

포인터 : 평면 법선 등으로 내적을 계산하는 것을 생각해보십시오. 하나의 옵션은 4 면체 점에서 각 모서리로 벡터를 그리는 것입니다. 전체 4 점과 1 점의 점을 벡터로 그린 다음 dotproducts와 이것 저것을 사용하여 점 점 벡터가 4 점 이내인지 확인합니다.

벡터는 모퉁이 벡터의 음이 아닌 배수와 충분히 짧은 벡터의 합으로 표현할 수 있다면 사면체 내에있을 것입니다.

1

패키지 ptinpoly은 점이 다면체에 있는지 여부를 찾기 위해 pip3d 기능을 가지고 있습니다.

library(ptinpoly) 
X <- seq(-1/sqrt(2),1/sqrt(2),length.out=10) #I used a smaller dataset here 
Y <- seq(-sqrt(2)/(2*sqrt(3)),sqrt(2)/sqrt(3),length.out=10) 
Z <- seq(-1/(2*sqrt(3)),sqrt(3)/2,length.out=10) 
# The query points has to be inputted as a matrix. 
grid <- as.matrix(expand.grid(X=X,Y=Y,Z=Z)) 

w <- c(0,0,sqrt(3)/2) 
x <- c(0,sqrt(2)/sqrt(3),-1/(2*sqrt(3))) 
y <- c(-1/sqrt(2),-sqrt(2)/(2*sqrt(3)),-1/(2*sqrt(3))) 
z <- c(1/sqrt(2),-sqrt(2)/(2*sqrt(3)),-1/(2*sqrt(3))) 
# The matrix of vertices 
tetra_vert <- matrix(c(w,x,y,z),byrow=TRUE,nrow=4) 
# The matrix of faces (each row correspond to a vector of vertices linked by a face. 
tetra_faces <- matrix(c(1,2,3, 
         1,2,4, 
         1,3,4, 
         2,3,4),byrow=TRUE,nrow=4) 
inout <- pip3d(tetra_vert, tetra_faces, grid) 

결과는 정수 벡터이다 0는 상기 다면체의 내부에있는 외측 -1 얼굴 1의 포인트 감소를 의미한다.

문제의 해결책은 그러므로 :

grid[inout%in%c(0,1),] 
관련 문제