csharp 三角关数をテーブル化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp 三角关数をテーブル化相关的知识,希望对你有一定的参考价值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public static class TabledMath
{
    private const int sinDevide = 16;
    private const int atanDevide = 1024;
    private const float deg2dd = 16f;
    private const float dd2deg = 1 / 16f;
    private static bool isInit = false;
    private static float[] sinTable;
    private static float[] atanTable;

    public static void Init()
    {
        if (isInit) { return; }
        sinTable = new float[90 * sinDevide + 1];
        atanTable = new float[atanDevide + 1];

        for (int t = 0; t <= 90 * sinDevide; t++)
        {
            float rad = t * dd2deg * Mathf.Deg2Rad;
            sinTable[t] = Mathf.Sin(rad);
        }
        for (int t = 0; t <= atanDevide; t++)
        {
            float r = (float)t / atanDevide;
            atanTable[t] = Mathf.Atan(r) * Mathf.Rad2Deg;
        }

        isInit = true;
    }
    public static float Cos(float deg)
    {
        return cos((int)(deg * deg2dd));
    }
    private static float cos(int dd)
    {
        return sin(dd + 90 * sinDevide);
    }
    public static float Sin(float deg)
    {
        return sin((int)(deg * deg2dd));
    }
    private static float sin(int dd)
    {
        while (dd < 0) { dd += 360 * sinDevide; }
        while (dd > 360 * sinDevide) { dd -= 360 * sinDevide; }

        if (dd <= 90 * sinDevide)
        {
            return sinTable[dd];
        }
        else if (dd <= 180 * sinDevide)
        {
            return sinTable[180 * sinDevide - dd];
        }
        else if (dd <= 270 * sinDevide)
        {
            return -sinTable[dd - 180 * sinDevide];
        }
        else
        {
            return -sinTable[360 * sinDevide - dd];
        }
    }
    public static float Atan(float x, float y)
    {
        if (x >= 0)
        {
            if (y >= 0)
            {
                if (y >= x)
                {
                    // 0-45
                    float r = x / y;
                    float d = atanTable[(int)(r * atanDevide)];
                    return d;
                }
                else
                {
                    // 45-90
                    float r = y / x;
                    float d = atanTable[(int)(r * atanDevide)];
                    return 90.0f - d;
                }
            }
            else
            {
                if (x >= -y)
                {
                    // 90-135
                    float r = -y / x;
                    float d = atanTable[(int)(r * atanDevide)];
                    return 90.0f + d;
                }
                else
                {
                    // 135-180
                    float r = x / -y;
                    float d = atanTable[(int)(r * atanDevide)];
                    return 180.0f - d;
                }
            }
        }
        else
        {
            if (y < 0)
            {
                if (-y >= -x)
                {
                    // 180-225
                    float r = -x / -y;
                    float d = atanTable[(int)(r * atanDevide)];
                    return 180.0f + d;
                }
                else
                {
                    // 225-270
                    float r = -y / -x;
                    float d = atanTable[(int)(r * atanDevide)];
                    return 270.0f - d;
                }
            }
            else
            {
                if (-x >= y)
                {
                    // 270-315
                    float r = y / -x;
                    float d = atanTable[(int)(r * atanDevide)];
                    return 270.0f + d;
                }
                else
                {
                    // 315-360
                    float r = -x / y;
                    float d = atanTable[(int)(r * atanDevide)];
                    return 360.0f - d;
                }
            }
        }
    }
}

以上是关于csharp 三角关数をテーブル化的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 插入ソート,バブルソート,クイックソートの各种アルゴリズムソースコード(计测用主关数も付属)

csharp とあるアセットバンドル化したLive2Dモデルのローダー

java Java8ラムダ式で比较のコールバック关数を简単に书く方法ref:https://qiita.com/shisama/items/1ba7e4f0000d4e7a9b5e

csharp アセットバンドル化したLive2DをStreamingAssetsからロードするサンプルコード※エラーハンドリング无し,UnityEditor専用

csharp C#ソート关数

ruby ブロックを处理する关数を书く