- #1
roldy
- 237
- 2
I'm working on a project for myself that I started some time ago. This question only covers a small part of what I am doing. In my program I have vertices that I read in from a text file. They are read and stored in a matrix where each row of the matrix is a facet (triangle) created by the 2 (x,y) vertices. I end up with a N X 3 matrix of vertices where N is the number of facets. I then pass these through a function that determines what the intersection points are for each facet that is intersected by a plane at x = some value. The intersection points are stored in a N X 2 cell array (say B) where each row is a line segment created by the intersection points of each facet. I wrote a function that takes this cell array and "connects" the line segments by finding the common point (cell) of a row to another row. I have this working to a certain extent. The catch is that it only works if the first row in B is a line segment that has only one point in common with one other row. What I want to do is figure out a way to find which row in B has only one point in common with the one other row. There should be 2 rows in B for this (one for the start and one for the end of the line). Below is the code that I have written thus far. A represents the starting line segment to begin the sorting. Right now A is set as the first row in B in order for the program to run. Try changing A to any other row besides an end line segment to understand what I am getting at.
Code:
function [line] = connect(B)
clear all
clc
% Build the example cell arrays
A = {[4,-1],[3,0]}; %Initial test row value
B = {[4,-1],[3,0]; %end line segment
[-1,4],[-3,5]; %end line segment
[3,0],[2,1];
[2,1],[-1,4]};
ANumVec = cell2mat(A);
ANum = reshape(ANumVec, 2, 2)';
Bmat = cell2mat(B);
line = A;
m = length(Bmat);
count = 2;
while m ~= 1
I1 = ismember(Bmat(:, 1:2), ANum, 'rows'); %check first two columns
I2 = ismember(Bmat(:, 3:4), ANum, 'rows'); %check last two columns
I = [I1, I2];
B(all(I == 1,2),:) = {[], []}; %replace start row with empty cells to remove from list for next iteration
I(all(I == 1,2),:) = 0; %Find indice of the row in B that contains a matching vertice of the vertices in A
A = Bmat(I > 0,:); %Get next test row vertices
ANum = reshape(A,2,2)';
line(1,count:count+1) = {A(1,[1 2]), A(1,[3 4])}; %Assemble connectivity array
empty_row = ~cellfun('isempty',B);
B = B(empty_row(:,1),:); %Resize B array by removing empty rows
Bmat = cell2mat(B);
[m n] = size(Bmat);
count = count+1;
end