summaryrefslogtreecommitdiffstats
path: root/Project/Line.cpp
diff options
context:
space:
mode:
authorThales1330 <thaleslima.ufu@gmail.com>2016-08-19 17:53:45 -0300
committerThales1330 <thaleslima.ufu@gmail.com>2016-08-19 17:53:45 -0300
commit474b1f94ced70e1d183a79bb6df87603982755aa (patch)
treebe4d12d44aa7cffa1cd7b712d6a736cbdf61ae02 /Project/Line.cpp
parentd4efffcdedbb41596eecd0882a1cef76f6afc435 (diff)
downloadPSP.git-474b1f94ced70e1d183a79bb6df87603982755aa.tar.gz
PSP.git-474b1f94ced70e1d183a79bb6df87603982755aa.tar.xz
PSP.git-474b1f94ced70e1d183a79bb6df87603982755aa.zip
Line still under implementation
Diffstat (limited to 'Project/Line.cpp')
-rw-r--r--Project/Line.cpp43
1 files changed, 37 insertions, 6 deletions
diff --git a/Project/Line.cpp b/Project/Line.cpp
index 54418d4..6710fbe 100644
--- a/Project/Line.cpp
+++ b/Project/Line.cpp
@@ -32,7 +32,7 @@ void Line::Draw(wxPoint2DDouble translation, double scale) const
if(pointList.size() > 0) {
DrawCircle(pointList[0], 5.0 + m_borderSize, 10, GL_POLYGON);
if(m_inserted) {
- DrawCircle(pointList[pointList.size() - 1], 5.0 + +m_borderSize, 10, GL_POLYGON);
+ DrawCircle(pointList[pointList.size() - 1], 5.0 + m_borderSize, 10, GL_POLYGON);
}
}
}
@@ -120,7 +120,7 @@ void Line::MovePickbox(wxPoint2DDouble position)
for(int i = 2; i < (int)m_pointList.size() - 2; i++) {
if(m_activePickboxID == i) {
m_pointList[i] = m_movePts[i] + position - m_moveStartPt;
- UpdateSwitchesPosition();
+ UpdateSwitchesPosition();
}
}
}
@@ -191,7 +191,7 @@ void Line::UpdateSwitchesPosition()
GetSwitchPoint(m_parentList[1], m_pointList[m_pointList.size() - 1], m_pointList[m_pointList.size() - 3]);
}
-double Line::PointToLineDistance(wxPoint2DDouble point) const
+double Line::PointToLineDistance(wxPoint2DDouble point, int* segmentNumber) const
{
//[Ref] http://geomalgorithms.com/a02-_lines.html
double distance = 100.0; // Big initial distance.
@@ -222,7 +222,10 @@ double Line::PointToLineDistance(wxPoint2DDouble point) const
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(d < distance) {
+ distance = d;
+ if(segmentNumber) *segmentNumber = i;
+ }
}
return distance;
@@ -230,6 +233,34 @@ double Line::PointToLineDistance(wxPoint2DDouble point) const
bool Line::GetContextMenu(wxMenu& menu)
{
- menu.Append(ID_EDIT_LINE, _("Edit line"));
- return true;
+ menu.Append(ID_EDIT_LINE, _("Edit line"));
+ if(m_activePickboxID == ID_PB_NONE) {
+ menu.Append(ID_LINE_ADD_NODE, _("Insert node"));
+ }
+ else
+ {
+ menu.Append(ID_LINE_REMOVE_NODE, _("Remove node"));
+ }
+ return true;
+}
+
+void Line::RemoveNode(wxPoint2DDouble point)
+{
+ if(PickboxContains(point)) {
+ for(int i = 2; i < (int)m_pointList.size() - 2; i++) {
+ if(m_activePickboxID == i) {
+ m_pointList.erase(m_pointList.begin() + i);
+ break;
+ }
+ }
+ }
+}
+
+void Line::AddNode(wxPoint2DDouble point)
+{
+ int segmentNumber = 0;
+ PointToLineDistance(point, &segmentNumber);
+ if(segmentNumber > 0 && segmentNumber < (int)m_pointList.size() - 2) {
+ m_pointList.insert(m_pointList.begin() + segmentNumber + 1, point);
+ }
}