using Microsoft.MixedReality.Toolkit.UI; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; using System; using System.Reflection; using Microsoft.MixedReality.Toolkit; public class GraphAdderWindow : BackButton { [SerializeField] private GameObject formulaInput; [SerializeField] private GameObject graphAdderWindow; [SerializeField] private GameObject numberInputWindow; [SerializeField] private GameObject plotSpace; [SerializeField] private GameObject graphs; [SerializeField] private GraphManager graphManager; public GraphData data; //画面遷移の仕方を記録 -1 -> 新規 、0,1,2->値変更 private int identCode; private int graphNum; private List<string> messageList; public void Initialize(GraphData data, int code) { this.data = data; identCode = code; graphNum = 0; Debug.Log("GraphAdderWindow:Start()data"); messageList = new List<string> { "タッチして直線の式を入力", "タッチして平面の式を入力", "対応していません。" }; messageList[graphNum] = getFormulaMessage(data); } public void Update() { formulaInput.GetComponent<ButtonConfigHelper>().MainLabelText = messageList[graphNum]; } public virtual void setGraphNom(int num) { /*0.直線 * 1.平面 * 2.その他 */ graphNum = num; } public void setGraphData(GraphData data) { this.data = data; messageList[data.getGraphNum()] = getFormulaMessage(data); Debug.Log("入力された平面データ\n" + data.getPlaneCoefficient().x + "," + data.getPlaneCoefficient().y + "," + data.getPlaneCoefficient().z + "," + data.getPlaneCoefficient().w); } //決定ボタン public void createGraph() { switch (data.getGraphNum()) { case 0: if(data.getLineDirection() == Vector3.zero) { error("方向ベクトルが全て0です。\n入力し直してください"); return; } Vector3 inLinePoint = new Vector3(); GameObject ln = GameObject.CreatePrimitive(PrimitiveType.Cylinder); ln.transform.parent = graphs.transform; if (data.getLineDirection().y != 0) { float uY0 = -1 * data.getLinePassingPoint().y / data.getLineDirection().y; inLinePoint = new Vector3( data.getLinePassingPoint().x + uY0 * data.getLineDirection().x, 0, data.getLinePassingPoint().z + uY0 * data.getLineDirection().z); } else if (data.getLineDirection().x != 0) { float uX0 = -1 * data.getLinePassingPoint().x / data.getLineDirection().x; inLinePoint = new Vector3( 0, data.getLinePassingPoint().y + uX0 * data.getLineDirection().y, data.getLinePassingPoint().z + uX0 * data.getLineDirection().z); } else if (data.getLineDirection().z != 0) { float uZ0 = -1 * data.getLinePassingPoint().z / data.getLineDirection().z; inLinePoint = new Vector3( data.getLinePassingPoint().x + uZ0 * data.getLineDirection().x, data.getLinePassingPoint().y + uZ0 * data.getLineDirection().y, 0); } ln.transform.localRotation = Quaternion.FromToRotation(Vector3.up, data.getLineDirection()); ln.transform.localPosition = inLinePoint; ln.transform.localScale = new Vector3(0.01f, 20, 0.01f); Destroy(data.getgraphObject()); data.setGraphObject(ln); graphManager.addNewGraphData(data, identCode); break; case 1: Vector3 nomalVector3 = new Vector3( data.getPlaneCoefficient().x, data.getPlaneCoefficient().y, data.getPlaneCoefficient().z); nomalVector3.Normalize(); if (nomalVector3 == Vector3.zero) { //全て0の場合 error("法線ベクトルが作成できません。\n" + "x,y,zのいずれかの係数を入れてください。"); return; } Vector3 inPlanePoint = new Vector3(); if (data.getPlaneCoefficient().y != 0) { inPlanePoint = new Vector3( 0, -1 * data.getPlaneCoefficient().w / data.getPlaneCoefficient().y, 0); } else if (data.getPlaneCoefficient().x != 0) { inPlanePoint = new Vector3( -1 * data.getPlaneCoefficient().w / data.getPlaneCoefficient().x, 0, 0); } else if (data.getPlaneCoefficient().z != 0) { inPlanePoint = new Vector3( 0, 0, -1 * data.getPlaneCoefficient().w / data.getPlaneCoefficient().z); } GameObject pl = GameObject.CreatePrimitive(PrimitiveType.Cube); pl.transform.parent = graphs.transform; pl.transform.localPosition = inPlanePoint; pl.transform.localRotation = Quaternion.FromToRotation(Vector3.up, nomalVector3); pl.transform.localScale = new Vector3(5, 0.001f, 5); Destroy(data.getgraphObject()); data.setGraphObject(pl); graphManager.addNewGraphData(data, identCode); break; case 2: Debug.Log("未対応"); break; } //画面遷移: 自分を閉じる base.anotherButtonAction(); } public void pressedFormulaInputButton() { data.setGraphNum(graphNum); numberInputWindow.GetComponent<NumberInputWindow>().setInitializeData(data); numberInputWindow.SetActive(true); graphAdderWindow.SetActive(false); } public string getFormulaMessage(GraphData data) { string str = ""; if(data == null) { return str; } if (data.isDataFormulaInputted()) { switch (data.getGraphNum()) { case 0: //直線 Vector3 p = data.getLinePassingPoint(); Vector3 d = data.getLineDirection(); str = "点(" + p.x + " ," + p.y + " ," + p.z + ")を通る" + "\nベクトル(" + d.x + " ," + d.y + " ," + d.z + ")に平行な直線"; ; break; case 1: Vector4 c = data.getPlaneCoefficient(); str = c.x + "x "; if (Mathf.Sign(c.y) == -1) { str += c.y + "y "; } else { str += "+" + c.y + "y "; } if (Mathf.Sign(c.z) == -1) { str += c.z + "z "; } else { str += "+" + c.z + "z "; } if (Mathf.Sign(c.w) == -1) { str += c.w + " = 0"; } else { str += "+" + c.w + " = 0"; }; break; case 2: str = "Error"; break; } } else { switch (data.getGraphNum()) { case 0: //直線 str = "タッチして直線の式を入力"; break; case 1: str = "タッチして平面の式を入力"; break; case 2: str = "対応していません。"; break; } } return str; } private void error(string str) { this.gameObject.GetComponent<ErrorWindow>().displayErrorMessage(str); } }