This file is indexed.

/usr/include/libwildmagic/Wm5LCPPolyDist.h is in libwildmagic-dev 5.13-1ubuntu3.

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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Geometric Tools, LLC
// Copyright (c) 1998-2014
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
//
// File Version: 5.0.1 (2010/10/01)

#ifndef WM5LCPPOLYDIST_H
#define WM5LCPPOLYDIST_H

#include "Wm5PhysicsLIB.h"
#include "Wm5Tuple.h"
#include "Wm5Vector2.h"
#include "Wm5Vector3.h"
#include "Wm5LCPSolver.h"

namespace Wm5
{

template <int Dimension, typename FVector, typename DVector>
class WM5_PHYSICS_ITEM LCPPolyDist
{
public:
    typedef Tuple<Dimension,int> ITuple;

    // A class for computing the distance between two convex polygons or two
    // convex polyhedra.  The distance algorithm is formulated as a linear
    // complementarity problem (LCP) for three-dimensional data.  For convex
    // polygons in two dimensions, the third component of the vertices must
    // be zero.

    // Status codes returned by the polyhedra distance calculation.
    enum
    {
        SC_FOUND_SOLUTION
            = LCPSolver::SC_FOUND_SOLUTION, // solution

        SC_FOUND_TRIVIAL_SOLUTION
            = LCPSolver::SC_FOUND_TRIVIAL_SOLUTION, // solution (z = 0, w = q)

        SC_CANNOT_REMOVE_COMPLEMENTARY
            = LCPSolver::SC_CANNOT_REMOVE_COMPLEMENTARY, // no solution

        SC_EXCEEDED_MAX_RETRIES
            = LCPSolver::SC_EXCEEDED_MAX_RETRIES, 

        // no solution (round-off problems?)
        SC_VERIFY_FAILURE,  // VerifySolution failed
        SC_TEST_POINTS_TEST_FAILED, // VerifyWithTestPoints failed
    };

    // Polygons are represented by vertices and edges.  The vertices are
    // stored as vectors in 3D with the last component always zero.
    //   numPoints1  = number of vertices of first polygon
    //   points1     = array of vertices
    //   numFaces1   = number of edges (same as numPoints1)
    //   faces1      = array of edges, each edge a pair of indices into the
    //                  vertex array points1: <0,1>, <1,2>, ..., <n-2,n-1>,
    //                  <n-1,0>
    //   numPoints2  = number of vertices of second polygon
    //   points2     = array of vertices
    //   numFaces2   = number of edges (same as numPoints2)
    //   faces2      = array of edges, each edge a pair of indices into the
    //                  vertex array points2: <0,1>, <1,2>, ..., <n-2,n-1>,
    //                  <n-1,0>
    //   statusCode  = the status of the LCP numerical solver
    //   distance    = distance between the polygons
    //   closest     = array of two closest points, one on each polygon
    // 
    // Polyhedra are represented by vertices and faces.
    //   numPoints1  = number of vertices of first polyhedron
    //   points1     = array of vertices
    //   numFaces1   = number of triangular faces
    //   faces1      = array of faces, each face a triple of indices into
    //                  the vertex array points1
    //   numPoints2  = number of vertices of second polyhedron
    //   points2     = array of vertices
    //   numFaces2   = number of triangular faces
    //   faces2      = array of faces, each face a triple of indices into
    //                  the vertex array points2
    //   statusCode  = the status of the LCP numerical solver
    //   distance    = distance between the polyhedra
    //   closest     = array of two closest points, one on each polyhedron

    LCPPolyDist (int numPoints1, FVector* points1, int numFaces1,
        ITuple* faces1, int numPoints2, FVector* points2, int numFaces2,
        ITuple* faces2, int& statusCode, float& distance, FVector closest[2],
        double verifyMinDifference = 0.00001, double randomWidth = 0.0);

    // Polygons and polyhedra represented by halfspaces.  The halfspaces are
    // all the points p such that p.Dot(An[i]) <= Bn[i], n = 1 or 2.  The
    // arrays An[] are the outer-pointing edge/face normals.  The arrays Bn[]
    // are the line/plane constants.
    //   numFaces1  = number of halfspaces of first polygon/polyhedron
    //   B1         = array of line/plane constants
    //   A1         = array of outer pointing edge/face normals
    //   numFaces2  = number of halfspaces of second polygon/polyhedron
    //   B2         = array of line/plane constants
    //   A2         = array of outer pointing edge/face normals
    //   statusCode = the status of the LCP numerical solver
    //   distance   = distance between the polygons/polyhedra
    //   closest    = array of two closest points, one on each
    //                  polygon/polyhedron

    LCPPolyDist (int numFaces1, FVector* A1, float* B1, int numFaces2,
        FVector* A2, float* B2, int& statusCode, float& distance,
        FVector closest[2], double verifyMinDifference = 0.00001,
        double randomWidth = 0.0);

    // VerifyMinDifference:  Solution vectors are tested to determine if they
    // meet constraints imposed by the halfspace statement of the problem:
    // V o Z <= B. VerifyMinDifference is the amount that this dot product can
    // exceed B without reporting an error.

    // RandomWidth:  Used in GenerateHalfSpaceDescription to produce a random
    // array of vertices whose means are the input values to FuzzArray. Each
    // vertex is selected from a uniform distribution of width RandomWidth. 

private:
    double ProcessLoop (bool halfspaceConstructor, int& statusCode,
        FVector closest[2]);
    bool BuildMatrices (double** M, double* Q);
    void ComputeHalfspaces (int numPoints, const DVector* points,
        int numFaces, const ITuple* faces, DVector* A, double* B);
    void GenerateHalfSpaceDescription (int numPoints, DVector* points,
        int numFaces, ITuple* faces, DVector* A, double* B);
    void ChangeFaceOrder (int numFaces, ITuple* faces);
    void MoveHalfspaces (int numFaces, DVector* A, double* B);
    void MovePoints ();
    int VerifySolution (const DVector closest[2]);

    int mDimension;
    int mNumEquations;
    int mNumPoints1;
    int mNumPoints2;
    int mNumFaces1;
    int mNumFaces2; 
    DVector* mPoints1;  // points
    DVector* mPoints2;
    ITuple* mFaces1;  // faces
    ITuple* mFaces2;
    DVector* mA1;  // halfspace vectors
    DVector* mA2;
    double* mB1;  // halfspace constants
    double* mB2;

    double mVerifyMinDifference;
    double mRandomWidth;

#ifdef WM5_LCPPOLYDIST_LOG
    void OpenLog ();
    void CloseLog ();
    void PrintMatrices (double** M, double* Q);
    void LogRetries (int tryNumber);
    void LCPSolverLoopLimit ();
    void LogVertices (int numPoints, const DVector* points);
    void LogVerticesAndFaces (int numPoints, const FVector* points,
        int numFaces, const ITuple* faces);
    void LogHalfspaces (int numFaces, const DVector* A, const double* B);
    void SetupTestPoints (int index, int numFaces, int numPoints,
        const DVector& closest, const DVector* A, const double* B,
        const DVector* points, DVector* testPoints);
    void LogTestPoints (const DVector* testPoints);
    void LogSolutionWithTestPoints (int index, const DVector& closest, 
        const DVector* testPoints);
    void VerifyWithTestPoints (const DVector* closest, int& statusCode);
    void RandomizeArray (int numPoints, DVector* points);
    void RandomizeHalfspaces ();
    void LogVerifyFailure (int whichPoly, int i, double diff);
    std::ofstream mLog;
#endif
};

typedef LCPPolyDist<2, Vector2<float>, Vector2<double> > LCPPolyDist2;
typedef LCPPolyDist<3, Vector3<float>, Vector3<double> > LCPPolyDist3;

}

#endif