Main Content

alphaShape

점으로 구성된 다각형과 다면체(2차원과 3차원)

설명

alphaShape는 2차원 또는 3차원 점 집합을 둘러싸는 경계 영역이나 볼륨을 만듭니다. alphaShape 객체를 조작하여 점 주위의 피팅을 꼭 맞게 하거나 느슨하게 하여 비볼록 영역을 만들 수 있습니다. 또한 점을 추가 또는 제거하거나, 구멍이나 영역을 표시하지 않을 수도 있습니다.

alphaShape 객체를 만든 후에 기하학 쿼리를 수행할 수 있습니다. 예를 들어, 점이 셰이프 내부에 있는지 확인하거나, 셰이프를 구성하는 영역의 개수를 구할 수 있습니다. 또한 면적, 둘레, 곡면 면적, 부피와 같은 유용한 수치를 계산하고, 알파 셰이프를 플로팅해 시각적으로 검토할 수도 있습니다.

생성

alphaShape 객체를 만들려면 만들고자 하는 알파 셰이프의 꼭짓점을 정의하는 입력 인수와 함께 alphaShape 함수를 사용하십시오. 알파 반지름과 구멍이나 영역 임계값도 alphaShape 객체를 만들 때 지정할 수 있습니다.

설명

예제

shp = alphaShape(x,y)는 디폴트 알파 반지름을 사용하여 (x,y) 점들로 구성된 2차원 알파 셰이프(Alpha Shape)를 만듭니다. 디폴트 알파 반지름은 모든 점을 둘러싸면서 가장 꼭 맞는 알파 셰이프를 생성합니다.

shp는 다각형을 나타냅니다. 다각형에는 고립된(Isolated) 점이나 모서리가 없으며, 미완(Dangling) 모서리도 없습니다.

예제

shp = alphaShape(x,y,z)는 디폴트 알파 반지름을 사용하여 (x,y,z) 점들로 구성된 3차원 알파 셰이프를 만듭니다.

shp는 다면체를 나타냅니다. 다면체는 앞에서 설명한 다각형의 특성은 가지나, 고립된 면이나 미완 면은 갖지 않습니다.

예제

shp = alphaShape(P)는 행렬 P의 열에 점 (x,y)(x,y,z)를 지정합니다.

예제

shp = alphaShape(___,a)는 위에 열거된 구문에 있는 인수 중 하나를 사용하여 알파 반지름 a를 갖는 알파 셰이프를 만듭니다.

예제

shp = alphaShape(___,Name,Value)는 하나 이상의 Name,Value 쌍 인수로 지정된 추가 옵션을 사용합니다. 예를 들어, 'HoleThreshold'를 사용하여 내부에 구멍이나 빈 공간이 표시되지 않도록 할 수 있습니다.

입력 인수

모두 확장

점의 x 좌표로, 열 벡터로 지정됩니다.

데이터형: double

점의 y 좌표로, 열 벡터로 지정됩니다.

데이터형: double

점의 z 좌표로, 열 벡터로 지정됩니다.

데이터형: double

점 좌표로, 2개 열로 구성된 행렬(2차원 알파 셰이프의 경우)이나 3개 열로 구성된 행렬(3차원 알파 셰이프의 경우)로 지정됩니다.

  • 2차원의 경우 P의 열은 각각 x 좌표와 y 좌표를 나타냅니다.

  • 3차원의 경우 P의 열은 각각 x 좌표, y 좌표, z 좌표를 나타냅니다.

데이터형: double

알파 반지름으로, 음이 아닌 스칼라로 지정됩니다. 디폴트 알파 반지름은 a = criticalAlpha(shp,'all-points')입니다. 이는 모든 점을 둘러싸는 알파 셰이프를 생성하는 가장 작은 알파 반지름입니다.

a = criticalAlpha(shp,'one-region')을 지정하면 영역이 하나만 포함된 알파 셰이프를 생성하는 가장 작은 알파 반지름을 사용할 수 있습니다.

a의 극값은 다음과 같습니다.

  • Inf. 이때 alphaShape는 볼록 껍질(Convex Hull)을 생성합니다.

  • 0. 이때 alphaShape는 빈 알파 셰이프를 생성합니다.

데이터형: double

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: shp = alphaShape(...,'HoleThreshold',10)

채울 내부 구멍의 최대 면적이나 빈 공간의 최대 부피로, 유한하고 음이 아닌 스칼라로 지정됩니다.

  • 2차원의 경우 HoleThreshold는 채울 내부 구멍의 최대 면적을 지정합니다.

  • 3차원의 경우 HoleThreshold는 채울 내부 빈 공간의 최대 부피를 지정합니다. 알파 셰이프를 완전히 통과하는 구멍은 채울 수 없습니다.

'HoleThreshold''RegionThreshold'를 둘 다 지정하면 순서에 따라 임계값이 적용됩니다. alphaShape는 구멍을 채운 후 영역을 표시되지 않게 만듭니다.

데이터형: double

표시하지 않을 영역의 최대 면적(2차원)이나 최대 부피(3차원)로, 음이 아닌 유한한 스칼라로 지정됩니다.

'HoleThreshold''RegionThreshold'를 지정하면 순서에 따라 임계값이 적용됩니다. alphaShape는 구멍을 채운 후 영역을 표시되지 않게 만듭니다.

데이터형: double

속성

모두 확장

점들의 좌표로, 2차원 점 집합의 경우 2열 행렬로 지정되고 3차원 점 집합의 경우 3열 행렬로 지정됩니다. 이러한 점은 처음에 알파 셰이프를 만드는 데 사용됩니다(중복 점 제외).

데이터형: double

알파 반지름으로, 음이 아닌 스칼라로 지정됩니다. 알파 반지름은 알파 셰이프를 만들기 위해 점 위로 펼쳐진 알파 원반이나 알파 구의 반지름입니다.

디폴트 알파 반지름은 a = criticalAlpha(shp,'all-points')이며, 이는 모든 점을 둘러싸는 알파 셰이프를 만드는 가장 작은 알파 반지름입니다. a = criticalAlpha(shp,'one-region')을 지정하면 영역이 하나만 포함된 알파 셰이프를 생성하는 가장 작은 알파 반지름을 사용할 수 있습니다.

Alpha의 극값은 다음 조건을 가집니다.

  • AlphaInf이면 alphaShape는 볼록 껍질(Convex Hull)을 생성합니다.

  • Alpha0이면 빈 alphaShape가 생성됩니다.

데이터형: double

채울 내부 구멍이나 빈 공간의 최대 면적 또는 부피로, 음이 아닌 유한한 스칼라로 지정됩니다.

  • 2차원의 경우 HoleThreshold는 채울 내부 구멍의 최대 면적을 지정합니다.

  • 3차원의 경우 HoleThreshold는 채울 내부 빈 공간의 최대 부피를 지정합니다. 3차원 알파 셰이프를 완전히 통과하여 늘어져 있는 구멍은 채울 수 없습니다.

디폴트 값은 0이며, 이 경우 alphaShape는 구멍이나 빈 공간을 모두 표시합니다. HoleThreshold 속성과 RegionThreshold 속성은 순서에 따라 적용됩니다. alphaShape는 구멍을 채운 후 영역을 표시되지 않게 만듭니다.

데이터형: double

표시하지 않을 영역의 최대 면적(2차원)이나 최대 부피(3차원)로, 음이 아닌 유한한 스칼라로 지정됩니다.

디폴트 값은 0이며, 이 경우 alphaShape는 영역을 모두 표시합니다. HoleThreshold 속성과 RegionThreshold 속성은 순서에 따라 적용됩니다. alphaShape는 구멍을 채운 후 영역을 표시되지 않게 만듭니다.

데이터형: double

객체 함수

alphaSpectrum고유한 알파 셰이프를 제공하는 알파 값
criticalAlpha알파 셰이프에서 임계 변환을 정의하는 알파 반지름
numRegions알파 셰이프에 있는 영역 개수
inShape점이 알파 셰이프 내부에 있는지 확인
alphaTriangulation알파 셰이프를 채우는 삼각분할
boundaryFacets알파 셰이프의 경계 패싯
perimeter2차원 알파 셰이프의 둘레
area2차원 알파 셰이프의 면적
surfaceArea3차원 알파 셰이프의 곡면 면적
volume3차원 알파 셰이프의 부피
plot알파 셰이프 플로팅
nearestNeighbor가장 가까운 알파 셰이프 경계점 확인

예제

모두 축소

데이터의 2차원 포인트 클라우드 셰이프를 찾습니다.

2차원 점 집합을 만들고 플로팅합니다.

th = (pi/12:pi/12:2*pi)';
x1 = [reshape(cos(th)*(1:5), numel(cos(th)*(1:5)),1); 0];
y1 = [reshape(sin(th)*(1:5), numel(sin(th)*(1:5)),1); 0];
x = [x1; x1+15];
y = [y1; y1];
plot(x,y,'.')
axis equal

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

디폴트 알파 반지름을 사용하여 점 집합에 대한 알파 셰이프를 계산합니다.

shp = alphaShape(x,y);
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

디폴트 알파 반지름의 값을 확인합니다.

shp.Alpha
ans = 0.7752

디폴트 알파 반지름은 경계가 들쑥날쑥한 알파 셰이프를 만듭니다. 점 집합의 경계를 더 잘 캡처하려면 더 큰 알파 반지름을 사용하십시오.

알파 값 2.5를 사용하여 알파 셰이프를 계산합니다.

shp.Alpha = 2.5;
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

데이터의 3차원 포인트 클라우드 셰이프를 찾습니다.

3차원 점 집합을 만들고 플로팅합니다.

[x1,y1,z1] = sphere(24);
x1 = x1(:);
y1 = y1(:);
z1 = z1(:);
x2 = x1+5;
P = [x1 y1 z1; x2 y1 z1];
P = unique(P,'rows');
plot3(P(:,1),P(:,2),P(:,3),'.')
axis equal
grid on

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

알파 반지름 1을 사용하여 3차원 알파 셰이프를 계산합니다.

shp = alphaShape(P(:,1),P(:,2),P(:,3),1);
plot(shp)
axis equal

Figure contains an axes object. The axes object contains an object of type patch.

알파 반지름을 지정하여 알파 셰이프를 만들고 알파 셰이프에 있는 구멍을 채웁니다.

2차원 점 집합을 만들고 플로팅합니다.

th = (pi/12:pi/12:2*pi)';
x1 = [reshape(cos(th)*(2:5), numel(cos(th)*(2:5)),1);];
y1 = [reshape(sin(th)*(2:5), numel(sin(th)*(2:5)),1);];
x = [x1; x1+15;];
y = [y1; y1];
plot(x,y,'.')
axis equal

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

알파 반지름 1을 사용하여 점 집합에 대한 알파 셰이프를 계산합니다.

shp = alphaShape(x,y,1);
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

알파 반지름이 1이면 각 영역마다 구멍을 하나씩 갖는 두 개의 알파 셰이프 영역이 생성됩니다. 알파 셰이프에 작은 구멍을 표시하지 않으려면 채워야 하는 가장 큰 구멍의 면적을 추정하여 HoleThreshold를 지정할 수 있습니다. 셰이프에 있는 구멍 전체를 채우려면 HoleThreshold에 임의로 큰 값을 대입할 수 있습니다.

HoleThreshold에 15를 지정하여 구멍이 없는 새 알파 셰이프를 만듭니다.

shp = alphaShape(x,y,1,'HoleThreshold',15);
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

영역 임계값을 설정하여 알파 셰이프를 이루는 영역 수를 제어합니다.

3차원 점 집합을 만들고 플로팅합니다.

[x1,y1,z1] = sphere(24);
x1 = x1(:);
y1 = y1(:);
z1 = z1(:);
x2 = x1+5;
[x3,y3,z3] = sphere(5);
x3 = x3(:)+5;
y3 = y3(:);
z3 = z3(:)+25;
P = [x1 y1 z1; x2 y1 z1; 0.25*x3 0.25*y3 0.25*z3];
P = unique(P,'rows');
plot3(P(:,1),P(:,2),P(:,3),'.')
axis equal
grid on

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

알파 반지름 1을 사용하여 점 집합에 대한 알파 셰이프를 계산합니다.

shp = alphaShape(P,1);
plot(shp)
axis equal

Figure contains an axes object. The axes object contains an object of type patch.

이 경우 알파 셰이프는 크기가 동일한 두 개의 구 위에 새로 작은 영역을 생성합니다. 이 영역을 표시하지 않으려면 영역의 부피를 추정하여 RegionThreshold를 지정할 수 있습니다.

RegionThreshold에 2를 지정합니다. 이 결과, 셰이프는 두 개의 큰 영역만 포함합니다.

shp.RegionThreshold = 2;
plot(shp)
axis equal

Figure contains an axes object. The axes object contains an object of type patch.

기존 알파 셰이프에 점을 추가합니다.

2차원 점 집합을 만들고 플로팅합니다.

th = (pi/12:pi/12:2*pi)';
x1 = [reshape(cos(th)*(1:5), numel(cos(th)*(1:5)),1); 0];
y1 = [reshape(sin(th)*(1:5), numel(sin(th)*(1:5)),1); 0];
x = [x1; x1+15;];
y = [y1; y1];
plot(x,y,'.')
axis equal

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

알파 반지름 1을 사용하여 점 집합에 대한 알파 셰이프를 계산합니다. 결과로 생성된 알파 셰이프에는 두 개의 영역이 있습니다.

shp = alphaShape(x,y,1);
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

이제 새 점들을 shp.Points 행렬에 직접 추가하여 알파 셰이프에 세 번째 영역을 추가합니다.

x3 = x1+8;
y3 = y1+10;
shp.Points(end+1,:) = [x3 y3];
plot(shp)

Figure contains an axes object. The axes object contains an object of type patch.

확장 기능

버전 내역

R2014b에 개발됨