File indexing completed on 2025-01-19 03:55:11

0001 /*****************************************************************************/
0002 // Copyright 2006-2019 Adobe Systems Incorporated
0003 // All Rights Reserved.
0004 //
0005 // NOTICE:  Adobe permits you to use, modify, and distribute this file in
0006 // accordance with the terms of the Adobe license agreement accompanying it.
0007 /*****************************************************************************/
0008 
0009 #ifndef __dng_point__
0010 #define __dng_point__
0011 
0012 /*****************************************************************************/
0013 
0014 #include <cmath>
0015 
0016 #include "dng_types.h"
0017 #include "dng_utils.h"
0018 
0019 /*****************************************************************************/
0020 
0021 class dng_point
0022     {
0023 
0024     public:
0025 
0026         int32 v;
0027         int32 h;
0028 
0029     public:
0030 
0031         dng_point ()
0032             :   v (0)
0033             ,   h (0)
0034             {
0035             }
0036 
0037         dng_point (int32 vv, int32 hh)
0038             :   v (vv)
0039             ,   h (hh)
0040             {
0041             }
0042 
0043         bool operator== (const dng_point &pt) const
0044             {
0045             return (v == pt.v) &&
0046                    (h == pt.h);
0047             }
0048 
0049         bool operator!= (const dng_point &pt) const
0050             {
0051             return !(*this == pt);
0052             }
0053 
0054         real64 Length () const
0055             {
0056             return hypot ((real64) v, (real64) h);
0057             }
0058 
0059     };
0060 
0061 /*****************************************************************************/
0062 
0063 class dng_point_real64
0064     {
0065 
0066     public:
0067 
0068         real64 v;
0069         real64 h;
0070 
0071     public:
0072 
0073         dng_point_real64 ()
0074             :   v (0.0)
0075             ,   h (0.0)
0076             {
0077             }
0078 
0079         dng_point_real64 (real64 vv, real64 hh)
0080             :   v (vv)
0081             ,   h (hh)
0082             {
0083             }
0084 
0085         dng_point_real64 (const dng_point &pt)
0086             :   v ((real64) pt.v)
0087             ,   h ((real64) pt.h)
0088             {
0089             }
0090 
0091         bool operator== (const dng_point_real64 &pt) const
0092             {
0093             return (v == pt.v) &&
0094                    (h == pt.h);
0095             }
0096 
0097         bool operator!= (const dng_point_real64 &pt) const
0098             {
0099             return !(*this == pt);
0100             }
0101 
0102         dng_point Round () const
0103             {
0104             return dng_point (Round_int32 (v),
0105                               Round_int32 (h));
0106             }
0107 
0108         real64 Length () const
0109             {
0110             return hypot (v, h);
0111             }
0112 
0113         void Scale (real64 scale)
0114             {
0115             v *= scale;
0116             h *= scale;
0117             }
0118 
0119         void Normalize ()
0120             {
0121             Scale (1.0 / Length ());
0122             }
0123 
0124     };
0125 
0126 /*****************************************************************************/
0127 
0128 inline dng_point operator+ (const dng_point &a,
0129                             const dng_point &b)
0130 
0131 
0132     {
0133 
0134     return dng_point (a.v + b.v,
0135                       a.h + b.h);
0136 
0137     }
0138 
0139 /*****************************************************************************/
0140 
0141 inline dng_point_real64 operator+ (const dng_point_real64 &a,
0142                                    const dng_point_real64 &b)
0143 
0144 
0145     {
0146 
0147     return dng_point_real64 (a.v + b.v,
0148                              a.h + b.h);
0149 
0150     }
0151 
0152 /*****************************************************************************/
0153 
0154 inline dng_point operator- (const dng_point &a,
0155                             const dng_point &b)
0156 
0157 
0158     {
0159 
0160     return dng_point (a.v - b.v,
0161                       a.h - b.h);
0162 
0163     }
0164 
0165 /*****************************************************************************/
0166 
0167 inline dng_point_real64 operator- (const dng_point_real64 &a,
0168                                    const dng_point_real64 &b)
0169 
0170 
0171     {
0172 
0173     return dng_point_real64 (a.v - b.v,
0174                              a.h - b.h);
0175 
0176     }
0177 
0178 /*****************************************************************************/
0179 
0180 inline real64 Distance (const dng_point_real64 &a,
0181                         const dng_point_real64 &b)
0182 
0183 
0184     {
0185 
0186     return (a - b).Length ();
0187 
0188     }
0189 
0190 /*****************************************************************************/
0191 
0192 inline real64 DistanceSquared (const dng_point_real64 &a,
0193                                const dng_point_real64 &b)
0194 
0195 
0196     {
0197 
0198     dng_point_real64 diff = a - b;
0199 
0200     return (diff.v * diff.v) + (diff.h * diff.h);
0201 
0202     }
0203 
0204 /*****************************************************************************/
0205 
0206 // Finds distance squared from point p to line segment from v to w.
0207 
0208 inline real64 DistanceSquared (const dng_point_real64 &p,
0209                                const dng_point_real64 &v,
0210                                const dng_point_real64 &w)
0211     {
0212 
0213     real64 len2 = DistanceSquared (v, w);
0214 
0215     if (len2 == 0.0)
0216         return DistanceSquared (p, v);
0217 
0218     real64 t = ((p.h - v.h) * (w.h - v.h) +
0219                 (p.v - v.v) * (w.v - v.v)) / len2;
0220 
0221     if (t <= 0.0)
0222         return DistanceSquared (p, v);
0223 
0224     if (t >= 1.0)
0225         return DistanceSquared (p, w);
0226 
0227     dng_point_real64 z;
0228 
0229     z.h = v.h + t * (w.h - v.h);
0230     z.v = v.v + t * (w.v - v.v);
0231 
0232     return DistanceSquared (p, z);
0233 
0234     }
0235 
0236 /*****************************************************************************/
0237 
0238 inline dng_point Transpose (const dng_point &a)
0239     {
0240 
0241     return dng_point (a.h, a.v);
0242 
0243     }
0244 
0245 /*****************************************************************************/
0246 
0247 inline dng_point_real64 Transpose (const dng_point_real64 &a)
0248     {
0249 
0250     return dng_point_real64 (a.h, a.v);
0251 
0252     }
0253 
0254 /*****************************************************************************/
0255 
0256 inline dng_point_real64 Lerp (const dng_point_real64 &a,
0257                               const dng_point_real64 &b,
0258                               const real64 t)
0259     {
0260 
0261     return dng_point_real64 (Lerp_real64 (a.v, b.v, t),
0262                              Lerp_real64 (a.h, b.h, t));
0263 
0264     }
0265 
0266 /*****************************************************************************/
0267 
0268 inline real64 Dot (const dng_point_real64 &a,
0269                    const dng_point_real64 &b)
0270     {
0271 
0272     return (a.h * b.h) + (a.v * b.v);
0273 
0274     }
0275 
0276 /*****************************************************************************/
0277 
0278 inline dng_point_real64 operator* (const real64 scale,
0279                                    const dng_point_real64 &pt)
0280     {
0281 
0282     dng_point_real64 result = pt;
0283 
0284     result.h *= scale;
0285     result.v *= scale;
0286 
0287     return result;
0288 
0289     }
0290 
0291 /*****************************************************************************/
0292 
0293 inline dng_point MakePerpendicular (const dng_point &pt)
0294     {
0295 
0296     return dng_point (-pt.h, pt.v);
0297 
0298     }
0299 
0300 /*****************************************************************************/
0301 
0302 inline dng_point_real64 MakePerpendicular (const dng_point_real64 &pt)
0303     {
0304 
0305     return dng_point_real64 (-pt.h, pt.v);
0306 
0307     }
0308 
0309 /*****************************************************************************/
0310 
0311 #endif
0312 
0313 /*****************************************************************************/