summaryrefslogtreecommitdiffstats
path: root/Project/Element.cpp
diff options
context:
space:
mode:
authorThales1330 <thaleslima.ufu@gmail.com>2016-10-29 17:46:00 -0200
committerThales1330 <thaleslima.ufu@gmail.com>2016-10-29 17:46:00 -0200
commit7d4df7195202eaea0e84f227e96f19dec4144081 (patch)
tree894064c78359c2eca33b344353dbf290ba4df9a3 /Project/Element.cpp
parent468ba7581675a23567746628d6777ca411b150d3 (diff)
downloadPSP.git-7d4df7195202eaea0e84f227e96f19dec4144081.tar.gz
PSP.git-7d4df7195202eaea0e84f227e96f19dec4144081.tar.xz
PSP.git-7d4df7195202eaea0e84f227e96f19dec4144081.zip
Power flow arrows implemented
Diffstat (limited to 'Project/Element.cpp')
-rw-r--r--Project/Element.cpp36
1 files changed, 22 insertions, 14 deletions
diff --git a/Project/Element.cpp b/Project/Element.cpp
index 3f6e111..91ed61f 100644
--- a/Project/Element.cpp
+++ b/Project/Element.cpp
@@ -390,6 +390,8 @@ wxString Element::StringFromDouble(double value, int minDecimal)
void Element::CalculatePowerFlowPts(std::vector<wxPoint2DDouble> edges)
{
+ double arrowRate = 100.0; // One arrow to each "arrowRate" distance in pixels.
+
if(edges.size() < 2) return;
// Clear all power flow points
@@ -401,26 +403,32 @@ void Element::CalculatePowerFlowPts(std::vector<wxPoint2DDouble> edges)
wxPoint2DDouble pt2 = edges[i];
double angle = std::atan2(pt2.m_y - pt1.m_y, pt2.m_x - pt1.m_x);
-
- //wxLogMessage(wxString::Format("(%f, %f) (%f, %f)"), pt1.m_x, pt1.m_y, pt2.m_x, pt2.m_y);
wxPoint2DDouble rotPt2(
std::cos(-angle) * (pt2.m_x - pt1.m_x) - std::sin(-angle) * (pt2.m_y - pt1.m_y) + pt1.m_x,
std::sin(-angle) * (pt2.m_x - pt1.m_x) + std::cos(-angle) * (pt2.m_y - pt1.m_y) + pt1.m_y);
- wxPoint2DDouble mid((rotPt2.m_x + pt1.m_x) / 2.0, (rotPt2.m_y + pt1.m_y) / 2.0); // test
- std::vector<wxPoint2DDouble> triPts;
- triPts.push_back(mid + wxPoint2DDouble(5.0, 0.0));
- triPts.push_back(mid + wxPoint2DDouble(-5.0, 5.0));
- triPts.push_back(mid + wxPoint2DDouble(-5.0, -5.0));
-
- // Rotate back.
- for(int i = 0; i < 3; i++) {
- triPts[i] = wxPoint2DDouble(
- std::cos(angle) * (triPts[i].m_x - pt1.m_x) - std::sin(angle) * (triPts[i].m_y - pt1.m_y) + pt1.m_x,
- std::sin(angle) * (triPts[i].m_x - pt1.m_x) + std::cos(angle) * (triPts[i].m_y - pt1.m_y) + pt1.m_y);
+ int numArrows = std::abs(pt1.m_x - rotPt2.m_x) / arrowRate;
+ if(numArrows == 0) numArrows = 1;
+
+ for(int i = 0; i < numArrows; i++) {
+ wxPoint2DDouble arrowCenter(pt1.m_x + ((rotPt2.m_x - pt1.m_x) / double(numArrows + 1)) * double(i + 1),
+ pt1.m_y + ((rotPt2.m_y - pt1.m_y) / double(numArrows + 1)) * double(i + 1));
+
+ std::vector<wxPoint2DDouble> triPts;
+ triPts.push_back(arrowCenter + wxPoint2DDouble(5.0, 0.0));
+ triPts.push_back(arrowCenter + wxPoint2DDouble(-5.0, 5.0));
+ triPts.push_back(arrowCenter + wxPoint2DDouble(-5.0, -5.0));
+
+ // Rotate back.
+ for(int i = 0; i < 3; i++) {
+ triPts[i] = wxPoint2DDouble(
+ std::cos(angle) * (triPts[i].m_x - pt1.m_x) - std::sin(angle) * (triPts[i].m_y - pt1.m_y) + pt1.m_x,
+ std::sin(angle) * (triPts[i].m_x - pt1.m_x) + std::cos(angle) * (triPts[i].m_y - pt1.m_y) +
+ pt1.m_y);
+ }
+ m_powerFlowArrow.push_back(triPts);
}
- m_powerFlowArrow.push_back(triPts);
}
}