/// <summary> /// XmlNodeからVector3を生成して返す /// </summary> /// <param name="clXmlNode">xmlノード</param> /// <returns>Vector3</returns> public static ClsVector3 GetVecFromXmlNode(XmlNode clXmlNode) { ClsVector3 clVec = new ClsVector3(); XmlNodeList clListNode = clXmlNode.ChildNodes; foreach (XmlNode clNode in clListNode) { if ("X".Equals(clNode.Name)) { clVec.X = Convert.ToSingle(clNode.InnerText); continue; } if ("Y".Equals(clNode.Name)) { clVec.Y = Convert.ToSingle(clNode.InnerText); continue; } if ("Z".Equals(clNode.Name)) { clVec.Z = Convert.ToSingle(clNode.InnerText); continue; } throw new Exception("this is not normal Vec."); } return(clVec); }
//外積 public static ClsVector3 Cross(ClsVector3 v1, ClsVector3 v2) { return(new ClsVector3( v1.Y * v2.Z - v1.Z * v2.Y, v1.Z * v2.X - v1.X * v2.Z, v1.X * v2.Y - v1.Y * v2.X)); }
public ClsVector3 Add(ClsVector3 a, ClsVector3 b) { ClsVector3 ret = new ClsVector3(a); ret.Add(b); return(ret); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="enParam">種別</param> /// <param name="inLength">対象フレーム数</param> /// <param name="clPos">座標</param> /// <param name="pclVec">各ベクトル</param> public ClsDatTween(EnmParam enParam, int inLength, ClsVector3 clPos, List <ClsVector3> pclVec) { this.mParam = enParam; this.mLength = inLength; this.mPos = new ClsVector3(); if (clPos != null) { this.mPos.X = clPos.X; this.mPos.Y = clPos.Y; } this.mListVec = new List <ClsVector3>(); if (pclVec != null) { int inCnt; for (inCnt = 0; inCnt < 3; inCnt++) { ClsVector3 clVec = new ClsVector3(pclVec[inCnt].X, pclVec[inCnt].Y, 0.0f); this.mListVec.Add(clVec); } } this.mImage = ClsDatTween.CreateImage(this, 15, 15); }
/// <summary> /// xml形式でベクター3を ClsSystem.mFileBuffer に出力する処理 /// </summary> /// <param name="clHeader">ヘッダー</param> /// <param name="clName">要素名</param> /// <param name="clVec">ベクトル</param> public static void AppendElement(string clHeader, string clName, ClsVector3 clVec) { ClsTool.AppendElementStart(clHeader, clName); ClsTool.AppendElement(clHeader + ClsSystem.FILE_TAG, "X", clVec.X); ClsTool.AppendElement(clHeader + ClsSystem.FILE_TAG, "Y", clVec.Y); ClsTool.AppendElement(clHeader + ClsSystem.FILE_TAG, "Z", clVec.Z); ClsTool.AppendElementEnd(clHeader, clName); }
//v2の要素0はv1を適用 public static ClsVector3 operator /(ClsVector3 v1, ClsVector3 v2) { ClsVector3 ret = new ClsVector3(); ret.X = (v2.X == 0) ? v1.X : (v1.X / v2.X); ret.Y = (v2.Y == 0) ? v1.Y : (v1.Y / v2.Y); ret.Z = (v2.Z == 0) ? v1.Z : (v1.Z / v2.Z); return(ret); }
public static float Angle(ClsVector3 v1, ClsVector3 v2) { double fs = Math.Sqrt(v1.Length() * v2.Length()); if (fs != 0f) { return(0); } return((float)Math.Acos(v1.Dot(v1, v2) / fs)); }
//正規化 public ClsVector3 Normalize() { ClsVector3 v = new ClsVector3(); float leng = this.Length(); if (leng != 0) { v = this / leng; } return(v); }
//角度計算 public static float ToAngle(ClsVector3 from, ClsVector3 to) { //note: Degress = radians * (180/Math.PI); //2D θ=arcTan(x,y) //3D r=sqrt(x*x+y*y+z*z) // θ=arcTan(sqrt(x*x+y*y),z) // Φ=arcTan(y,x) //まだ return(0); }
//2点間線形補完Linear(rate 0-1) public static ClsVector3 Linear(ClsVector3 v1, ClsVector3 v2, double rate) { ClsVector3 ret = new ClsVector3(); if (rate < 0.0f) { rate = 0.0f; } if (rate > 1.0f) { rate = 1.0f; //clamp } //ret = v1 * (1.0f - rate) + v2 * rate; ret = v1 + (v2 - v1) * rate; return(ret); }
//3次補完 Lerp public static ClsVector3 Lerp(ClsVector3 v1, ClsVector3 v2, double rate) { ClsVector3 ret = new ClsVector3(); if (rate < 0.0f) { rate = 0.0f; } if (rate > 1.0f) { rate = 1.0f; //clamp } rate = rate * rate * (3.0f - 2.0f * rate); //ここの違いで色々? ret = v1 * (1.0f - rate) + v2 * rate; return(ret); }
/// <summary> /// XmlNodeListからVector3を生成して返す /// </summary> /// <param name="clListNode">ノードリスト</param> /// <param name="clName">要素名</param> /// <returns>int値</returns> public static ClsVector3 GetVecFromXmlNodeList(XmlNodeList clListNode, string clName) { ClsVector3 clValue = null; foreach (XmlNode clNode in clListNode) { if (clName.Equals(clNode.Name)) { clValue = ClsTool.GetVecFromXmlNode(clNode); return(clValue); } } clValue = new ClsVector3(); return(clValue); }
public byte[] mRate = null; //要素数MAX_X個のリスト /// <summary> /// コンストラクタ /// </summary> /// <param name="enParam">種別</param> /// <param name="inLength">対象フレーム数</param> /// <param name="clPos">座標</param> /// <param name="pclVec">各ベクトル</param> public ClsDatTween(EnmParam enParam, int inLength) { this.mParam = enParam; this.mLength = inLength; this.mPos = new ClsVector3(); this.mPos.X = ClsDatTween.POS_X1; this.mPos.Y = ClsDatTween.POS_Y1; this.mListVec = new List <ClsVector3>(); ClsVector3 clVec = new ClsVector3(ClsDatTween.VEC_X0, ClsDatTween.VEC_Y0, 0.0f); this.mListVec.Add(clVec); clVec = new ClsVector3(ClsDatTween.VEC_X1, ClsDatTween.VEC_Y1, 0.0f); this.mListVec.Add(clVec); clVec = new ClsVector3(ClsDatTween.VEC_X2, ClsDatTween.VEC_Y2, 0.0f); this.mListVec.Add(clVec); this.mImage = ClsDatTween.CreateImage(this, 15, 15); }
/// <summary> /// 読み込み処理 /// </summary> /// <param name="clXmlNode">xmlノード</param> public void Load(XmlNode clXmlNode) { XmlNodeList clListNode = clXmlNode.ChildNodes; string clParam = ClsTool.GetStringFromXmlNodeList(clListNode, "Param"); this.mParam = (EnmParam)Enum.Parse(typeof(EnmParam), clParam); this.mLength = ClsTool.GetIntFromXmlNodeList(clListNode, "Length"); this.mPos = ClsTool.GetVecFromXmlNodeList(clListNode, "Pos"); //以下、各管理クラス作成処理 foreach (XmlNode clNode in clListNode) { if ("Vec".Equals(clNode.Name)) { ClsVector3 clVec = ClsTool.GetVecFromXmlNode(clNode); this.mListVec.Add(clVec); continue; } } }
/// <summary> /// コンストラクタ /// </summary> /// <param name="clForm">メインフォーム</param> /// <param name="enParam">種別</param> /// <param name="inFrmStart">開始フレーム</param> /// <param name="inFrmEnd">終了フレーム</param> /// <param name="inFrmCurrent">カレントフレーム</param> /// <param name="clPos">中心座標(0.0~1.0)</param> /// <param name="pclListVec">各ベクトル(0.0~1.0)</param> public FormTween(FormMain clForm, EnmParam enParam, int inFrmStart, int inFrmEnd, int inFrmCurrent, ClsVector3 clPos, List <ClsVector3> clListVec) { InitializeComponent(); //以下、初期化処理 this.mFormMain = clForm; this.Text = "レートグラフ " + enParam; this.mGripNo = 0; this.mParam = enParam; this.mFrmStart = inFrmStart; this.mFrmEnd = inFrmEnd; this.mFrmCurrent = inFrmCurrent; this.mListPos = new List <ClsVector3>(); this.mListPos.Add(new ClsVector3(ClsDatTween.POS_X0, ClsDatTween.POS_Y0, 0.0f)); this.mListPos.Add(new ClsVector3(clPos.X, clPos.Y, clPos.Z)); this.mListPos.Add(new ClsVector3(ClsDatTween.POS_X2, ClsDatTween.POS_Y2, 0.0f)); this.mListVec = new List <ClsVector3>(); int inCnt; for (inCnt = 0; inCnt < 3; inCnt++) { this.mListVec.Add(new ClsVector3(clListVec[inCnt].X, clListVec[inCnt].Y, clListVec[inCnt].Z)); } //panel_PreView.DoubleBuuferd = true; panel_PreView.GetType().InvokeMember("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null, panel_PreView, new object[] { true }); }
//Minimum public void Min(ClsVector3 c) { this.X = (this.X < c.X) ? this.X : c.X; this.Y = (this.Y < c.Y) ? this.Y : c.Y; this.Z = (this.Z < c.Z) ? this.X : c.Z; }
//Maxim public void Max(ClsVector3 c) { this.X = (this.X > c.X) ? this.X : c.X; this.Y = (this.Y > c.Y) ? this.Y : c.Y; this.Z = (this.Z > c.Z) ? this.X : c.Z; }
//ret:new Vector = this - B public void Distance(ClsVector3 b) { X -= b.X; Y -= b.Y; Z -= b.Z; }
//this*Vector3(*= Vector3) public void Scale(ClsVector3 s) { X *= s.X; Y *= s.Y; Z *= s.Z; }
//Copy public ClsVector3(ClsVector3 c) { this.X = c.X; this.Y = c.Y; this.Z = c.Z; }
//内積 public float Dot(ClsVector3 v1, ClsVector3 v2) { return(v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z); }
public void Add(ClsVector3 b) { X += b.X; Y += b.Y; Z += b.Z; }