« 高周波・RFニュース 2025年1月23日 5G Americasの新ホワイトペーパー「AI時代のセルラーネットワークの信頼性とセキュリティ」、KyoceraAVXの新薄膜フィルタ、TDKの車載/一般用C0G特性1,250V 3225サイズMLCC、Semtechの5G LPWAモジュール | トップページ | 歌川国芳展 ―奇才絵師の魔力@大阪中之島美術館へ行ってきた。今にも動き出しそうなかっこいいものから、恐ろしい怪物、かわいい動物(特に猫)やその擬人化、見て笑えるもの、複数の人間で顔を表現したものなど一人の人間が生み出したとは思えないほどバラエティーに富んでる。 »

2025年1月23日 (木)

UnityでVisual C#用の数値計算ライブラリMath.NET numericsを使う(3) 3D画面に補間(Interpolate) を行って表示する。リニア、3次スプライン、有理関数などいろいろ使える。

今回は

 Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(2) 補間を行う(Interpolate) リニア、3次スプライン、有理関数などいろいろ使える。

でやったことをUnityでもやってみる。

計算部分は同じだが、線を引くのはLineRendererを使い、点を打つのはSphereのPrefabを使っている。なのでこっちの方が簡単。

コードはこんな感じ。MathNET.numericsは倍精度しかないメソッドが多いがUnityは単精度なので線を描くときに明示的に変換している。


using UnityEngine;
using MathNet.Numerics;
using System;

public class MathNET : MonoBehaviour
{
    public GameObject PointsPrefab;


    void Start()
    {
        // 有理関数補間用
        GameObject linesObject = GameObject.Find("Lines");
        LineRenderer lines = linesObject.GetComponent<LineRenderer>();
        // 線形補間用
        GameObject linesObject2 = GameObject.Find("Lines2");
        LineRenderer lines2 = linesObject2.GetComponent<LineRenderer>();

        int n = 50,  // 補間後
            m = 10; // 元々の点数
        Vector3[] points = new Vector3[n];
        Vector3[] points2 = new Vector3[n];

        lines.positionCount = n;    
        lines.widthMultiplier = 0.02f;
        lines.startColor = Color.blue;
        lines.endColor = Color.blue;

        lines2.positionCount = n;
        lines2.widthMultiplier = 0.02f;
        lines2.startColor = Color.red;
        lines2.endColor = Color.red;


        double[] x = Generate.LinearSpaced(m, 0.0, 2.0 * Math.PI);
        double[] y = Generate.Map(x, Math.Sin);
        var InterpFunction = Interpolate.RationalWithoutPoles(x, y);
        var InterpFunction2 = Interpolate.Linear(x, y);

        double[] xval = Generate.LinearSpaced(n, 0.0, 2.0 * Math.PI);
        double[] yinterp = new double[xval.Length];
        double[] yinterp2 = new double[xval.Length];
        for (int i = 0; i < xval.Length; i++)
        {
            yinterp[i] = InterpFunction.Interpolate(xval[i]);
            yinterp2[i] = InterpFunction2.Interpolate(xval[i]);
            points[i] = new Vector3((float)xval[i], (float)yinterp[i], 0);
            points2[i] = new Vector3((float)xval[i], (float)yinterp2[i], 0);
           
        }

        for (int i = 0; i < m; i++) {
            GameObject originalpoint = Instantiate(PointsPrefab);
            originalpoint.transform.position = new Vector3((float)x[i], (float)y[i], 0);
        }

        lines.SetPositions(points);
        lines2.SetPositions(points2);

       
    }

}

 

結果はこちら。なかなかシュールな絵柄。

Unitymathinterpolate

« 高周波・RFニュース 2025年1月23日 5G Americasの新ホワイトペーパー「AI時代のセルラーネットワークの信頼性とセキュリティ」、KyoceraAVXの新薄膜フィルタ、TDKの車載/一般用C0G特性1,250V 3225サイズMLCC、Semtechの5G LPWAモジュール | トップページ | 歌川国芳展 ―奇才絵師の魔力@大阪中之島美術館へ行ってきた。今にも動き出しそうなかっこいいものから、恐ろしい怪物、かわいい動物(特に猫)やその擬人化、見て笑えるもの、複数の人間で顔を表現したものなど一人の人間が生み出したとは思えないほどバラエティーに富んでる。 »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 高周波・RFニュース 2025年1月23日 5G Americasの新ホワイトペーパー「AI時代のセルラーネットワークの信頼性とセキュリティ」、KyoceraAVXの新薄膜フィルタ、TDKの車載/一般用C0G特性1,250V 3225サイズMLCC、Semtechの5G LPWAモジュール | トップページ | 歌川国芳展 ―奇才絵師の魔力@大阪中之島美術館へ行ってきた。今にも動き出しそうなかっこいいものから、恐ろしい怪物、かわいい動物(特に猫)やその擬人化、見て笑えるもの、複数の人間で顔を表現したものなど一人の人間が生み出したとは思えないほどバラエティーに富んでる。 »

最近の記事

2025年2月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  

最近のコメント

無料ブログはココログ
フォト