/// <summary> /// Link状態の時、FormMainから呼ばれる。rotにもっとも近い回転行列をExperimetal coordinatesの /// オイラー角で表現する。その後、この回転行列で他のウィンドウに回転命令を出す。 /// </summary> /// <param name="rot"></param> public void setRotation(Matrix3D rot) { var settings = new List <(V3 Vec, double Angle, bool Variable)>(); var dir = getExpDirections(); settings.Add((dir[0], numericBoxExp1.RadianValue, !checkBoxFix1st.Checked)); if (checkBoxEnable2nd.Checked) { settings.Add((dir[1], numericBoxExp2.RadianValue, !checkBoxFix2nd.Checked)); } if (checkBoxEnable3rd.Checked) { settings.Add((dir[2], numericBoxExp3.RadianValue, !checkBoxFix3rd.Checked)); } var angles = Euler.DecomposeMatrix2(rot * RotBase.Inverse(), settings.ToArray()); skip = true; numericBoxExp1.RadianValue = angles[0]; if (checkBoxEnable2nd.Checked) { numericBoxExp2.RadianValue = angles[1]; } if (checkBoxEnable3rd.Checked) { numericBoxExp3.RadianValue = angles[2]; } skip = false; NumericBoxExp_ValueChanged(new object(), new EventArgs()); }
/// <summary> /// 角度をセット. /// </summary> /// <param name="fromExp">trueの時は、Experimental coordinatesの制限を解除して、オイラー角を更新する。</param> public void SetRotation(bool renewExpEuler = true) { if (skip) { return; } numericBoxPhi.RadianValue = FormMain.Phi; numericBoxTheta.RadianValue = FormMain.Theta; numericBoxPsi.RadianValue = FormMain.Psi; var rotMatrix = Euler.SetEulerAngle(numericBoxPhi.RadianValue, numericBoxTheta.RadianValue, numericBoxPsi.RadianValue); skip = true; numericBox11.Value = RotReciPro.E11; numericBox12.Value = RotReciPro.E12; numericBox13.Value = RotReciPro.E13; numericBox21.Value = RotReciPro.E21; numericBox22.Value = RotReciPro.E22; numericBox23.Value = RotReciPro.E23; numericBox31.Value = RotReciPro.E31; numericBox32.Value = RotReciPro.E32; numericBox33.Value = RotReciPro.E33; skip = false; if (renewExpEuler && Linked) { skip = true; checkBoxEnable2nd.Checked = checkBoxEnable3rd.Checked = true; checkBoxFix1st.Checked = checkBoxFix2nd.Checked = checkBoxFix3rd.Checked = false; var settings = new List <(V3 Vec, double Angle, bool Variable)>(); var dir = getExpDirections(); settings.Add((dir[0], numericBoxExp1.RadianValue, !checkBoxFix1st.Checked)); settings.Add((dir[1], numericBoxExp2.RadianValue, !checkBoxFix2nd.Checked)); settings.Add((dir[2], numericBoxExp3.RadianValue, !checkBoxFix3rd.Checked)); var angles = Euler.DecomposeMatrix2(RotReciPro * RotBase.Inverse(), settings.ToArray()); numericBoxExp1.RadianValue = angles[0]; numericBoxExp2.RadianValue = angles[1]; numericBoxExp3.RadianValue = angles[2]; skip = false; } //ReciPro coordinatesの描画 var dirReciPro = new[] { new V3(0, 0, 1), new V3(1, 0, 0), new V3(0, 0, 1) }; var angleReciPro = new[] { FormMain.Phi, FormMain.Theta, FormMain.Psi }; setGonio(glControlReciProGonio, dirReciPro, angleReciPro); setObject(glControlReciProObjects, dirReciPro, angleReciPro); setAxes(glControlReciProAxes); //Experimetal coordinatesの描画 var dirExp = getExpDirections(); var angleExp = new[] { numericBoxExp1.RadianValue, numericBoxExp2.RadianValue, numericBoxExp3.RadianValue }; setGonio(glControlExpGonio, dirExp, angleExp); setObject(glControlExpObjects, dirExp, angleExp); setAxes(glControlExpAxes); }