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 /*****************************************************************************/