Newer
Older
Plot_On_Reality / Assets / Originals / Scripts / Cross / DetailExplain.cs
t-nagao on 1 Feb 2023 7 KB first
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class DetailExplain : BackButton
{
    [SerializeField] TextMeshPro graph1Text;
    [SerializeField] TextMeshPro graph2Text;
    [SerializeField] TextMeshPro crossKindText;
    [SerializeField] TextMeshPro explainText;

    List<TextMeshPro> textMeshes;
    

    public void Initialize(GraphData cross, List<GraphData> datas)
    {
        
        textMeshes = new List<TextMeshPro>
        {
            graph1Text,
            graph2Text
        };

        setGraphExplain(datas);
        setExplainText(cross);
    }

    private void setGraphExplain(List<GraphData> datas)
    {
        for(int i = 0; i < 2; i++)
        {
            
            switch (datas[i].getGraphNum())
            {
                case 0: //直線
                    Vector3 p = datas[i].getLinePassingPoint();
                    Vector3 d = datas[i].getLineDirection();
                    textMeshes[i].text = "点(" + p.x + " ," + p.y + " ," + p.z + ")を通る" +
                        "\nベクトル(" + d.x + " ," + d.y + " ," + d.z + ")に平行な直線"; ;

                    break;
                case 1:
                    Vector4 c = datas[i].getPlaneCoefficient();
                    textMeshes[i].text = c.x + "x ";

                    if (Mathf.Sign(c.y) == -1)
                    {
                        textMeshes[i].text += c.y + "y ";
                    }
                    else
                    {
                        textMeshes[i].text += "+" + c.y + "y ";
                    }

                    if (Mathf.Sign(c.z) == -1)
                    {
                        textMeshes[i].text += c.z + "z ";
                    }
                    else
                    {
                        textMeshes[i].text += "+" + c.z + "z ";
                    }

                    if (Mathf.Sign(c.w) == -1)
                    {
                        textMeshes[i].text += c.w + " = 0";
                    }
                    else
                    {
                        textMeshes[i].text += "+" + c.w + " = 0 の平面";
                    }
                    break;

                case 2:
                    textMeshes[i].text = "Error";
                    break;
            }
        
        }
    }

    private void setExplainText(GraphData cross)
    {
        switch (cross.getCrossMessage()/10)
        {
            case 1: //直線と直線
                crossKindText.text = "の交点";

                switch (cross.getCrossMessage() % 10)
                {
                    
                    case 0:
                        explainText.text = "平行でないことを確認したうえで, \n" +
                            "各成分での媒介変数が一致するかどうかで判断できます。\n" +
                            "x,y成分で連立方程式をつくり、媒介変数の値を求めます。\n" +
                            "その媒介変数をz成分に代入して, z成分の等式が成り立てば交点あり, と判断できます。\n" +
                            "平行な成分や, 成分が0の時はy,z成分, z,x成分で比較します。\n" +
                            "なお, 計算過程で一つでも等式が成立しなければ交点はありません。";
                        break;
                    case 1:
                        explainText.text = "2つの直線の正規化した方向ベクトルが一致, \n" +
                            "または, 2つの直線の方向ベクトルの外積が零ベクトル, \n"+
                            "などで判断できます。";
                        break;
                    case 2:
                        explainText.text = "(2つの直線の正規化した方向ベクトルが一致, \n" +
                            "または, 2つの直線の方向ベクトルの外積が零ベクトル), \n" +
                            "かつ, 通過点を互いに通るので同じ直線です。";
                        break;
                    case 3:
                        explainText.text = "計算不可です";
                        break;
                    case 4:
                        explainText.text = "平行でない, かつ交点をもたないで判断できます。\n";
                            
                        break;
                }
                break;

            case 2: //直線と平面
                crossKindText.text = "の交点";
                switch (cross.getCrossMessage() % 10)
                {
                    case 0:
                        explainText.text = "平行でないことを確認します。\n" +
                            "平行でないので、必ず交点をもちます。\n" +
                            "媒介変数をuとすると, 直線から, \n" +
                            "x = xの通過点 + 方向ベクトルのx成分 * u と表すことができます。\n" +
                            "同様にy,z成分を表し、媒介変数を含んだ値を平面の式に代入します。\n" +
                            "そうしてできた方程式を解くと, 媒介変数の値が求まります\n" +
                            "媒介変数の値を直線の式に代入することで, 交点を算出します。";
                        break;
                    case 1:
                        explainText.text = "直線の方向ベクトルと, 平面の法線ベクトルが垂直なので\n" +
                            "直線と平面は平行です。\n" +
                            "方向ベクトル, 法線ベクトルの内積が0であることで判断できます。";
                        break;
                    case 2:
                        explainText.text = "Error";
                        break;
                    case 3:
                        explainText.text = "計算不可です";
                        break;
                    case 4:
                        explainText.text = "直線の方向ベクトルと, 平面の法線ベクトルが垂直なので\n" +
                            "直線と平面は平行です。\n" +
                            "かつ、通過点が平面上にあることで、平面上の直線であることがわかります。";
                        break;
                }

                    
                break;
            case 3: //平面と平面
                crossKindText.text = "の交線";
                switch (cross.getCrossMessage() % 10)
                {
                    case 0:
                        explainText.text = "平行でないなら, 必ず交線があります。\n" +
                            "2つの法線ベクトルの外積が直線の方向ベクトルとなります。\n" +
                            "なので直線の特定の成分において, 0でない方向ベクトルの通過点を0と仮定すると\n" +
                            "通過点を通る際の媒介変数は0とおけます。(媒介変数 = 通過点0/方向ベクトル = 0)\n" +
                            "よって直線上の一点は(0,Y,Z),(X,0,Z),(X,Y,0)のいずれかとおけます。\n" +
                            "これを平面の2つの式に代入すると二元一次方程式ができます。\n" +
                            "これを解いて通過点がわかります。";
                        break;
                    case 1:
                        explainText.text = "2つの平面の法線ベクトルが平行なので\n" +
                            "この2平面は平行です。\n" +
                            "正規化したベクトルが一致することや、外積が0であることから判断できます。";
                        break;
                    case 2:
                        explainText.text = "法線ベクトルが平行, \n" +
                            "かつ定数項dが一致していれば同じ平面だと判断できます。";
                        break;
                    case 3:
                        explainText.text = "計算不可";
                        break;
                }
                break;
        }
    }

}