예제 #1
0
        private void AlignStatic()
        {
            double    altOffset1;
            Rotation3 rotationToStand1;
            double    quality1;

            TwoStarsAlignment.Align(stars_[2].Horz, stars_[2].Scope, stars_[3].Horz, stars_[3].Scope, precesions_, out altOffset1, out rotationToStand1, out quality1);

            Rotation3 eqRotation = rotationToStand_.Conj * rotationToStand1;    // actual equatorial rotation

            equAxis_     = eqRotation.Axis;
            equHorzDiff_ = eqRotation.Angle;              // Generally, it isn't equal to equScopeDiff_. It depends on platform accuracy.
            altOffset_   = (altOffset_ + altOffset1) / 2; // average offset
            if (quality_ < quality1)
            {
                quality_ = quality1;                    // maximal quality
            }
            iterationCnt_ = 0;
        }
예제 #2
0
        private void AlignDynamic()
        {
            double equAngleFactor = 1;

            for (int i = 0; i < precesions_.iterCnt_; ++i)
            {
                Vect3 star1horz_corrected = new Rotation3((stars_[1].EquAngle - stars_[0].EquAngle) * equAngleFactor, equAxis_).Apply(stars_[1].Horz);
                Vect3 star3horz_corrected = new Rotation3((stars_[3].EquAngle - stars_[2].EquAngle) * equAngleFactor, equAxis_).Apply(stars_[3].Horz);

                double    altOffset0;
                Rotation3 rotationToStand0;
                double    quality0;
                TwoStarsAlignment.Align(stars_[0].Horz, stars_[0].Scope, star1horz_corrected, stars_[1].Scope, precesions_, out altOffset0, out rotationToStand0, out quality0);

                double    altOffset1;
                Rotation3 rotationToStand1;
                double    quality1;
                TwoStarsAlignment.Align(stars_[2].Horz, stars_[2].Scope, star3horz_corrected, stars_[3].Scope, precesions_, out altOffset1, out rotationToStand1, out quality1);

                Rotation3 eqRotation = rotationToStand0.Conj * rotationToStand1;    // actual equatorial rotation
                Vect3     equAxisNew = eqRotation.Axis;
                double    diff       = Vect3.VMul(equAxis_, equAxisNew).Abs;
                equAxis_ = equAxisNew;
                if (diff < precesions_.iterEquAxisDiff_)
                {
                    equHorzDiff_     = eqRotation.Angle;                            // Generally, it isn't equal to equScopeDiff_. It depends on platform accuracy.
                    rotationToStand_ = rotationToStand0;
                    altOffset_       = (altOffset0 + altOffset1) / 2;               // average offset
                    quality_         = (quality0 > quality1) ? quality0 : quality1; // maximal quality
                    iterationCnt_    = i + 1;
                    return;
                }
                equAngleFactor = eqRotation.Angle / equScopeDiff_;
            }
            throw new ApplicationException("too many iterations");
        }