Refactoring. In some cases, for systems with different precision,
IsPointOnLineviaPDP must take different accuracy value. --HG-- branch : develop
This commit is contained in:
parent
3c289f6d60
commit
71466eac13
|
@ -492,10 +492,10 @@ QPointF VGObject::CorrectDistortion(const QPointF &t, const QPointF &p1, const Q
|
||||||
* The pdp is zero only if the t lies on the line e1 = vector from p1 to p2.
|
* The pdp is zero only if the t lies on the line e1 = vector from p1 to p2.
|
||||||
* @return true if point is on line
|
* @return true if point is on line
|
||||||
*/
|
*/
|
||||||
bool VGObject::IsPointOnLineviaPDP(const QPointF &t, const QPointF &p1, const QPointF &p2)
|
bool VGObject::IsPointOnLineviaPDP(const QPointF &t, const QPointF &p1, const QPointF &p2, qreal accuracy)
|
||||||
{
|
{
|
||||||
const double p = qAbs(PerpDotProduct(p1, p2, t));
|
const double p = qAbs(PerpDotProduct(p1, p2, t));
|
||||||
const double e = GetEpsilon(p1, p2);
|
const double e = GetEpsilon(p1, p2, accuracy);
|
||||||
// We can't use common "<=" here because of the floating-point accuraccy problem
|
// We can't use common "<=" here because of the floating-point accuraccy problem
|
||||||
return p < e || VFuzzyComparePossibleNulls(p, e);
|
return p < e || VFuzzyComparePossibleNulls(p, e);
|
||||||
}
|
}
|
||||||
|
@ -521,11 +521,11 @@ double VGObject::PerpDotProduct(const QPointF &p1, const QPointF &p2, const QPoi
|
||||||
* line e1=(p1, p2), e.g. the minimal area calucalted with PerpDotProduc() if point still not on the line. This distance
|
* line e1=(p1, p2), e.g. the minimal area calucalted with PerpDotProduc() if point still not on the line. This distance
|
||||||
* is controled by variable accuracyPointOnLine
|
* is controled by variable accuracyPointOnLine
|
||||||
*/
|
*/
|
||||||
double VGObject::GetEpsilon(const QPointF &p1, const QPointF &p2)
|
double VGObject::GetEpsilon(const QPointF &p1, const QPointF &p2, qreal accuracy)
|
||||||
{
|
{
|
||||||
QLineF line(p1, p2);
|
QLineF line(p1, p2);
|
||||||
line.setAngle(line.angle() + 90);
|
line.setAngle(line.angle() + 90);
|
||||||
line.setLength(accuracyPointOnLine); // less than accuracy means the same point
|
line.setLength(accuracy); // less than accuracy means the same point
|
||||||
|
|
||||||
return qAbs(PerpDotProduct(p1, p2, line.p2()));
|
return qAbs(PerpDotProduct(p1, p2, line.p2()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,7 +98,8 @@ public:
|
||||||
static void LineCoefficients(const QLineF &line, qreal *a, qreal *b, qreal *c);
|
static void LineCoefficients(const QLineF &line, qreal *a, qreal *b, qreal *c);
|
||||||
static bool IsPointOnLineSegment (const QPointF &t, const QPointF &p1, const QPointF &p2);
|
static bool IsPointOnLineSegment (const QPointF &t, const QPointF &p1, const QPointF &p2);
|
||||||
static QPointF CorrectDistortion(const QPointF &t, const QPointF &p1, const QPointF &p2);
|
static QPointF CorrectDistortion(const QPointF &t, const QPointF &p1, const QPointF &p2);
|
||||||
static bool IsPointOnLineviaPDP(const QPointF &t, const QPointF &p1, const QPointF &p2);
|
static bool IsPointOnLineviaPDP(const QPointF &t, const QPointF &p1, const QPointF &p2,
|
||||||
|
qreal accuracy = accuracyPointOnLine);
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static QVector<T> GetReversePoints(const QVector<T> &points);
|
static QVector<T> GetReversePoints(const QVector<T> &points);
|
||||||
|
@ -109,7 +110,7 @@ private:
|
||||||
QSharedDataPointer<VGObjectData> d;
|
QSharedDataPointer<VGObjectData> d;
|
||||||
|
|
||||||
static double PerpDotProduct(const QPointF &p1, const QPointF &p2, const QPointF &t);
|
static double PerpDotProduct(const QPointF &p1, const QPointF &p2, const QPointF &t);
|
||||||
static double GetEpsilon(const QPointF &p1, const QPointF &p2);
|
static double GetEpsilon(const QPointF &p1, const QPointF &p2, qreal accuracy);
|
||||||
|
|
||||||
static int PointInCircle (const QPointF &p, const QPointF ¢er, qreal radius);
|
static int PointInCircle (const QPointF &p, const QPointF ¢er, qreal radius);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user