コード例 #1
0
ファイル: FormRotation.cs プロジェクト: lulzzz/ReciPro
        /// <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());
        }
コード例 #2
0
ファイル: FormRotation.cs プロジェクト: lulzzz/ReciPro
        /// <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);
        }