1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_vcl.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include "aqua/salmathutils.hxx"
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski #include <stdlib.h>
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielski // =======================================================================
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielski // =======================================================================
34*b1cdbd2cSJim Jagielski
35*b1cdbd2cSJim Jagielski #define Swap( x, y ) { x ^= y; y ^= x; x ^= y; }
36*b1cdbd2cSJim Jagielski
37*b1cdbd2cSJim Jagielski // =======================================================================
38*b1cdbd2cSJim Jagielski
39*b1cdbd2cSJim Jagielski // =======================================================================
40*b1cdbd2cSJim Jagielski
41*b1cdbd2cSJim Jagielski // Storage free swapping using XOR
42*b1cdbd2cSJim Jagielski
CSwap(char & rX,char & rY)43*b1cdbd2cSJim Jagielski void CSwap ( char &rX, char &rY )
44*b1cdbd2cSJim Jagielski {
45*b1cdbd2cSJim Jagielski Swap( rX, rY );
46*b1cdbd2cSJim Jagielski } // CSwap
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
49*b1cdbd2cSJim Jagielski
50*b1cdbd2cSJim Jagielski // Storage free swapping using XOR
51*b1cdbd2cSJim Jagielski
UCSwap(unsigned char & rX,unsigned char & rY)52*b1cdbd2cSJim Jagielski void UCSwap ( unsigned char &rX, unsigned char &rY )
53*b1cdbd2cSJim Jagielski {
54*b1cdbd2cSJim Jagielski Swap( rX, rY );
55*b1cdbd2cSJim Jagielski } // UCSwap
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
58*b1cdbd2cSJim Jagielski
59*b1cdbd2cSJim Jagielski // Storage free swapping using XOR
60*b1cdbd2cSJim Jagielski
SSwap(short & rX,short & rY)61*b1cdbd2cSJim Jagielski void SSwap ( short &rX, short &rY )
62*b1cdbd2cSJim Jagielski {
63*b1cdbd2cSJim Jagielski Swap( rX, rY );
64*b1cdbd2cSJim Jagielski } // SSwap
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
67*b1cdbd2cSJim Jagielski
68*b1cdbd2cSJim Jagielski // Storage free swapping using XOR
69*b1cdbd2cSJim Jagielski
USSwap(unsigned short & rX,unsigned short & rY)70*b1cdbd2cSJim Jagielski void USSwap ( unsigned short &rX, unsigned short &rY )
71*b1cdbd2cSJim Jagielski {
72*b1cdbd2cSJim Jagielski Swap( rX, rY );
73*b1cdbd2cSJim Jagielski } // USSwap
74*b1cdbd2cSJim Jagielski
75*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
76*b1cdbd2cSJim Jagielski
77*b1cdbd2cSJim Jagielski // Storage free swapping using XOR
78*b1cdbd2cSJim Jagielski
LSwap(long & rX,long & rY)79*b1cdbd2cSJim Jagielski void LSwap ( long &rX, long &rY )
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski Swap( rX, rY );
82*b1cdbd2cSJim Jagielski } // LSwap
83*b1cdbd2cSJim Jagielski
84*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski // Storage free swapping using XOR
87*b1cdbd2cSJim Jagielski
ULSwap(unsigned long & rX,unsigned long & rY)88*b1cdbd2cSJim Jagielski void ULSwap ( unsigned long &rX, unsigned long &rY )
89*b1cdbd2cSJim Jagielski {
90*b1cdbd2cSJim Jagielski Swap( rX, rY );
91*b1cdbd2cSJim Jagielski } // ULSwap
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski // =======================================================================
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski // =======================================================================
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
98*b1cdbd2cSJim Jagielski //
99*b1cdbd2cSJim Jagielski // This way of measuring distance is also called the "Manhattan distance."
100*b1cdbd2cSJim Jagielski // Manhattan distance takes advantage of the fact that the sum of the
101*b1cdbd2cSJim Jagielski // lengths of the three components of a 3D vector is a rough approxima-
102*b1cdbd2cSJim Jagielski // tion of the vector's length.
103*b1cdbd2cSJim Jagielski //
104*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
105*b1cdbd2cSJim Jagielski
Euclidian2Norm(const LRectCoorVector pVec)106*b1cdbd2cSJim Jagielski unsigned long Euclidian2Norm ( const LRectCoorVector pVec )
107*b1cdbd2cSJim Jagielski {
108*b1cdbd2cSJim Jagielski unsigned long ndist = 0;
109*b1cdbd2cSJim Jagielski
110*b1cdbd2cSJim Jagielski if ( pVec )
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski long nDX = 0;
113*b1cdbd2cSJim Jagielski long nDY = 0;
114*b1cdbd2cSJim Jagielski long nDZ = 0;
115*b1cdbd2cSJim Jagielski unsigned long nMax = 0;
116*b1cdbd2cSJim Jagielski unsigned long nMed = 0;
117*b1cdbd2cSJim Jagielski unsigned long nMin = 0;
118*b1cdbd2cSJim Jagielski
119*b1cdbd2cSJim Jagielski // Find |x'-x|, |y'-y|, and |z'-z| from (x,y,z) and (x',y',z')
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski nDX = pVec[1].x - pVec[0].x;
122*b1cdbd2cSJim Jagielski nDY = pVec[1].y - pVec[0].y;
123*b1cdbd2cSJim Jagielski nDZ = pVec[1].z - pVec[0].z;
124*b1cdbd2cSJim Jagielski
125*b1cdbd2cSJim Jagielski nMax = (unsigned long)abs( nDX );
126*b1cdbd2cSJim Jagielski nMed = (unsigned long)abs( nDY );
127*b1cdbd2cSJim Jagielski nMin = (unsigned long)abs( nDZ );
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielski // Sort them (3 compares, 0-3 swaps)
130*b1cdbd2cSJim Jagielski
131*b1cdbd2cSJim Jagielski if ( nMax < nMed )
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski Swap( nMax, nMed );
134*b1cdbd2cSJim Jagielski } // if
135*b1cdbd2cSJim Jagielski
136*b1cdbd2cSJim Jagielski if ( nMax < nMin )
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski Swap( nMax, nMin );
139*b1cdbd2cSJim Jagielski } // if
140*b1cdbd2cSJim Jagielski
141*b1cdbd2cSJim Jagielski // Approximate Euclidian distance:
142*b1cdbd2cSJim Jagielski //
143*b1cdbd2cSJim Jagielski // d = max + (11/32)*med + (1/4)*min
144*b1cdbd2cSJim Jagielski //
145*b1cdbd2cSJim Jagielski // with +/- 8% error, where the exact formulae for d is
146*b1cdbd2cSJim Jagielski //
147*b1cdbd2cSJim Jagielski // || (x',y',z') - (x,y,z) || = { |x'-x|^2 + |y'-y|^2 + |z'-z|^2 }^(1/2)
148*b1cdbd2cSJim Jagielski
149*b1cdbd2cSJim Jagielski ndist = nMax + ( nMin >> 2UL )
150*b1cdbd2cSJim Jagielski + ( ( ( nMed << 3UL ) + ( nMed << 1UL ) + nMed ) >> 5UL );
151*b1cdbd2cSJim Jagielski } // if
152*b1cdbd2cSJim Jagielski
153*b1cdbd2cSJim Jagielski return ndist;
154*b1cdbd2cSJim Jagielski } // RGBDistance
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski // =======================================================================
157*b1cdbd2cSJim Jagielski
158*b1cdbd2cSJim Jagielski // =======================================================================
159*b1cdbd2cSJim Jagielski
160