This repository has been archived on 2025-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
neofx-zoomedit/geometry.cpp

81 lines
2.1 KiB
C++
Raw Normal View History

#include "geometry.h"
2007-09-16 20:59:04 +00:00
static void edgeVertex(Vertex *v, int edge, const Rectangle *rect) {
if(edge == EDGE_NONE)
2007-09-16 20:59:04 +00:00
edge = rect->edges(*v);
2007-09-16 20:59:04 +00:00
if(edge & EDGE_LEFT) v->setX(rect->getVertex1().getX());
else if(edge & EDGE_RIGHT) v->setX(rect->getVertex2().getX());
2007-09-16 20:59:04 +00:00
if(edge & EDGE_TOP) v->setY(rect->getVertex1().getY());
else if(edge & EDGE_BOTTOM) v->setY(rect->getVertex2().getY());
}
2007-09-16 20:59:04 +00:00
static int simplifyVertex(Vertex *v, const Vertex *to, const Rectangle *rect) {
Line l(*v, *to);
int edge, edge2;
2007-09-16 20:59:04 +00:00
edge = rect->edges(*v);
if(edge == EDGE_NONE) return EDGE_NONE;
2007-09-16 20:59:04 +00:00
edge2 = rect->intersects(l, v, edge);
if(edge2 != EDGE_NONE) return edge2;
edgeVertex(v, edge, rect);
return edge;
}
2007-09-16 20:59:04 +00:00
static void addSimplifiedLine(const Vertex *v1, const Vertex *v2, const Rectangle *rect, int last, Polygon *out) {
const Line d1(rect->getVertex1(), rect->getVertex2());
const Line d2(rect->getVertex1().getX(), rect->getVertex2().getY(), rect->getVertex2().getX(), rect->getVertex1().getY());
2007-09-16 20:59:04 +00:00
Line l(*v1, *v2);
2007-09-16 14:07:03 +00:00
Vertex v, vi;
int edge1, edge2;
v = *v1;
if((edge1 = simplifyVertex(&v, v2, rect)) != EDGE_NONE)
2007-09-16 19:06:02 +00:00
out->push_back(v);
v = *v2;
edge2 = simplifyVertex(&v, v1, rect);
if(edge1 != EDGE_NONE && edge2 != EDGE_NONE && !(edge1 & edge2)) {
2007-09-16 20:59:04 +00:00
if(l.intersects(d1, &vi) == INTERSECTION_SEGMENT_LINE) {
edgeVertex(&vi, 0, rect);
2007-09-16 19:06:02 +00:00
out->push_back(vi);
}
2007-09-16 20:59:04 +00:00
else if(l.intersects(d1, &vi) == INTERSECTION_SEGMENT_LINE) {
edgeVertex(&vi, 0, rect);
2007-09-16 19:06:02 +00:00
out->push_back(vi);
}
}
if(!last)
2007-09-16 19:06:02 +00:00
out->push_back(v);
}
2007-09-16 20:59:04 +00:00
void simplifyPolygon(const Polygon *in, const Rectangle *rect, Polygon *out) {
2007-09-16 14:07:03 +00:00
Vertex v;
2007-09-16 19:06:02 +00:00
if(in->empty()) return;
else if(in->size() == 1) {
out->push_back(in->front());
return;
}
2007-09-16 19:06:02 +00:00
v = in->front();
simplifyVertex(&v, &in->back(), rect);
out->push_back(v);
for(Polygon::const_iterator v2 = in->begin(); v2 != in->end(); v2++) {
Polygon::const_iterator v3 = v2+1;
if(v3 == in->end()) v3 = in->begin();
2007-09-16 19:06:02 +00:00
addSimplifiedLine(&*v2, &*v3, rect, (v3 == in->begin()), out);
}
}