mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-04 07:31:16 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * Copyright 2015 The Etc2Comp Authors.
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *  http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
#include "EtcConfig.h"
 | 
						|
#include "EtcMath.h"
 | 
						|
 | 
						|
namespace Etc
 | 
						|
{
 | 
						|
 | 
						|
	// ----------------------------------------------------------------------------------------------------
 | 
						|
	// calculate the line that best fits the set of XY points contained in a_afX[] and a_afY[]
 | 
						|
	// use a_fSlope and a_fOffset to define that line
 | 
						|
	//
 | 
						|
	bool Regression(float a_afX[], float a_afY[], unsigned int a_Points,
 | 
						|
					float *a_fSlope, float *a_fOffset)
 | 
						|
	{
 | 
						|
		float fPoints = (float)a_Points;
 | 
						|
 | 
						|
		float fSumX = 0.0f;
 | 
						|
		float fSumY = 0.0f;
 | 
						|
		float fSumXY = 0.0f;
 | 
						|
		float fSumX2 = 0.0f;
 | 
						|
 | 
						|
		for (unsigned int uiPoint = 0; uiPoint < a_Points; uiPoint++)
 | 
						|
		{
 | 
						|
			fSumX += a_afX[uiPoint];
 | 
						|
			fSumY += a_afY[uiPoint];
 | 
						|
			fSumXY += a_afX[uiPoint] * a_afY[uiPoint];
 | 
						|
			fSumX2 += a_afX[uiPoint] * a_afX[uiPoint];
 | 
						|
		}
 | 
						|
 | 
						|
		float fDivisor = fPoints*fSumX2 - fSumX*fSumX;
 | 
						|
 | 
						|
		// if vertical line
 | 
						|
		if (fDivisor == 0.0f)
 | 
						|
		{
 | 
						|
			*a_fSlope = 0.0f;
 | 
						|
			*a_fOffset = 0.0f;
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
 | 
						|
		*a_fSlope = (fPoints*fSumXY - fSumX*fSumY) / fDivisor;
 | 
						|
		*a_fOffset = (fSumY - (*a_fSlope)*fSumX) / fPoints;
 | 
						|
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	// ----------------------------------------------------------------------------------------------------
 | 
						|
	//
 | 
						|
 | 
						|
} // namespace Etc
 |