본문 바로가기
MATLAB 코딩/STL파일 다루기

[Matlab으로 STL파일 다루기] 10. STL과 평면의 교점구하기

by bigpicture 2020. 1. 7.
반응형

10. STL과 평면의 교점구하기 


7강에서 만들었던 stl을 가져옵시다. 


a1=[1 0 0];

a2=[1 1 0];

a3=[0 1 0];

a4=[0 0 0];

a5=[1 0 1];

a6=[1 1 1];

a7=[0 1 1];

a8=[0 0 1];


mystl.vertices=[

                %아랫면

                a1;a2;a3; 

                a1;a3;a4; 

                %윗면

                a5;a6;a7; 

                a5;a7;a8

                %앞면

                a1;a2;a5;

                a5;a2;a6;

                %뒷면

                a4;a3;a7;

                a4;a7;a8;

                %좌측면

                a1;a5;a4;

                a5;a4;a8;

                %우측면

                a2;a3;a6;

                a6;a3;a7;

                ];           


mystl.faces=[1 2 3;

             4 5 6;

             7 8 9;

             10 11 12;

             13 14 15;

             16 17 18;

             19 20 21;

             22 23 24;

             25 26 27;

             28 29 30;

             31 32 33;

             34 35 36;

             ];                      


하나의 face를 구성하는 점이 3개인데요. 이 세개의 점을 하나의 행에 저장하겠습니다. 예를들어서 face1을 구성하는 점이 [1 0 0] [0 1 0] [0 0 0]이라면 아래와 같이 저장되는 것입니다. 


[1 0 0 0 1 0 0 0 0]


#한 face를 구성하는 점들을 같은 행에 저장          

vertices_by_f=0;

for i=1:size(mystl.faces)(1)

  for j=1:3

    a=mystl.faces(i,j);

  vertices_by_f(i,(3*j-2):3*j)=mystl.vertices(a,:);

  end

  end


이번에는 평면을 정의하고 face의 세 모서리들과의 교졈을 구합시다. 


#평면의 방정식 2x+3y-z=0

PL=[2 3 -1 0];


#평면과 모서리 사이의 교점 구하기

for i=1:size(mystl.faces)(1)

p1=vertices_by_f(i,1:3);

p2=vertices_by_f(i,4:6);

p3=vertices_by_f(i,7:9);


interpoint(3*i-2,1:3)=plpointersec2(PL,p1,p2);

interpoint(3*i-1,1:3)=plpointersec2(PL,p1,p3);

interpoint(3*i,1:3)=plpointersec2(PL,p2,p3);

end


교점이 없다고 나온 행을 제거합니다. NA로 표시됩니다. 


#NA 제거 defined by me

interpoint_2=removeNA(interpoint);


두 face가 모서리를 공유하기 때문에, 모서리가 중복으로 입력되었기 때문에 겹치는 부


분을 제거해줍니다. 


#겹치는 부분 제거

interpoint_3=unique(interpoint,'rows');


그래프로 그려서 point가 잘 찾아졌는지 확인합니다. 


#stl 그리기

patch('Faces',mystl.faces,...

  'Vertices',mystl.vertices,...

  'FaceColor',[0.2 0.5 0.7]);

view(-45,45);

axis([-1 3 -1 3 -1 3])

box on;

xlabel('x') 

ylabel('y')

zlabel('z')



hold on


#평면 그리기

[x y] = meshgrid(-0.5:0.1:0.5);

z = 2.*x + 3.*y +0;

surf(x,y,z);


#interpoint 그리기

hold on

marker_size=repelem(50,size(interpoint_3)(1));

marker_col=repelem(3,size(interpoint_3)(1));

scatter3(interpoint_3(:,1),interpoint_3(:,2),interpoint_3(:,3),marker_size,marker_col,'filled');



반응형

댓글