#include "CircleArc.h" #include #include "Line.h" CircleArc::CircleArc(double x, double y, double radiusX, double radiusY, double startAngle, double endAngle) : x(x), y(y), radiusX(radiusX), radiusY(radiusY), startAngle(startAngle), endAngle(endAngle) {} OsciPoint CircleArc::nextVector(double drawingProgress) { // scale between start and end angle in the positive direction double angle = startAngle + endAngle * drawingProgress; return OsciPoint( x + radiusX * std::cos(angle), y + radiusY * std::sin(angle) ); } void CircleArc::scale(double x, double y, double z) { this->x *= x; this->y *= y; this->radiusX *= x; this->radiusY *= y; } void CircleArc::translate(double x, double y, double z) { this->x += x; this->y += y; } double CircleArc::length() { if (len < 0) { len = 0; // TODO: Replace this, it's stupid. Do a real approximation. int segments = 5; OsciPoint start; OsciPoint end = nextVector(0); for (int i = 0; i < segments; i++) { start = end; end = nextVector((i + 1) / (double) segments); len += Line::length(start.x, start.y, start.z, end.x, end.y, end.z); } } return len; } std::unique_ptr CircleArc::clone() { return std::make_unique(x, y, radiusX, radiusY, startAngle, endAngle); } std::string CircleArc::type() { return std::string("Arc"); }