2 * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
28 VLine(float x1, float y1, float x2, float y2)
29 : mX1(x1), mY1(y1), mX2(x2), mY2(y2)
32 VLine(const VPointF &p1, const VPointF &p2)
33 : mX1(p1.x()), mY1(p1.y()), mX2(p2.x()), mY2(p2.y())
36 float length() const { return length(mX1, mY1, mX2, mY2);}
37 void splitAtLength(float length, VLine &left, VLine &right) const;
38 VPointF p1() const { return {mX1, mY1}; }
39 VPointF p2() const { return {mX2, mY2}; }
41 static float length(float x1, float y1, float x2, float y2);
50 inline float VLine::angle() const
52 const float dx = mX2 - mX1;
53 const float dy = mY2 - mY1;
55 const float theta = std::atan2(dy, dx) * 180.0 / M_PI;
59 // approximate sqrt(x*x + y*y) using alpha max plus beta min algorithm.
60 // With alpha = 1, beta = 3/8, giving results with the largest error less
61 // than 7% compared to the exact value.
62 inline float VLine::length(float x1, float y1, float x2, float y2)
70 return (x > y ? x + 0.375 * y : y + 0.375 * x);
73 inline void VLine::splitAtLength(float lengthAt, VLine &left, VLine &right) const
76 float dx = ((mX2 - mX1) / len) * lengthAt;
77 float dy = ((mY2 - mY1) / len) * lengthAt;
81 left.mX2 = left.mX1 + dx;
82 left.mY2 = left.mY1 + dy;