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; } } }