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