#include <VastDefs.h>
Public Member Functions | |
| void | initialize (double deltax, double deltay, Vector2D center, Vector2D old_pos, Vector2D new_pos, double radius) |
| void | reset () |
| void | setDebug (bool debugOutput) |
| Edge * | bisect (Site *s1, Site *s2) |
| Site * | intersect (Halfedge *el1, Halfedge *el2) |
| void | endpoint (Edge *e, int lr, Site *s) |
| void | processEdge (Edge *e) |
| double | dist (Site *s, Site *t) |
Protected Member Functions | |
| bool | intersectCircleLine (Vector2D start, Vector2D dir, Vector2D center, bool lowerBound, bool upperBound) |
| bool | intersectCircleSite (Site *s, Vector2D center) |
Protected Attributes | |
| std::vector< Site * > | SITEVector |
| std::vector< Edge * > | EDGEVector |
| double | deltax |
| double | deltay |
| double | sq_radius |
| Vector2D | center [3] |
| bool | debugOutput |
| bool | doDiscovery |
Geometry class.
Provides basic line inter- / bisecting and processing functions, needed to build the voronoi and determine neighborhood relationships.
Definition at line 124 of file VastDefs.h.
Definition at line 313 of file VastDefs.cc.
Referenced by Vast::buildVoronoi().
{
double dx, dy, adx, ady;
Edge *newedge;
newedge = new Edge;
newedge->reg[0] = s1;
newedge->reg[1] = s2;
newedge->ep[0] = NULL;
newedge->ep[1] = NULL;
dx = s2->coord.x - s1->coord.x;
dy = s2->coord.y - s1->coord.y;
adx = dx > 0 ? dx : -dx;
ady = dy > 0 ? dy : -dy;
newedge->c = s1->coord.x * dx + s1->coord.y * dy + (dx*dx + dy*dy)*0.5;
if(adx>ady) {
newedge->a = 1.0;
newedge->b = dy/dx;
newedge->c /= dx;
}
else {
newedge->b = 1.0;
newedge->a = dx/dy;
newedge->c /= dy;
}
EDGEVector.push_back(newedge);
return newedge;
}
Definition at line 385 of file VastDefs.cc.
Referenced by Vast::buildVoronoi().
{
e->ep[lr] = s;
if(e->ep[re-lr] == NULL) return;
processEdge(e);
}
| void Geometry::initialize | ( | double | deltax, | |
| double | deltay, | |||
| Vector2D | center, | |||
| Vector2D | old_pos, | |||
| Vector2D | new_pos, | |||
| double | radius | |||
| ) |
Definition at line 159 of file VastDefs.cc.
Referenced by Vast::buildVoronoi().
Definition at line 345 of file VastDefs.cc.
Referenced by Vast::buildVoronoi().
{
Edge *e1, *e2, *e;
Halfedge *el;
double d, xint, yint;
int right_of_site;
Site *v;
e1 = el1->ELedge;
e2 = el2->ELedge;
if(e1 == NULL || e2 == NULL) return NULL;
if(e1->reg[1] == e2->reg[1]) return NULL;
d = e1->a * e2->b - e1->b * e2->a;
if(-1.0e-10 < d && d < 1.0e-10) return NULL;
xint = (e1->c * e2->b - e2->c * e1->b)/d;
yint = (e2->c * e1->a - e1->c * e2->a)/d;
if((e1->reg[1]->coord.y < e2->reg[1]->coord.y) || (e1->reg[1]->coord.y == e2->reg[1]->coord.y && e1->reg[1]->coord.x < e2->reg[1]->coord.x)) {
el = el1;
e = e1;
}
else {
el = el2;
e = e2;
}
right_of_site = xint >= e->reg[1]->coord.x;
if((right_of_site && el->ELpm == le) || (!right_of_site && el->ELpm == re)) return NULL;
v = new Site;
v->coord.x = xint;
v->coord.y = yint;
SITEVector.push_back(v);
return v;
}
| bool Geometry::intersectCircleLine | ( | Vector2D | start, | |
| Vector2D | dir, | |||
| Vector2D | center, | |||
| bool | lowerBound, | |||
| bool | upperBound | |||
| ) | [protected] |
Definition at line 198 of file VastDefs.cc.
Referenced by processEdge().
{
Vector2D StartMinusCenter;
double DirDotStartMinusCenter, DirSq, StartMinusCenterSq, discriminant;
StartMinusCenter.x = start.x - center.x;
StartMinusCenter.y = start.y - center.y;
StartMinusCenterSq = StartMinusCenter.x * StartMinusCenter.x + StartMinusCenter.y * StartMinusCenter.y;
DirDotStartMinusCenter = dir.x * StartMinusCenter.x + dir.y * StartMinusCenter.y;
DirSq = dir.x * dir.x + dir.y * dir.y;
discriminant = DirDotStartMinusCenter * DirDotStartMinusCenter - DirSq * (StartMinusCenterSq - sq_radius);
if(discriminant <= 0.0f) return false;
else if(lowerBound) {
double s = (-DirDotStartMinusCenter - sqrtf(discriminant)) / DirSq;
if(s < 0.0f) return false;
else if(upperBound && s > 1.0f) return false;
}
return true;
}
| void Geometry::processEdge | ( | Edge * | e | ) |
Definition at line 220 of file VastDefs.cc.
Referenced by Vast::buildVoronoi(), and endpoint().
{
bool leftEndpoint_In[3], rightEndpoint_In[3];
int i, numTest;
// test the edge just against our own AOI or also against AOI's of a moving neighbor
numTest = doDiscovery ? 3 : 1;
for(i = 0; i < numTest; i++) {
if(e->ep[le]) leftEndpoint_In[i] = intersectCircleSite(e->ep[le], center[i]);
else leftEndpoint_In[i] = false;
if(e->ep[re]) rightEndpoint_In[i] = intersectCircleSite(e->ep[re], center[i]);
else rightEndpoint_In[i] = false;
}
for(i = 0; i < numTest; i++) {
if(leftEndpoint_In[i] || rightEndpoint_In[i]) {
if(!e->reg[le]->innerEdge[i]) e->reg[le]->innerEdge[i] = true;
if(!e->reg[re]->innerEdge[i]) e->reg[re]->innerEdge[i] = true;
}
}
if(!leftEndpoint_In[0] || !rightEndpoint_In[0]) {
if(!e->reg[le]->outerEdge) e->reg[le]->outerEdge = true;
if(!e->reg[re]->outerEdge) e->reg[re]->outerEdge = true;
}
for(i = 0; i < numTest; i++) {
if(!(leftEndpoint_In[i] || rightEndpoint_In[i])) {
bool lineTest = false;
if(e->ep[le] && e->ep[re]) {
Vector2D t_dir;
t_dir.x = e->ep[re]->coord.x - e->ep[le]->coord.x;
t_dir.y = e->ep[re]->coord.y - e->ep[le]->coord.y;
lineTest = intersectCircleLine(e->ep[le]->coord, t_dir, center[i], true, true);
}
if((e->ep[le] && !e->ep[re]) || (!e->ep[le] && e->ep[re])) {
Vector2D t_dir;
t_dir.x = e->b;
t_dir.y = -(e->a);
if(e->ep[le]) {
if(t_dir.x < 0.0f) {
t_dir.x = -t_dir.x;
t_dir.y = -t_dir.y;
}
lineTest = intersectCircleLine(e->ep[le]->coord, t_dir, center[i], true, false);
}
else {
if(t_dir.x >= 0.0f) {
t_dir.x = -t_dir.x;
t_dir.y = -t_dir.y;
}
lineTest = intersectCircleLine(e->ep[re]->coord, t_dir, center[i], true, false);
}
}
if(!(e->ep[le] || e->ep[re])) {
Vector2D t_start, t_dir;
if(e->b == 0.0f) {
t_start.x = e->c / e->a;
t_start.y = 0.0f;
}
else {
t_start.x = 0.0f;
t_start.y = e->c / e->b;
}
t_dir.x = e->b;
t_dir.y = -(e->a);
lineTest = intersectCircleLine(t_start, t_dir, center[i], false, false);
}
if(lineTest) {
if(!e->reg[le]->innerEdge[i]) e->reg[le]->innerEdge[i] = true;
if(!e->reg[re]->innerEdge[i]) e->reg[re]->innerEdge[i] = true;
}
}
}
// enhanced enclosing test
e->reg[re]->enclosingSet.insert(e->reg[le]->addr);
e->reg[le]->enclosingSet.insert(e->reg[re]->addr);
// test if one of the nodes bisected by the edge is an enclosing neighbor
if(e->reg[le]->type == THIS) {
e->reg[re]->type |= ENCLOSING;
// Debug output
if(debugOutput) EV << "[Geometry::processEdge()]\n"
<< " Site at [" << e->reg[re]->coord.x << ", " << e->reg[re]->coord.y << "] is an enclosing neighbor."
<< endl;
}
if(e->reg[re]->type == THIS) {
e->reg[le]->type |= ENCLOSING;
// Debug output
if(debugOutput) EV << "[Geometry::processEdge()]\n"
<< " Site at [" << e->reg[le]->coord.x << ", " << e->reg[le]->coord.y << "] is an enclosing neighbor."
<< endl;
}
}
| void Geometry::reset | ( | ) |
Definition at line 171 of file VastDefs.cc.
Referenced by Vast::buildVoronoi().
{
for(std::vector<Site*>::iterator itTemp = SITEVector.begin(); itTemp != SITEVector.end(); ++itTemp) {
delete *itTemp;
}
for(std::vector<Edge*>::iterator itTemp = EDGEVector.begin(); itTemp != EDGEVector.end(); ++itTemp) {
delete *itTemp;
}
SITEVector.clear();
EDGEVector.clear();
}
| void Geometry::setDebug | ( | bool | debugOutput | ) |
Definition at line 183 of file VastDefs.cc.
Referenced by Vast::initializeOverlay().
{
this->debugOutput = debugOutput;
}
Vector2D Geometry::center[3] [protected] |
Definition at line 142 of file VastDefs.h.
Referenced by processEdge().
bool Geometry::debugOutput [protected] |
Definition at line 143 of file VastDefs.h.
Referenced by processEdge().
double Geometry::deltax [protected] |
Definition at line 141 of file VastDefs.h.
double Geometry::deltay [protected] |
Definition at line 141 of file VastDefs.h.
bool Geometry::doDiscovery [protected] |
Definition at line 143 of file VastDefs.h.
Referenced by initialize(), and processEdge().
std::vector<Edge*> Geometry::EDGEVector [protected] |
Definition at line 138 of file VastDefs.h.
std::vector<Site*> Geometry::SITEVector [protected] |
Definition at line 137 of file VastDefs.h.
Referenced by intersect(), and reset().
double Geometry::sq_radius [protected] |
Definition at line 141 of file VastDefs.h.
Referenced by initialize(), intersectCircleLine(), and intersectCircleSite().
1.7.1