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/Line.cpp

105 lines
3.1 KiB
C++
Raw Normal View History

2007-09-16 19:06:02 +00:00
#include "Line.h"
#include <math.h>
2007-09-16 20:59:04 +00:00
bool Line::contains(const Vertex &v) const {
2007-09-27 08:27:04 +00:00
if(fabsf(v1.getX() - v2.getX()) < 1E-6 && fabsf(v1.getY() - v2.getY()) < 1E-6) {
if(fabsf(v1.getX() - v.getX()) < 1E-6 && fabsf(v1.getY() - v.getY()) < 1E-6)
2007-09-16 20:59:04 +00:00
return true;
else
return false;
}
2007-09-27 08:27:04 +00:00
if(fabsf(v1.getX() - v2.getX()) < 1E-6) {
if(fabsf(v1.getX() - v.getX()) >= 1E-6)
2007-09-16 20:59:04 +00:00
return false;
2007-09-27 08:27:04 +00:00
else if(v.getY() - fminf(v1.getY(), v2.getY()) > -1E-6 && v.getY() - fmaxf(v1.getY(), v2.getY()) < 1E-6)
2007-09-16 20:59:04 +00:00
return true;
else
return false;
}
2007-09-27 08:27:04 +00:00
if(fabsf(v1.getY() - v2.getY()) < 1E-6) {
if(fabsf(v1.getY() - v.getY()) >= 1E-6)
2007-09-16 20:59:04 +00:00
return false;
2007-09-27 08:27:04 +00:00
else if(v.getX() - fminf(v1.getX(), v2.getX()) > -1E-6 && v.getX() - fmaxf(v1.getX(), v2.getX()) < 1E-6)
2007-09-16 20:59:04 +00:00
return true;
else
return false;
}
2007-09-27 08:27:04 +00:00
if(fabsf((v.getX()-v1.getX())/(v2.getX()-v1.getX()) - (v.getY()-v1.getY())/(v2.getY()-v1.getY())) < 1E-6)
2007-09-16 20:59:04 +00:00
return true;
else
return false;
}
int Line::intersects(const Line &l, Vertex *v) const {
float xa1 = v1.getX(), ya1 = v1.getY();
float xa2 = v2.getX(), ya2 = v2.getY();
float xb1 = l.v1.getX(), yb1 = l.v1.getY();
float xb2 = l.v2.getX(), yb2 = l.v2.getY();
float temp;
2007-09-27 08:27:04 +00:00
bool switched = false;
2007-09-16 19:06:02 +00:00
Vertex v2;
if(!v) v = &v2;
2007-09-27 08:27:04 +00:00
if(fabsf(xa1 - xa2) < 1E-6 && fabsf(ya1 - ya2) < 1E-6) return INTERSECTION_ERROR;
if(fabsf(xb1 - xb2) < 1E-6 && fabsf(yb1 - yb2) < 1E-6) return INTERSECTION_ERROR;
2007-09-16 19:06:02 +00:00
2007-09-27 08:27:04 +00:00
if(fabsf(xa1 - xa2) < 1E-6 || fabsf(xb1 - xb2) < 1E-6) {
2007-09-16 19:06:02 +00:00
temp = xa1; xa1 = ya1; ya1 = temp;
temp = xa2; xa2 = ya2; ya2 = temp;
temp = xb1; xb1 = yb1; yb1 = temp;
temp = xb2; xb2 = yb2; yb2 = temp;
2007-09-27 08:27:04 +00:00
switched = true;
2007-09-16 19:06:02 +00:00
}
2007-09-27 08:27:04 +00:00
if(fabsf(xa1 - xa2) < 1E-6 && fabsf(xb1 - xb2) < 1E-6)
return (fabsf(xa1 - xb1) < 1E-6) ? INTERSECTION_IDENTICAL : INTERSECTION_NONE;
2007-09-16 19:06:02 +00:00
2007-09-27 08:27:04 +00:00
if(fabsf(xa1 - xa2) < 1E-6) {
2007-09-16 19:06:02 +00:00
v->setX(xa1);
v->setY(yb1);
}
2007-09-27 08:27:04 +00:00
else if(fabsf(xb1 - xb2) < 1E-6) {
2007-09-16 19:06:02 +00:00
v->setX(xb1);
v->setY(ya1);
}
else {
float ma = (ya2-ya1)/(xa2-xa1);
float mb = (yb2-yb1)/(xb2-xb1);
float ba = ya1 - ma*xa1;
float bb = yb1 - mb*xb1;
2007-09-16 19:06:02 +00:00
2007-09-27 08:27:04 +00:00
if(fabsf(ma - mb) < 1E-6) return (fabsf(ba - bb) < 1E-6) ? INTERSECTION_IDENTICAL : INTERSECTION_NONE;
2007-09-16 19:06:02 +00:00
v->setX((bb-ba)/(ma-mb));
v->setY(ma*v->getX() + ba);
}
if(switched) {
temp = v->getX(); v->setX(v->getY()); v->setY(temp);
//switch back everything for segment tests
temp = xa1; xa1 = ya1; ya1 = temp;
temp = xa2; xa2 = ya2; ya2 = temp;
temp = xb1; xb1 = yb1; yb1 = temp;
temp = xb2; xb2 = yb2; yb2 = temp;
}
2007-09-27 08:27:04 +00:00
if(v->getX() < fminf(xa1,xa2) || v->getX() > fmaxf(xa1, xa2) || v->getY() < fminf(ya1,ya2) || v->getY() > fmaxf(ya1, ya2)) {
if(v->getX() < fminf(xb1,xb2) || v->getX() > fmaxf(xb1, xb2) || v->getY() < fminf(yb1,yb2) || v->getY() > fmaxf(yb1, yb2))
2007-09-16 19:06:02 +00:00
return INTERSECTION_LINE_LINE;
else
return INTERSECTION_LINE_SEGMENT;
}
2007-09-27 08:27:04 +00:00
else if(v->getX() < fminf(xb1,xb2) || v->getX() > fmaxf(xb1, xb2) || v->getY() < fminf(yb1,yb2) || v->getY() > fmaxf(yb1, yb2))
2007-09-16 19:06:02 +00:00
return INTERSECTION_SEGMENT_LINE;
else
return INTERSECTION_SEGMENT_SEGMENT;
}
2007-09-27 08:27:04 +00:00