From 9f17be8af02011f04d188ce991921f6eb0ecf792 Mon Sep 17 00:00:00 2001 From: Thales1330 Date: Wed, 25 Jan 2017 19:45:45 -0200 Subject: Several graphic tools implemented, tf start --- Project/Element.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Project/Element.cpp') diff --git a/Project/Element.cpp b/Project/Element.cpp index fa08905..48d1342 100644 --- a/Project/Element.cpp +++ b/Project/Element.cpp @@ -1,6 +1,6 @@ #include "Element.h" -Element::Element() {} +Element::Element() { m_selectionColour.SetRGBA(0.0, 0.5, 1.0, 0.5); } Element::~Element() {} -- cgit From a54f50d0bf86c7c4d400e8b4d30cbc6091cfd9df Mon Sep 17 00:00:00 2001 From: Thales1330 Date: Fri, 24 Feb 2017 12:25:41 -0300 Subject: Connection line implementation start --- Project/Element.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'Project/Element.cpp') diff --git a/Project/Element.cpp b/Project/Element.cpp index 48d1342..ca24196 100644 --- a/Project/Element.cpp +++ b/Project/Element.cpp @@ -357,3 +357,38 @@ OpenGLColour::OpenGLColour(GLdouble red, GLdouble green, GLdouble blue, GLdouble { SetRGBA(red, green, blue, alpha); } + +double Element::PointToLineDistance(wxPoint2DDouble point, int* segmentNumber) const +{ + //[Ref] http://geomalgorithms.com/a02-_lines.html + double distance = 100.0; // Big initial distance. + wxPoint2DDouble p0 = point; + + for(int i = 1; i < (int)m_pointList.size() - 2; i++) { + double d = 0.0; + + wxPoint2DDouble p1 = m_pointList[i]; + wxPoint2DDouble p2 = m_pointList[i + 1]; + + wxPoint2DDouble v = p2 - p1; + wxPoint2DDouble w = p0 - p1; + + double c1 = w.m_x * v.m_x + w.m_y * v.m_y; + double c2 = v.m_x * v.m_x + v.m_y * v.m_y; + + if(c1 <= 0.0) { + d = std::sqrt(std::pow(p0.m_y - p1.m_y, 2) + std::pow(p0.m_x - p1.m_x, 2)); + } else if(c2 <= c1) { + d = std::sqrt(std::pow(p0.m_y - p2.m_y, 2) + std::pow(p0.m_x - p2.m_x, 2)); + } else { + d = std::abs((p2.m_y - p1.m_y) * p0.m_x - (p2.m_x - p1.m_x) * p0.m_y + p2.m_x * p1.m_y - p2.m_y * p1.m_x) / + std::sqrt(std::pow(p2.m_y - p1.m_y, 2) + std::pow(p2.m_x - p1.m_x, 2)); + } + if(d < distance) { + distance = d; + if(segmentNumber) *segmentNumber = i; + } + } + + return distance; +} -- cgit