アルゴリズムの紹介はWikipedia参照。
主な使い道は線を描画するときが基本的な使い方ですが、
高速にX-Yで応答曲線を得たい時などにも使えます。
static void line(int x0, int y0, int x1, int y1)
{
int dx = x1 - x0;
int dy = y1 - y0;
int e2;
int err;
int sx = +1;
int sy = -1;
if (0 > dx)
{ //反転(dxは正の値にする)
dx = -dx;
sx = -1;
}
if (0 < dy)
{ //反転(dyは負の値にする)
dy = -dy;
sy = +1;
}
err = dx + dy;
while (x0 != x1 || y0 != y1)
{
output(x0, y0);
e2 = err << 1;
if (e2 > dy)
{ //X軸を動かす
err += dy;
x0 += sx;
}
else if (e2 < dx)
{ //Y軸を動かす
err += dx;
y0 += sy;
}
}
}
インターネット上にある断片化された情報を切り取って、リブログする。 主にソフトウェア、Ubuntu関連、CPUなど気になったニュース、また、日々の面白い出来事やニュースもリブログします。
2017年1月31日火曜日
2017年1月25日水曜日
平方根を使わずに斜辺の長さ=√(A*A+B*B)を求めるMoler-Morrison Algorithm
C言語で主にマイコン用途で三角形の斜辺の長さを平方根使わずに求めたい人向けの情報です。
// sqrt(a*a+b*b)の計算
float molar_morrison(float a, float b)
{
const int ITERATION_NUMBER = 3;
int i;
float tmp;
float s;
if (0.0f $gt; a) a = -a;
if (0.0f $gt; b) b = -b;
if (a $lt; b)
{ //swap
t = a;
a = b;
b = a;
}
if (0.0f == b) return 0.0f;
for (i=0; i$lt;ITERATION_NUMBER; i++){
s=(b/a)*(b/a);
s/=4+s;
a+=2*a*s;
b*=s;
}
return a;
}
平方根を求める高速アルゴリズム
C言語で主にマイコン用途で平方根の計算を行いたい。
もしくは、精度悪くてもいいので高速に行いたい人向けの情報です。
class Program
{
static void Main(string[] args)
{
sqrt(3, 20);
Console.ReadLine();
}
static float sqrt(float value, int count)
{
float value2 = 2.0f * value;
float result = 1.0f;
while(0 < count--)
{
//ニュートン法で平方根を求める
result -= (result * result - value) / value2;
Console.WriteLine($"==>{result}");
}
return result;
}
}
参照URL
http://math.stackexchange.com/questions/296102/fastest-square-root-algorithm
登録:
コメント (Atom)