I am getting computation errors. What should I do?
Programs may crash if (1) the robustness constant ε is chosen
poorly, or (2) the environment model is not ε-valid (see answer to
next question). Before reporting a bug, try varying ε by a few
orders of magnitude in both directions or checking evironment
ε-validity using the
Environment::is_valid
method. Note ε should never be
set to 0.0 except when performing certain debugging procedures on the
VisiLibity code itself. To start, try setting ε to a number a few
orders of magnitude smaller than the smallest feature in the environment.
For example, if the closest distance between any vertices is 0.01, try
double epsilon = 0.0000001;
. This means you must include an
ε in all function calls, i.e., do not use the default argument
ε=0.0. For example, you need to add ε at
Visibility_Polygon(observer, environment, epsilon)
.
Will VisiLibity work for polygonal environments where the edges of
distinct polygons intersect?
No, VisiLibity1 is not meant to operate on environments where edges of
distinct polygons intersect. For correctness of computation, in addition to
choosing suitable ε, the environment must be
ε-valid. This can be checked using the
Environment::is_valid() method. An environment is ε-valid if none of
its outer boundary or holes intersect each other, there is a distance at
least ε between any features (vertices and edges), and there can be
no redundant vertices (e.g. don't list the first vertex redundantly also as
the last) in the polygon vertex lists.
If your environment is not ε-valid and you want VisiLibity to work
for your application, then you must perform preprocessing to enforce
ε-validity. We may remove the ε-validity precondition in a
future version of VisiLibity.
Should I cache a Visibility_Graph
if I'm performing many
shortest path queries in the same Environment?
Yes. Here's how:
// Define a small epsilon. This is very important, otherwise there are
// robustness/degeneracy problems.
double epsilon = 0.000000001;
// Construct environment.
VisiLibity::Environment environment(filename);
// Construct the visibility graph.
VisiLibity::Visibility_Graph visibility_graph(environment, epsilon);
// Make path queries.
Polyline path = environment.shortest_path(startpoint, endpoint, visibility_graph, epsilon);
I am unable to compile VisiLibity under Microsoft Windows. What should I
do?
VisiLibity1 uses definitions which do not exist in the Microsoft Visual Studio
compilers. To add these definitions, uncomment these lines in the header
visilibity.hpp
.
//Uncomment these lines when compiling under
//Microsoft Visual Studio
/*
#include<limits>
#define NAN std::numeric_limits<double>::quiet_NaN()
#define INFINITY std::numeric_limits<double>::infinity()
#define M_PI 3.141592653589793238462643
#define and &&
#define or ||
*/
Alternatively, you could get a Gnu compiler working on your machine.
Some helpful hints on getting a Gnu complier running on a Windows
machine can be found under Notes on Matlab
Interface under Windows.
How do I make VisiLibity work on a 64-bit machine?
To compile VisiLibity on a pure 64-bit system, add -fPIC to the
CXXFLAGS in the makefile. Also, if Matlab does not link to the
correct libraries, try changing the symlinks in
/usr/local/MATLAB/R2010b/sys/os/glnxa64/
to the correct ones in
/usr/lib/
.