/usr/include/libwildmagic/Wm5ConvexPolygon2.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 | // 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.0 (2010/01/01)
#ifndef WM5CONVEXPOLYGON2_H
#define WM5CONVEXPOLYGON2_H
#include "Wm5MathematicsLIB.h"
#include "Wm5Polygon2.h"
#include <set>
namespace Wm5
{
template <typename Real>
class ConvexPolygon2 : public Polygon2<Real>
{
public:
// Construction and destruction. The caller is responsible for ensuring
// that the array of vertices represents a convex polygon with
// counterclockwise order.
//
// Polygon2 objects typically share data from other sources. The class
// uses smart pointers (Pointer1) to share the input arrays. If you
// do not want the class to delete the arrays, use your own smart
// pointer for the arrays.
//
// ConvexPolygon2 stores the lines associated with the edges; the line
// normals are inner pointing. The lines may be supplied to the
// constructor, in which case a smart pointer is used to share them. If
// they are not passed ('lines' is null), the class automatically
// generates them.
// The line representation Dot(N,X) = c. The 'first' of the pair is a
// unit-length normal N to the line. The 'second' of the pair is the line
// constant c. X is any point on the line.
typedef typename std::pair<Vector2<Real>, Real> NCLine;
ConvexPolygon2 (int numVertices, Vector2<Real>* vertices, NCLine* lines);
ConvexPolygon2 (const ConvexPolygon2& polygon);
virtual ~ConvexPolygon2 ();
// Assignment.
ConvexPolygon2& operator= (const ConvexPolygon2& polygon);
// Read-only member access.
const NCLine* GetLines () const;
const NCLine& GetLine (int i) const;
// Allow vertex modification. The caller must ensure that the polygon
// remains convex. After modifying as many vertices as you like, call
// UpdateLines(). The modifications are all done via SetVertex, and the
// lines are updated only for those edges sharing the modified vertices.
virtual void SetVertex (int i, const Vector2<Real>& vertex);
void UpdateLines ();
// Test for convexity. This function will iterate over the edges of the
// polygon and verify for each edge that the polygon vertices are all on
// the nonnegative side of the edge line. A signed distance test is used,
// so a vertex is on the wrong side of a line (for convexity) when its
// signed distance satisfies d < 0. Numerical round-off errors can
// generate incorrect convexity tests, so a small negative threshold
// t may be passed to this function, in which case the distance test
// becomes d < t < 0.
bool IsConvex (Real threshold = (Real)0) const;
// Point-in-polygon test, performed by which-side queries between the
// point and the lines of the edges, an O(n) algorithm for n vertices.
// This is not the optimal algorithm. TODO: Move the binary-search-based
// algorithm to this class. It is an O(log n) algorithm.
bool Contains (const Vector2<Real>& p, Real threshold = (Real)0)
const;
protected:
using Polygon2<Real>::mNumVertices;
using Polygon2<Real>::mVertices;
using Polygon2<Real>::ComputeVertexAverage;
// Support for efficient updating of edge lines. The set stores the
// indices for those edges that share modified vertices.
void UpdateLine (int i, const Vector2<Real>& average);
// The number of lines is the number of vertices.
Pointer1<NCLine> mLines;
// The sharing edges processed by UpdateLine.
std::set<int> mSharingEdges;
};
#include "Wm5ConvexPolygon2.inl"
typedef ConvexPolygon2<float> ConvexPolygon2f;
typedef ConvexPolygon2<double> ConvexPolygon2d;
}
#endif
|