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; }
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"); }