[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [Calligra] 973b19f: PerspectiveAssistant::distance(): use a better cal
From:       Geoffry Song <goffrie () gmail ! com>
Date:       2010-12-31 23:27:34
Message-ID: 20101231232734.74842A609E () git ! kde ! org
[Download RAW message or body]

commit 973b19fa00ec082a84829ab740efb8d1d300975c
branch master
Author: Geoffry Song <goffrie@gmail.com>
Date:   Thu Dec 30 13:11:25 2010 -0500

    PerspectiveAssistant::distance(): use a better calculation method

diff --git a/krita/plugins/assistants/RulerAssistant/PerspectiveAssistant.cc \
b/krita/plugins/assistants/RulerAssistant/PerspectiveAssistant.cc index \
                95d1106..1657293 100644
--- a/krita/plugins/assistants/RulerAssistant/PerspectiveAssistant.cc
+++ b/krita/plugins/assistants/RulerAssistant/PerspectiveAssistant.cc
@@ -116,14 +116,24 @@ inline qreal lengthSquared(const QPointF& vector)
     return vector.x() * vector.x() + vector.y() * vector.y();
 }
 
-inline qreal distanceSquared(const QTransform& transform, QPointF pt, QPointF orig)
+inline qreal localScale(const QTransform& transform, QPointF pt)
 {
-    const qreal epsilon = 1e-5, epsilonSquared = epsilon * epsilon;
-    qreal xSizeSquared = lengthSquared(transform.map(pt + QPointF(epsilon, 0.0)) - \
                orig) / epsilonSquared;
-    qreal ySizeSquared = lengthSquared(transform.map(pt + QPointF(0.0, epsilon)) - \
                orig) / epsilonSquared;
-    xSizeSquared /= lengthSquared(transform.map(QPointF(0.0, pt.y())) - \
                transform.map(QPointF(1.0, pt.y())));
-    ySizeSquared /= lengthSquared(transform.map(QPointF(pt.x(), 0.0)) - \
                transform.map(QPointF(pt.x(), 1.0)));
-    return xSizeSquared + ySizeSquared;
+//    const qreal epsilon = 1e-5, epsilonSquared = epsilon * epsilon;
+//    qreal xSizeSquared = lengthSquared(transform.map(pt + QPointF(epsilon, 0.0)) - \
orig) / epsilonSquared; +//    qreal ySizeSquared = lengthSquared(transform.map(pt + \
QPointF(0.0, epsilon)) - orig) / epsilonSquared; +//    xSizeSquared /= \
lengthSquared(transform.map(QPointF(0.0, pt.y())) - transform.map(QPointF(1.0, \
pt.y()))); +//    ySizeSquared /= lengthSquared(transform.map(QPointF(pt.x(), 0.0)) - \
transform.map(QPointF(pt.x(), 1.0))); +//  when taking the limit epsilon->0:
+//  xSizeSquared=((m23*y+m33)^2*(m23*y+m33+m13)^2)/(m23*y+m13*x+m33)^4
+//  ySizeSquared=((m23*y+m33)^2*(m23*y+m33+m13)^2)/(m23*y+m13*x+m33)^4
+//  xSize*ySize=(abs(m13*x+m33)*abs(m13*x+m33+m23)*abs(m23*y+m33)*abs(m23*y+m33+m13))/(m23*y+m13*x+m33)^4
 +    const qreal x = transform.m13() * pt.x(),
+                y = transform.m23() * pt.y(),
+                a = x + transform.m33(),
+                b = y + transform.m33(),
+                c = x + y + transform.m33(),
+                d = c * c;
+    return fabs(a)*fabs(a + transform.m23())*fabs(b)*fabs(b + transform.m13())/(d * \
d);  }
 
 qreal PerspectiveAssistant::distance(const QPointF& pt) const
@@ -141,12 +151,12 @@ qreal PerspectiveAssistant::distance(const QPointF& pt) const
     }
     QPointF realPoint = inverse.map(pt);
     const qreal corners[4] = {
-        distanceSquared(transform, QPointF(0.0, 0.0), transform.map(QPointF(0.0, \
                0.0))),
-        distanceSquared(transform, QPointF(0.0, 1.0), transform.map(QPointF(0.0, \
                1.0))),
-        distanceSquared(transform, QPointF(1.0, 0.0), transform.map(QPointF(1.0, \
                0.0))),
-        distanceSquared(transform, QPointF(1.0, 1.0), transform.map(QPointF(1.0, \
1.0)))}; +        localScale(transform, QPointF(0.0, 0.0)),
+        localScale(transform, QPointF(0.0, 1.0)),
+        localScale(transform, QPointF(1.0, 0.0)),
+        localScale(transform, QPointF(1.0, 1.0))};
     const qreal max = std::max(std::max(corners[0], corners[1]), \
                std::max(corners[2], corners[3]));
-    return sqrt(distanceSquared(transform, realPoint, pt) / max);
+    return localScale(transform, inverse.map(pt)) / max;
 }
 
 // draw a vanishing point marker


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic