[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/koffice/2.0/koffice/karbon/plugins/tools
From: Jan Hambrecht <jaham () gmx ! net>
Date: 2009-05-31 21:25:48
Message-ID: 1243805148.395012.7542.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 976097 by jaham:
backport revision 976047
M +26 -10 KarbonCurveFit.cpp
--- branches/koffice/2.0/koffice/karbon/plugins/tools/KarbonCurveFit.cpp #976096:976097
@@ -1,6 +1,6 @@
/* This file is part of the KDE project
Copyright (C) 2001-2003 Rob Buis <buis@kde.org>
- Copyright (C) 2007 Jan Hambrecht <jaham@gmx.net>
+ Copyright (C) 2007, 2009 Jan Hambrecht <jaham@gmx.net>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -23,6 +23,9 @@
#include <QVector>
#include <math.h>
+/// our equivalent to zero
+const qreal Zero = 10e-12;
+
/*
An Algorithm for Automatically Fitting Digitized Curves
by Philip J. Schneider
@@ -51,8 +54,9 @@
void normalize(){
qreal len=length();
- if(len==0.0f)
- return;
+ if (qFuzzyCompare(len, 0.0)) {
+ return;
+ }
m_X/=len; m_Y/=len;
}
@@ -63,8 +67,9 @@
void scale(qreal s){
qreal len = length();
- if(len==0.0f)
- return;
+ if (qFuzzyCompare(len, 0.0)) {
+ return;
+ }
m_X *= s/len;
m_Y *= s/len;
}
@@ -127,8 +132,13 @@
distance(points.at(i), points.at(i-1));
}
+ qreal denominator = u[last-first];
+ if (qFuzzyCompare(denominator, 0.0)) {
+ denominator = Zero;
+ }
+
for (i = first + 1; i <= last; ++i) {
- u[i-first] = u[i-first] / u[last-first];
+ u[i-first] = u[i-first] / denominator;
}
return(u);
@@ -274,8 +284,11 @@
det_X_C1 = X[0] * C[1][1] - X[1] * C[0][1];
/* Finally, derive alpha values */
- if (det_C0_C1 == 0.0) {
+ if (qFuzzyCompare(det_C0_C1, 0.0)) {
det_C0_C1 = (C[0][0] * C[1][1]) * 10e-12;
+ if (qFuzzyCompare(det_C0_C1, 0.0)) {
+ det_C0_C1 = Zero;
+ }
}
alpha_l = det_X_C1 / det_C0_C1;
alpha_r = det_C0_X / det_C0_C1;
@@ -285,8 +298,7 @@
/* (if alpha is 0, you get coincident control points that lead to
* divide by zero in any subsequent NewtonRaphsonRootFind() call. */
if (alpha_l < 1.0e-6 || alpha_r < 1.0e-6) {
- qreal dist = distance(points.at(last),points.at(first)) /
- 3.0;
+ qreal dist = distance(points.at(last),points.at(first)) / 3.0;
curve[0] = points.at(first);
curve[3] = points.at(last);
@@ -409,6 +421,10 @@
denominator = (Q1_u.x()) * (Q1_u.x()) + (Q1_u.y()) * (Q1_u.y()) +
(Q_u.x() - P.x()) * (Q2_u.x()) + (Q_u.y() - P.y()) * (Q2_u.y());
+ if (qFuzzyCompare(denominator, 0.0)) {
+ denominator = Zero;
+ }
+
/* u = u - f(u)/f'(u) */
uPrime = u - (numerator/denominator);
return (uPrime);
@@ -452,7 +468,7 @@
nPts = last-first+1;
if(nPts == 2){
- qreal dist = distance(points.at(last), points.at(first)) / 3.0;
+ qreal dist = distance(points.at(last), points.at(first)) / 3.0;
curve = new QPointF[4];
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic