function segment = p08_boundary_segment ( segment_index, m, segment_length ) %*****************************************************************************80 % %% P08_BOUNDARY_SEGMENT returns a boundary segment in problem 08. % % Licensing: % % This code is distributed under the GNU LGPL license. % % Modified: % % 09 January 2005 % % Author: % % John Burkardt % % Reference: % % Per-Olof Persson and Gilbert Strang, % A Simple Mesh Generator in MATLAB, % SIAM Review, % Volume 46, Number 2, June 2004, pages 329-345. % % Parameters: % % Input, integer SEGMENT_INDEX, the index of the boundary segment. % % Input, integer M, the spatial dimension. % % Input, integer SEGMENT_LENGTH, the number of points in the segment. % % Output, real SEGMENT(M,SEGMENT_LENGTH), the % points that make up the boundary segment. % c1 = [ 0.0, 0.0 ]; c2 = [ 0.6, 0.0 ]; r1 = 1.0; r2 = 0.1; theta1 = pi / 12.0; % % Segment 1: the outer boundary. % if ( segment_index == 1 ) a = ( sqrt ( 119.0 ) - 9.0 ) / 20.0; theta2 = atan2 ( a, a + 0.9 ); % % Work out the appropriate segment lengths, and then % adjust N6, if necessary, to account for roundoff. % n1 = round ( ( segment_length - 1 ) / ( 2.0 + 2.0 * ( theta1 - theta2 ) ... + 2.0 * a * sqrt ( 2.0 ) ) ); n2 = round ( ( theta1 - theta2 ) * n1 ); n3 = round ( a * sqrt ( 2.0 ) * n1 ); n2 = max ( n2, 1 ); n3 = max ( n3, 1 ); n4 = n3; n5 = n2; n6 = round ( ( segment_length - 1 - n2 - n3 - n4 - n5 ) / 2 ); n1 = segment_length - 1 - n2 - n3 - n4 - n5 - n6; j = 0; s(1:2) = [ 0.0, 0.0 ]; idiot1 = cos ( theta1 ); idiot2 = - sin ( theta1 ); t(1:2) = [ idiot1, idiot2 ]; for i = 1 : n1 j = j + 1; segment(1:2,j) = ( ( n1 - i + 1 ) * s(1:2) ... + ( i - 1 ) * t(1:2) ) ... / ( n1 ); end for i = 1 : n2 theta = ( - ( n2 - i + 1 ) * theta1 ... - ( i - 1 ) * theta2 ) ... / ( n2 ); j = j + 1; idiot1 = cos ( theta ); idiot2 = sin ( theta ); segment(1:2,j) = [ idiot1, idiot2 ]; end idiot1 = cos ( theta2 ); idiot2 = -sin ( theta2 ); s(1:2) = [ idiot1, idiot2 ]; t(1:2) = [ 0.9, 0.0 ]; for i = 1 : n3 j = j + 1; segment(1:2,j) = ( ( n3 - i + 1 ) * s(1:2) ... + ( i - 1 ) * t(1:2) ) ... / ( n3 ); end s(1:2) = [ 0.9, 0.0 ]; idiot1 = cos ( theta2 ); idiot2 = sin ( theta2 ); t(1:2) = [ idiot1, idiot2 ]; for i = 1 : n4 j = j + 1; segment(1:2,j) = ( ( n4 - i + 1 ) * s(1:2) ... + ( i - 1 ) * t(1:2) ) ... / ( n4 ); end for i = 1 : n5 theta = ( ( n5 - i + 1 ) * theta2 ... + ( i - 1 ) * theta1 ) ... / ( n5 ); j = j + 1; idiot1 = cos ( theta ); idiot2 = sin ( theta ); segment(1:2,j) = [ idiot1, idiot2 ]; end idiot1 = cos ( theta1 ); idiot2 = sin ( theta1 ); s(1:2) = [ idiot1, idiot2 ]; t(1:2) = [ 0.0, 0.0 ]; for i = 1 : n6 j = j + 1; segment(1:2,j) = ( ( n6 - i + 1 ) * s(1:2) ... + ( i - 1 ) * t(1:2) ) ... / ( n6 ); end j = j + 1; segment(1:2,j) = [ 0.0, 0.0 ]; % % Segment 2: the circular hole. % elseif ( segment_index == 2 ) for j = 1 : segment_length theta = ( segment_length - j ) * 2.0 * pi / ( segment_length - 1 ); segment(1,j) = c2(1) + r2 * cos ( theta ); segment(2,j) = c2(2) + r2 * sin ( theta ); end else fprintf ( 1, '\n' ); fprintf ( 1, 'P08_BOUNDARY_SEGMENT - Fatal error!\n' ); fprintf ( 1, ' Illegal SEGMENT_INDEX = %d\n', segment_index ); error ( 'P08_BOUNDARY_SEGMENT - Fatal error!' ); end return end