-class VLine {
-public:
- VLine() : mX1(0), mY1(0), mX2(0), mY2(0) {}
- VLine(float x1, float y1, float x2, float y2)
- : mX1(x1), mY1(y1), mX2(x2), mY2(y2)
- {
- }
- VLine(const VPointF &p1, const VPointF &p2)
- : mX1(p1.x()), mY1(p1.y()), mX2(p2.x()), mY2(p2.y())
- {
- }
- float length() const;
- void splitAtLength(float length, VLine &left, VLine &right) const;
- VPointF p1() const { return VPointF(mX1, mY1); }
- VPointF p2() const { return VPointF(mX2, mY2); }
-
-private:
- float mX1;
- float mY1;
- float mX2;
- float mY2;
-};
-
-// approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm.
-// With alpha = 1, beta = 3/8, giving results with the largest error less
-// than 7% compared to the exact value.
-float VLine::length() const
-{
- float x = mX2 - mX1;
- float y = mY2 - mY1;
- x = x < 0 ? -x : x;
- y = y < 0 ? -y : y;
- return (x > y ? x + 0.375 * y : y + 0.375 * x);
-}
-
-void VLine::splitAtLength(float lengthAt, VLine &left, VLine &right) const
-{
- float len = length();
- double dx = ((mX2 - mX1) / len) * lengthAt;
- double dy = ((mY2 - mY1) / len) * lengthAt;
-
- left.mX1 = mX1;
- left.mY1 = mY1;
- left.mX2 = left.mX1 + dx;
- left.mY2 = left.mY1 + dy;
-
- right.mX1 = left.mX2;
- right.mY1 = left.mY2;
- right.mX2 = mX2;
- right.mY2 = mY2;
-}
-