⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utils.cpp

📁 hair solusion, c&#226 cs ádasda
💻 CPP
字号:
#include "utils.h"

// ilog2
// Input: int
// Output: int
// Compute the ceiling of the log base 2 -- used to find the smallest
// power of two required to hold a texture width or height

int ilog2(int x)
{
/*
	// Slower floating-point-math attempt
	int power = 0.0;
	double fLogof2 = 0.0;

	if (fLogof2 <= 0)
		fLogof2 = log(2);

	return (int) ceil( log( (double) x ) / fLogof2 );
*/
	// My own faster bitwise approach
	int powercount = 0;
	int current = x;
	int evenpower = 0;

	while (current > 0)
	{
		current = current >> 1;
		powercount++;
	}

	evenpower = 1 << (powercount - 1);

	if ( x == evenpower )
		powercount--;

	return powercount;
}

// EvenPower
// Input: int
// Output: int
// Use ilog2 to find the smallest power of two
// required to hold a texture width or height

int EvenPower(int x)
{
	int power = ilog2(x);

	return 1 << power;
}

// DoubleIsZero
// Input: double
// Output: bool
// Is the number small enough to be considered zero?

bool DoubleIsZero(double val)
{
	return (fabs(val) < 1.0E-6);
}

double GetVectorAngle(double x, double y)
{
	double angle = 0.0;

	bool xzero = DoubleIsZero(x);
	bool yzero = DoubleIsZero(y);

	if ( xzero || yzero )
	{
		if ( xzero != yzero )
		{
			if (x > 0.0)
				angle = 90.0;
			else if (x < 0.0)
				angle = 270.0;
			else if (y < 0.0)
				angle = 180.0;
		}
	}
	else
	{
		double rawangle = atan(fabs(x/y)) * 180.0 / PI;

		if (x > 0.0)
		{
			if (y > 0.0)
				angle = rawangle; // +x, +y
			else
				angle = 90.0 + rawangle; // +x, -y
		}
		else
		{
			if (y > 0.0)
				angle = 270.0 + rawangle; // -x, +y
			else
				angle = 180.0 + rawangle; // -x, -y
		}
	}

	return angle;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -