layers_from_handle

本文介绍了一种基于面网格的分层算法,该算法能够从已知的顶点集合中找出不同层次的顶点环,并区分内外区域。输入包括顶点数量、面索引列表及手柄内的顶点索引列表等,输出则包含了各层次顶点的索引列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

function [Omega,N0,N1,N2,outside_region_of_interest ] = ...
  layers_from_handle( ...
    vertex_count, ...
    F, ...
    H)
  % Given a Face index list and list of vertex indices in a handle (can be
  % disjoint), and number of vertices
  % this function finds the ring or vertices 0, 1, and 2
  % edges into the handle 
  %
  % Input:
  %  vertex_count: number of vertices
  %  F: face index list
  %  H: vertex indices list of vertices in handle
  %
  % Ouput:
  %  Omega: vertex indices list of vertices outside of handle (interior)
  %  N0: vertex indices list of vertices on ring 0 edges into handle
  %  N1: vertex indices list of vertices on ring 1 edges into handle
  %  N2: vertex indices list of vertices on ring 2 edges into handle
  %  outside_region_of_interest: vertex indices list of vertices too far inside
  %                              handle
  %  Omega_1: vertex indices list of vertices one edge into the interior (Omega)
  %
  %
  % See corresponding paper: "Mixed finite elements for variational surface
  % modeling" by Alec Jacobson, Elif Tosun, Olga Sorkine, and Denis Zorin, SGP
  % 2010
  %
  % Copyright 2010, Alec Jacobson, NYU
  %

  % omega is simply the whole list minus the handle
  Omega = 1:vertex_count;
  Omega = Omega(~ismember(Omega,H));


  % must have at least vertex in handle and one in Omega
  % interior_faces = F(...
  %   (ismember(F(:,1),H)     & ismember(F(:,2),Omega) & ismember(F(:,3),Omega)) | ...
  %   (ismember(F(:,1),Omega) & ismember(F(:,2),H)     & ismember(F(:,3),Omega)) | ...
  %   (ismember(F(:,1),Omega) & ismember(F(:,2),Omega) & ismember(F(:,3),H)) | ...
  %   (ismember(F(:,1),H)     & ismember(F(:,2),H)     & ismember(F(:,3),Omega)) | ...
  %   (ismember(F(:,1),Omega) & ismember(F(:,2),H)     & ismember(F(:,3),H)) | ...
  %   (ismember(F(:,1),H)     & ismember(F(:,2),Omega) & ismember(F(:,3),H)) ...
  %   ,:);
  % Omega_1 = intersect(Omega,interior_faces(:));

  % Two sets that will grow and shrink as we discover the next layer
  shrinking_handle = H;
  growing_interior = Omega;

  % C = intersect(A,B,'rows')
  % Define two matrices with rows in common
  
  interior_faces = intersect(F,F.*ismember(F,growing_interior),'rows');
  %F的三个索引要全在growing_interior才行
  handle_faces = intersect(F,F.*~ismember(F,growing_interior),'rows');
  %F的三个索引要都不在growing_interior才行
  H0 = setdiff(F,union(handle_faces,interior_faces,'rows'),'rows');
  N0 = intersect(shrinking_handle,reshape(H0,1,size(H0,1)*size(H0,2)));
  growing_interior = [growing_interior N0];
  shrinking_handle = setdiff(shrinking_handle,N0);

  interior_faces = intersect(F,F.*ismember(F,growing_interior),'rows');
  handle_faces = intersect(F,F.*~ismember(F,growing_interior),'rows');
  H1 = setdiff(F,union(handle_faces,interior_faces,'rows'),'rows');
  N1 = intersect(shrinking_handle,reshape(H1,1,size(H1,1)*size(H1,2)));
  growing_interior = [growing_interior N1];
  shrinking_handle = setdiff(shrinking_handle,N1);

  interior_faces = intersect(F,F.*ismember(F,growing_interior),'rows');
  handle_faces = intersect(F,F.*~ismember(F,growing_interior),'rows');
  H2 = setdiff(F,union(handle_faces,interior_faces,'rows'),'rows');
  N2 = intersect(shrinking_handle,reshape(H2,1,size(H2,1)*size(H2,2)));
  growing_interior = [growing_interior N2];
  shrinking_handle = setdiff(shrinking_handle,N2);

  region_of_interest = growing_interior;
  outside_region_of_interest = shrinking_handle;

end




interior_faces 为黄色区域

handle_face为绿色区域

H0为白色区域

N0 为红点

growing_interior 为蓝圈

shrinking_handle 为黑圈


  第一步变换过后↓





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值