| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <QPolygon> |
| | #include "rs.h" |
| | #include "rs_infoarea.h" |
| |
|
| | |
| | |
| | |
| | RS_InfoArea::RS_InfoArea(): |
| | calculationNeeded(true){ |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void RS_InfoArea::push_back(const RS_Vector &p){ |
| | if (m_points.empty()){ |
| | baseY = p.y; |
| | } |
| |
|
| | m_points.push_back(p); |
| | calculationNeeded = true; |
| | } |
| |
|
| | |
| | void RS_InfoArea::pop_back(){ |
| | m_points.pop_back(); |
| | calculationNeeded = true; |
| | } |
| |
|
| | |
| | |
| | |
| | void RS_InfoArea::reset(){ |
| | m_points.clear(); |
| | area = 0.0; |
| | circumference = 0.0; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | bool RS_InfoArea::duplicated(const RS_Vector &p){ |
| | if (m_points.size() < 1) return false; |
| | for (const RS_Vector &v: m_points) { |
| | if ((v - p).squared() < RS_TOLERANCE2) return true; |
| | } |
| |
|
| | return false; |
| | } |
| |
|
| | |
| | |
| | |
| | void RS_InfoArea::calculate(){ |
| | area = 0.0; |
| | circumference = 0.0; |
| | if (m_points.size() < 3) return; |
| |
|
| | RS_Vector p1 = m_points.front(); |
| | for (size_t i = 0; i < m_points.size(); ++i) { |
| | |
| | RS_Vector p2 = m_points.at((i + 1) % m_points.size()); |
| | area += calcSubArea(p1, p2); |
| | circumference += p1.distanceTo(p2); |
| | p1 = p2; |
| | } |
| |
|
| | area = 0.5 * std::abs(area); |
| | calculationNeeded = false; |
| | } |
| |
|
| | double RS_InfoArea::getArea(const QPolygon &polygon){ |
| | double ret = 0.0; |
| | if (polygon.size() < 3) return ret; |
| |
|
| | for (int i = 0; i < polygon.size(); ++i) { |
| | const QPoint &p0 = polygon.at(i); |
| | const QPoint &p1 = polygon.at((i + 1) % polygon.size()); |
| | ret += p0.x() * p1.y() - p0.y() * p1.x(); |
| | } |
| | return 0.5 * std::abs(ret); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | double RS_InfoArea::calcSubArea(const RS_Vector &p1, const RS_Vector &p2){ |
| | double width = p2.x - p1.x; |
| | double height = (p1.y - baseY) + (p2.y - baseY); |
| |
|
| | return width * height; |
| | } |
| |
|
| | |
| | double RS_InfoArea::getArea() const{ |
| | return area; |
| | } |
| |
|
| | |
| | double RS_InfoArea::getCircumference(){ |
| | if (calculationNeeded) |
| | calculate(); |
| | return circumference; |
| | } |
| |
|
| | |
| | int RS_InfoArea::size(){ |
| | if (calculationNeeded) |
| | calculate(); |
| | return m_points.size(); |
| | } |
| |
|
| | |
| | const RS_Vector &RS_InfoArea::at(int i) const{ |
| | return m_points.at(i); |
| | } |
| |
|
| | |
| | RS_Vector &RS_InfoArea::at(int i) { |
| | return m_points.at(i); |
| | } |
| |
|
| | |
| | const RS_Vector &RS_InfoArea::back() const{ |
| | return m_points.back(); |
| | } |
| |
|
| | |
| | RS_Vector &RS_InfoArea::back() { |
| | return m_points.back(); |
| | } |
| |
|