This file is indexed.

/usr/share/octave/packages/geometry-1.7.0/geom2d/closed_path.m is in octave-geometry 1.7.0-1build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
## Copyright (C) 2004-2011 David Legland <david.legland@grignon.inra.fr>
## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas)
## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal <carbajal@ifi.uzh.ch>
## All rights reserved.
## 
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions are met:
## 
##     1 Redistributions of source code must retain the above copyright notice,
##       this list of conditions and the following disclaimer.
##     2 Redistributions in binary form must reproduce the above copyright
##       notice, this list of conditions and the following disclaimer in the
##       documentation and/or other materials provided with the distribution.
## 
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS''
## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

## -*- texinfo -*-
## @deftypefn {Function File} {@var{y} =} polygon (@var{x})
## Returns a simple closed path that passes through all the points in @var{x}.
## @var{x} is a vector containing 2D coordinates of the points.
##
## @end deftypefn

## Author: Simeon Simeonov <simeon.simeonov.s@gmail.com>

function y = closed_path(x)

  if(size(x,1) > 1 && size(x,1) < size(x,2))
      x = x';
  end

  N = size(x,1); # Number of points
  idx = zeros(N, 1); # ind contains the indices of the sorted coordinates

  a = find(x(:,2)==min(x(:,2)));

  if(size(a,1) > 1)
      [~, i] = sort(x(a,1));
      a = a(i(1));
  end

  x_1 = x(x(:,2)==x(a,2),:); # find all x with the same y coordinate

  if(x(a,1) == min(x(:,1)))
      x_2 = x(x(:,1)==x(a,1),:); # find all x with the same x coordinate
  else
     x_2 = x(a,:);
  end

  if(size(x_1,1) > 1 || size(x_2,1) > 1)
      if(size(x_1,1) > 1)
          x_1 = sort(x_1); # Sort by x coordinate
          y(1,:) = x(a,:); # original starting point
      end

      if (size(x_2,1) > 1)
          x_2 = sort(x_2, 'descend');
      end

      x_not = [x_1; x_2];
      i = ismember(x,x_not,'rows');
      x(i, :) = [];
      x = [x_1(size(x_1,1),:); x];
      x_1(size(x_1, 1),:) = [];
      N = size(x,1);
      a = 1;
  else
      x_1 = [];
      x_2 = x(a,:);
  end
  d = x - repmat(x(a,:), N, 1);
  th = d(:,2)./(d(:,1) + d(:,2));

  [~, idx0] = ismember(sort(th(th==0)), th);
  [~, idx1] = ismember(sort(th(th>0)), th);
  [~, idx2] = ismember(sort(th(th<0)), th);

  idx = [a; idx0; idx1; idx2];
  # I contains the indices of idx in a sorted order. [v i] = sort(idx) then
  # i==I.
  [~,I,J]= unique(idx);
  if(size(I,1) ~= size(J,1))
      R = histc(J, 1:size(I,1)); # R(1) will always be 1?
      idx_sorted = idx(I);
      r = find(R>1);
      for ri = r'
          idx_repeated = idx_sorted(ri);
          idx(idx==idx_repeated) = find(th==th(idx_sorted(ri)));
      end
  end

  y = [x_1; x(idx,:); x_2;];

endfunction

%!demo
%! maxInt = 100;
%! N = 25;
%!
%! for i = 1:5
%!   x = randi(maxInt, N, 2);
%!   y = closed_path(x);
%!   plot(y(:,1), y(:,2), '*');
%!   hold on;
%!   plot(y(:,1), y(:,2));
%! end