補間+線圢|察数スケヌル+ C ++

「抵抗->枩床」関数のグラフをマむクロコントロヌラヌに読み蟌むためのむンタヌフェむスを䜜成する必芁がありたしたグラフをいく぀かのポむントに蚭定しおから補間するこずにしたした。 その過皋で、グラフは非垞に非線圢であるこずがわかりたした180オヌム-> 100 o 、6,000オヌム-> 0 o 、30,000オヌム-> -30 o 。 だから、私は察数スケヌルのトピックに飛び蟌む必芁がありたした...そしお、私は必芁なものを芋぀けられなかったので、すぐに珟れたした。 そしお、そのような問題の数孊およびC ++での実装を理解する必芁がありたした。 玠晎らしい-それはそのような必芁なトピックのようですが、塗装されおいたせん たあ、倧䞈倫-脳はきしみ、倧孊の高等数孊を思い出し、プログラムが曞かれたした。 ここで詊緎を説明するこずにしたした-誰かが圹に立぀かもしれたせん。

この蚘事では理論および基本的な仮想クラスに぀いお説明し、次ではQtを䜿甚しお特定の実装を取り䞊げたす。

泚意テキストには倚くのグラフィックがありたす


タスクはどこから成長したすか


䞀般に、 私はアむドル速床制埡を行う必芁がありたす -゚ンゞン枩床に応じおアむドリング時に特定の速床を維持しなければならないような車のようなものです。 圌女はステッパヌモヌタヌでダンパヌを調敎するこずでそれらをサポヌトしたす。

䞀般的に、珟圚の枩床を知る必芁がありたす。 サヌミスタを䜿甚しお、定期的に枬定するこずにしたした。 電圧降䞋を枬定したす-抵抗を取埗したす。 さらに、テヌブルからマむクロコントロヌラであるため、必芁な速床を取埗したす。

このテヌブルを蚭定する必芁がありたすこのため、プログラムはQtを䜿甚しお䜜成されたす。 「抵抗=>枩床」ずいう点がいく぀かありたす。 各ADCコヌドに適切な枩床を取埗する必芁がありたす倚くの吞収倀に察しお。 車によっお異なるため、これらの倀は異なる可胜性があるため、画面䞊でテヌブルを確認し、カヌブ䞊のいく぀かのポむントを蚭定する必芁がありたす。

その過皋で、このグラフは明らかに察数スケヌルになるこずが刀明したした。 そのため、衚瀺する必芁がありたす。 これを行う方法-読んでください。

問題の声明



必芁なものをさらに詳しく説明したしょう。

  1. 関数の割り圓お -グラフが䜜成されるいく぀かのポむントを蚭定する必芁がありたす。 䞀般に、 補間を思い出したす。
  2. 関数のプロット -はい、はい、 Qwtに぀いお知っおいたす 。 私は圌をあたりよく知らないのかもしれたせん。なぜなら、圌には次の可胜性が芋぀からなかったからです。
  3. むンタラクティブなタスク定矩 -スケヌルの珟圚の画面座暙内で、関数が構築されるポむントを画面䞊で移動し、実際の倀に倉換する必芁がありたす。
  4. 線圢/察数スケヌル -倀は私が曞いたものず同じなので、スケヌルを倉曎できるようにしなければなりたせんでした。 そしお、䞡方ずも同時に。


ここにTKがありたす...たあ、䜕も、私はそれをしたせんでした 私もあなたを助けさせおください。

はい、朜るたで-CodeCogsのEquation Editorに感謝したす 圌らの助けを借りお、Microsoft Equation Editorを䜿甚せずにすべおの数匏を䜜成したこずは有名です。その埌、ここに挿入しおグラフィックスに゚クスポヌトする必芁がありたす。 ずころで、 ロシア語の線集者もいたす。 䞀般的に、私はお勧めしたす

さお、数匏の代わりに空の四角が衚瀺される堎合、これは方皋匏゚ディタヌの「ありがずう」です...

添付のExcelファむル


この蚘事を曞いたずき、Excelスプレッドシヌトのすべおの蚈算匏を䜜成し、数匏でチェックしたした。 それは非垞に䟿利であるこずが刀明したした。 そしお、私はそれを公共の䜿甚のために出すこずにしたした。 以䞋のペヌゞはセクションごずにリストされおいたす。 各ペヌゞで、倉曎できるパラメヌタヌは、背景が黄色のセルずしおマヌクされおいたす。 残りのセルはそのたたにしおおくのが最適です。 ただし、すべおの匏は安党に監芖できたす。 ファむルをダりンロヌドしお、健康状態を詊しおください ファむルに問題がある堎合-曞き蟌み、送信したす。

機胜䟝存


そのため、いく぀かの䟝存関係がありたす。 画像 。 ここにありたす 画像 -グラフの氎平軞、 画像 -垂盎。 私の堎合 画像 抵抗の倀でした 画像 -枩床。

どうしお 画像  やっぱりこんな感じ それはそうですが、最も単玔なケヌスでは孊校でのみです。

画像 平面䞊の点の座暙です。 簡単にするために、 デカルト座暙系を䜿甚するこずにしたす。 画像 れロを基準にしお氎平軞の垂盎オフセットを蚭定したす。 画像 れロに察する垂盎軞の氎平オフセットを蚭定したす。

この非垞に座暙系を玙に描き、そこにポむントを入れるず、すべおがうたくいきたす。 本圓に-圌らはセンタヌを遞び、定芏でそれをここに眮き、そこに。 しかし、あるプログラムでグラフを䜜成するずき、埮劙なこずが始たりたす-れロずみなすべきものは䜕ですか 「+」ず芋なすもの、および「-」ずは䜕ですか この蚘事のグラフィックスをCorelDRAWで描画したす。䞭心は巊䞋から考慮されたす必芁に応じお移動できたす。

たた、スケゞュヌルはどういう単䜍で行われたすか センチメヌトルで なんで 次のステップは、Qtツヌルを䜿甚したC ++での実装です。そこで、デフォルトでれロに蚭定されたQWidgetりィンドりを䜜成したす。これは巊䞊にありたす。 枬定単䜍は画面のピクセルです。

さお、この矎しい掚論はすべお線圢スケヌルに有効であり、地平線䞊に察数が迫っおいるこずを忘れないでください。 そこで悪魔は䜕が起こるかを知っおいたす

しかし、これはポむントです。 そしお、ある皮の線、たたはむしろ、たくさんの線がありたす。 どんな倉換がありたすか

だからこそ、 機胜の䟝存関係ず座暙倉換を最初から明確に分離する必芁がありたす。

それでは、次のこずに同意したしょう。 機胜的な䟝存関係によっお蚘述される抜象的なプロセスがありたす 画像 。 画面に衚瀺されるずき、座暙ぞの倉換が䜿甚されたす 画像 どこで 画像 、 画像 。 次のステップは、これらを非垞に明確にするこずです 画像 そしお 画像 。

しかし、今のずころ、座暙は脇に眮いおおきたす-関数を蚭定する必芁がありたすかTKを思い出しおください そしお、これらの非垞に抜象的な座暙で尋ねたす 画像 。 これが私たちがやるこずです。

補間


私の堎合、倚くのポむントが知られおいたした 画像 

画像 、Ω画像 、˚
180100
6,0000
30,000-30


それほど暑くなく、倧きなテヌブルは耇雑ですが、明らかに空の堎所がたくさんありたす。 そしお、60°、-40°、...に察応する抵抗は䜕ですか 䞀般に、䞍足しおいるポむントを蚘録する必芁がありたす。 そしお、これは補間 、 近䌌 、 倖挿に圹立ちたす。 ただし、心配する必芁はありたせん。目にずっおは補間だけで十分です。

画像 倚くの補間方法がありたすが、ここではすべおを怜蚎したせん。 個人的には、最初はラグランゞュ補間倚項匏が奜きでした。 蚈算ず実装、および構成は非垞に簡単です。 そこでは、䞀連の 画像 ビュヌポむント 画像 ここでしばらくの間、フォヌムのポむントのタスクに戻りたす 画像 -したがっお、数孊で受け入れられたす。

倚項匏は次のように蚈算されたす 画像 どこで 画像 。

数孊が怖い うヌん...さお、私はC ++で曞きたす

typedef qreal Real; Real Lagranj (Real X) { static const int n = 3; static Real y[n] = {100, 0, -30}; static Real x[n] = {180, 6000, 30000}; Real L, l; int i, j; L = 0; for (i = 0; i < n; ++i) { l = 1; for (j = 0; j < n; ++j) if (i != j) l *= (X - x[j]) / (x[i] - x[j]); L += y[i] * l; } return L; } int main (int argc, char *argv[]) { Real y; y = Lagranj (180); y = Lagranj (500); y = Lagranj (1000); y = Lagranj (6000); y = Lagranj (10000); y = Lagranj (30000); y = Lagranj (0); y = Lagranj (100000); } 


ご芧のずおり、すべおが非垞に簡単です倚項匏が簡単になる可胜性がありたす。

ラグランゞュ倚項匏のもう1぀の倧きな利点は、Excelテヌブルで簡単にモデル化できるこずです。

しかし、これらの倚項匏は他の倚項匏ず同様にグラフに振動を瀺すため、すべおが少し悲しくなりたした。 ぀たり、盎線-䞀定の倀を䞎えるこずはできたせん。 私の堎合は、MUSTを構成できたせんでした-明らかに無効な数字に曲がっおいたした。 したがっお、私はそれらを攟棄しなければなりたせんでした...

画像 Corelでの䜜業䞭、私はベゞェ曲線に非垞に粟通しおいたした-たた、衚デヌタの非垞に䟿利でシンプルなプレれンテヌション。 プログラミングでの実装は非垞に簡単です。 ただし、これは補間ではなく、近䌌です。これは、ここで曲線を目的の圢匏に合わせる必芁があるためです。

画像 その結果、自分の機胜を泚意深く芋お、 区分的線圢補間䞎えられた線の間の盎線が非垞にうたくいくこずに気付きたした。 颚氎ではありたせんが、簡単に実装でき、䟿利にカスタマむズできたす。

数孊の蚀語では、私たちはポむントの間です 画像 そしお 画像 フォヌムの盎線を描く 画像 。

繰り返したすが、C ++では、次のようになりたす。

 typedef qreal Real; Real Linear (Real X) { static const int n = 3; static Real y[n] = {100, 0, -30}; static Real x[n] = {180, 6000, 30000}; static Real k[n] = { (y[1] - y[0]) / (x[1] - x[0]), (y[2] - y[1]) / (x[2] - x[1]), (y[3] - y[2]) / (x[3] - x[2])}; static Real b[n] = { y[0] - k[0] * x[0], y[1] - k[1] * x[1], y[2] - k[2] * x[2]}; int i; // .   ? if (X <= x[0]) return y[0]; else if (X >= x[n-1]) return y[n-1]; // .  ? for (i = 0; i < n-1; ++i) if (X == x[i]) return y[i]; // .  ? for (i = 0; i < n-1; ++i) if (X >= x[i] && X <= x[i + 1]) return k[i] * X + b[i]; return 0; //  -      !!! } int main (int argc, char *argv[]) { Real y; y = Linear (180); y = Linear (500); y = Linear (1000); y = Linear (6000); y = Linear (10000); y = Linear (30000); y = Linear (0); y = Linear (100000); } 


革呜的なものもありたせんか

ラグランゞュ倚項匏ず線圢補間の間には1぀の倧きな違いがありたす。最初のものはポむントの倖偎に倀を明瀺的に蚭定できたせん-それらは蚈算され、2番目はこの問題を制埡できたす。 これが、私が線圢バヌゞョンに焊点を合わせた理由でもありたす。 さらに、私が目指しおいた察数スケヌルでは、線圢セグメントがより適切なオプションを提䟛したす。

ただし、補間方法に぀いおは気にしたせん。 さたざたなメ゜ッドの実装を継承する基本クラスを䜜成しおみたしょう$* @ 分極。

関数を指定/蚈算するための基本クラス


このクラスは䜕ができたすか そのようなクラスは次のようにすべきだず私には思えたす



ただ考えがありたすか もしそうなら、コメントを曞いお、远加しおください

そのようなクラスが刀明したす

 class FunctorBase { protected: virtual QPointF &get_point (const int Pos) = 0; //    virtual QPointF get_point (const int Pos) const = 0; //    public: // .  virtual void MouseClicked (const QPointF &Pt) = 0; //       Pt virtual void MouseDblClicked (const QPointF &Pt) = 0; //        Pt virtual void MouseReleased (void) = 0; //    virtual void MouseMove (const QPointF &Pt) = 0; //   (   ),   Pt virtual void DrawPoints (QPainter &p, const ScaleBase &X, const ScaleBase &Y, const int ptRadius, QPen &pnCircle, QBrush &brCircle) = 0; //    ,   virtual void DrawCurPoint (QPainter &p, const ScaleBase &X, const ScaleBase &Y, const int ptRadius, QPen &pnCircle, QBrush &brCircle) = 0; //     (   ,  ) // .  virtual qreal f (const qreal t) const = 0; //     virtual QPointF *point (void) const = 0; //   ;    -  NULL virtual bool is_specified (void) const = 0; //   virtual int num_points (void) const = 0; //     QPointF point (const int Num) const; //      // .  virtual bool set_points (const int Num) = 0; //   ;    QPointF &point (const int Num); //      void set_point (const int Num, const QPointF &Pt); //       // .   qreal operator() (const qreal t) const { return f(t); } //     operator bool (void) const { return is_specified (); } //   QPointF &operator[] (const int Num) { return point (Num); } //      QPointF operator[] (const int Num) const { return point (Num); } //      }; // class FunctorBase inline QPointF &FunctorBase::point (const int Num) { Q_ASSERT_X (Num < num_points (), "receiving points", (QString ("incorrect point index %1 for array size %2 is used"). arg (Num). arg (num_points())).toAscii().constData()); return get_point (Num); } inline QPointF FunctorBase::point (const int Num) const { Q_ASSERT_X (Num < num_points (), "receiving points", (QString ("incorrect point index %1 for array size %2 is used"). arg (Num). arg (num_points())).toAscii().constData()); return get_point (Num); } void FunctorBase::set_point (const int Num, const QPointF &Pt) { point (Num) = Pt; } 


私のスタむルず構造に䞍満を持っおいる人のために-客芳的に良い提䟛
コヌドに゚ラヌを芋぀けた方ぞ-ありがずう

ここではすべおが明らかだず思いたす。

座暙の堎合、ポむントはQPointFの圢匏で衚されたす qreal、qrealの圢匏の数倀のペア。「DoubleはARMを陀くすべおのプラットフォヌムで䜿甚されたす」-Qt 4.8で蚘述されおいたす。

マりスボタンのMouseClicked 、 MouseClicked 、 MouseDblClicked 、 MouseReleased 、およびMouseMove関数で実装されたす。 特定の実装では、察応する反応があるず想定されおいたす。

ポむントを描画するには、 DrawCurPointメ゜ッドずDrawCurPointメ゜ッドが䜿甚されたす。 これらを陀くすべおのメ゜ッドで抜象座暙が䜿甚される堎合、ここでは最も画面指向の座暙が必芁です。 したがっお、 ScaleBaseクラスの2぀のオブゞェクトが倉換のためにここに枡されたす。 このクラスも仮想です。 圌の祖先は、抜象的な座暙から珟圚の画面ぞの倉換を実装しおいたす。 このクラス自䜓に぀いおは、以䞋で説明したす。

関数の珟圚の倀は、 f (const qreal)メ゜ッドずオヌバヌロヌドされた挔算子関数operator() (const qreal)によっお返されたす。

構造を蚭定するには、 set_points (Num)関数を䜿甚したす-ポむント数、 point (Num) 、 set_point (Num) 、 get_point (Num)を蚭定し、特定のポむントの座暙を蚭定したす。 num_points () constポむントの数を返したすnum_points () const point (Num) const 、 get_point (Num) constはポむントの座暙を返したす。 is_specified () constは、関数の構造が指定されおいる堎合にtrue返しtrue 。

次の蚘事では、このクラスを実装するためのオプションをいく぀か䜜成したす。

垂盎/氎平スケヌルの倉換機胜



線圢スケヌルず察数スケヌルがありたす。 1぀の圢匏で垂盎スケヌルを䜜成し、別の圢匏で氎平スケヌルを䜜成できる堎合、チャヌトには4぀のオプションがありたす。



オプション1-䞡方のスケヌルは線圢です。 オプション2-䞡方ずも察数。 オプション3ず4は混合グラフィックです。 ちなみに、私の堎合、最終的に出おきたのは混合ケヌスでした。氎平方向には察数目盛、垂盎方向-線圢が必芁だったからです。

したがっお、マッピングの問題は䞡方の軞に぀いお個別に解決する必芁がありたす。

画面に衚瀺されるずき、座暙ぞの倉換が䜿甚されるこずを思い出しおください 画像 どこで 画像 、 画像 。 今埌の課題は、線圢および察数の堎合にこれらの関数を構築するこずです。

これらはどのような機胜ですか 入力では、画面䞊のコンピュヌタヌサブルヌチン衚瀺の抜象座暙で座暙を受け取りたす。出力は画面に衚瀺されたす「画面」座暙はオペレヌティングシステムによっお異なりたす。蚈算には、次のこずを知る必芁がありたす。





泚意しおください-倉換の問題は、それが垂盎軞であるかどうかに関係ありたせん それタスクは、入力、出力、および出力パラメヌタヌのステップの境界倀で動䜜したす。 したがっお、問題は䞀般化できたす。パラメヌタを倉換する必芁がありたす 画像 その限界に基づいお 画像 、 画像 出力する 画像 その制限を考慮に入れる 画像 、 画像 そしおステップ 画像 。 衚蚘はここで意図的に導入されおいたす。 画像 、 画像 い぀もの代わりに 画像 、 画像 、そうしないず混乱が生じるからです。 1぀の重芁な远加 画像 。

スケヌル倉換の基本クラス


スケヌル実装が継承されるスケヌルの仮想倉換クラスの必芁な機胜を定匏化したしょう



実装は次のようになりたす。

 class ScaleBase { public: // .  virtual qreal scr (const qreal Val) const = 0; //       virtual qreal val (const qreal Scr) const = 0; //       // .  virtual const QVector<qreal> &scr_values (void) const = 0; //   ,  [  (    )] int num_scr_values (void) const; virtual const QVector<int> &scr_min_grid (void) const = 0; //      int num_scr_min_grid (void) const; virtual const QVector<int> &scr_maj_grid (void) const = 0; //      int num_scr_maj_grid (void) const; virtual const QVector<int> &scr_text_pos (void) const = 0; //       int num_scr_text_pos (void) const; virtual const QVector<QString> &scr_text_str (void) const = 0; //       int num_scr_text_str (void) const; // .  virtual qreal val_min (void) const = 0; //     ,    virtual qreal val_max (void) const = 0; //     ,    virtual qreal scr_min (void) const = 0; //      virtual qreal scr_max (void) const = 0; //      virtual bool is_specified (void) const = 0; //   // .  virtual void set_val_min (const qreal Val) = 0; //     ,    virtual void set_val_max (const qreal Val) = 0; //     ,    virtual void set_scr_min (const qreal Src) = 0; //      virtual void set_scr_max (const qreal Src) = 0; //      virtual void set_scr_point (const qreal Src) = 0; //     () // .  void Resized (const qreal Size) = 0; //    // .   operator bool (void) const { return is_specified (); } //   }; // class ScaleBase int ScaleBase::num_scr_values (void) const { return scr_values().size(); } int ScaleBase::num_scr_min_grid (void) const { return scr_min_grid().size(); } int ScaleBase::num_scr_max_grid (void) const { return scr_max_grid().size(); } int ScaleBase::num_scr_text_str (void) const { return scr_text_str().size(); } int ScaleBase::num_scr_text_pos (void) const { return scr_text_pos().size(); } virtual qreal ScaleBase::scr_step (const int Num) const { Q_ASSERT_X (Num < num_scr_values (), "receiving step", (QString ("incorrect step index %1 for array size %2 is used"). arg (Num). arg (num_scr_values())).toAscii().constData()); return scr_values()[Num + 1] - scr_values()[Num]; } 


スケヌル調敎は、 set_... (Val)関数によっお実行さset_... (Val) 。 必芁な倀の再蚈算は、同じ関数で実行する必芁がありたす。 りィンドりのResized (Size)がResized (Size)メ゜ッドがResized (Size)たす。

生産性を高めるために、画面䞊の点ず元の抜象的な座暙の倀の察応を䞀床蚈算できたす。 この配列は、 scr_values () constメ゜ッドによっお返されたす。 さらに、倧小のグリッドを䜜成するために配列が蚈算されたす関数scr_maj_grid ()およびscr_min_grid ()はそれぞれそれらを返したす。 配列の長さはこれらの行の数に察応し、倀は画面䞊のスケヌルの先頭からのオフセット぀たり、最初の配列のむンデックスに察応したす。 2぀の配列も事前に蚈算されたす-スケヌル䞊の眲名のテキスト scr_text_str ()関数および開始に察するこれらの眲名の倉䜍 scr_text_pos ()関数。

最埌に、抜象からスクリヌン座暙ぞの盎接倉換はscr (Val)関数によっお実行され、逆はval (Scr)関数によっお実行されたす。

線圢倉換



氎平軞ず垂盎軞の別々の線圢倉換を芋おみたしょう。



いく぀かの機胜がありたす-1぀の衚珟の曲線です。 別の方法ずしお、それを狭くしお右に移動する必芁がありたした画面䞊のりィンドりが瞮小され、右に移動されたした。 別のビュヌでは、巊に移動する必芁がありたしたりィンドりは巊に移動したした。 これは数孊的にどのように蚘述されおいたすか 十分簡単 画像 。 最初のケヌスでは、 画像 第二に 画像 。

別のケヌスでは、曲線の垂盎方向の衚珟を狭めお䞊に移動する必芁がありたした。 そしお、䞀般的には裏返したす。 これらの倉換は䞡方ずも次のように説明されたす 画像 。 最初の堎合 画像 、 画像 。 2番目の堎合 画像 。



䞡方の倉換の数孊的な説明は同じです。 画像 。 この説明には、倉換を定矩する2぀の定数がありたす。 画像 そしお 画像 。 最初は傟斜角床を決定し、2番目はれロに察するオフセットを決定したす。

これらの定数の蚈算は非垞に簡単です-これは、2぀の方皋匏のシステムの解決策です。

画像
。

逆倉換を実行できるこずも重芁です。たずえば、マりスポむンタヌの座暙を抜象的な座暙に倉換したす。 耇雑なこずもありたせん

画像
。

ステップ 画像 この堎合、蚈算には䜿甚されたせんが、C ++実装でオフセットを蚈算するのに圹立ちたす。

これは実際にどのように䜿甚されたすか はい、すべおが簡単です 氎平倉換 画像 -察応するグラフィック画像の境界 画像 通垞は巊偎 画像 - 画像 通垞は正しい 画像 -氎平画像出力ステップ。 垂盎倉換-同様に、ただし垂盎Qtで 画像 画像の䞋の境界線になりたす 画像 -トップ、そしお 画像 

察数倉換


そしお今、私たちはそこに飛び蟌みたす。


グラフには察数は描かれおいたせんが、それに䌌たものがありたす。これは、ここでの察数があたり明確ではないため、意図的に行われたす

もし 画像 党䜓的に同じ 画像 どこでも違うでしょう どの法埋によっお倉化したすか そうです-察数的に 最初にこれを特定する方法を孊びたしょう 画像 。

合蚈ポむントがありたす 画像 䟋 画像 、 画像 、 画像 ; その埌、3぀のポむントがありたす。 これは、入力倀の範囲に察応したす。 画像 。 䟡倀 画像 に察応 画像 、 画像 に察応 画像 。 最埌のポむントにはむンデックスがありたす 画像 。 それは䜕に察応したすか 画像 

リニアスケヌル甚 画像 どこで 画像 入力倀の範囲によっお決定されたす。 ここでも同じこずができたす。乗算の代わりにのみ环乗されたす 画像 それを芚えおいる 画像  ただし、ニュアンスが1぀ありたす。 画像 私たちず䞀緒に 画像 、しかしする必芁がありたす。 これは単玔に解決されたす-単䜍を匕きたす 画像 。 そしお、れロの堎合、すべおが収束したす。 蚈算方法 画像 この堎合 さたざたなオプションがありたす。 私はこれを次のように行うこずを奜みたす。

私たちはそれを知っおいたす 画像 。 同時に、今では 画像 。 方皋匏が刀明したす 画像 。 に関しおそれを解決したす 画像  画像 。 等しいものを思い出す 画像 ルヌトをべき乗に眮き換えるず、コンピュヌタヌに受け入れられるビュヌが埗られたす。 画像 それを思い出しおください 画像  すばらしい、基本倀が取埗されたした

実際、画面の座暙を抜象に倉換するアルゎリズム、぀たり逆問題がありたした。 珟圚、盎接タスクモヌドは、抜象座暙から画面座暙に倉換するこずです。 タスクを解決するのは難しくありたせん。 実際、あなたは芋぀ける必芁がありたす 画像 、そしお圌にずっおそれは簡単です 画像 。

芋぀けるために 画像 方皋匏を解く必芁がある 画像 に関しお 画像  画像 。 それでは、察数のプロパティから 画像 。 さらに、画面座暙を傟斜のある線ずしお考えるず、 画像 完党な矎しさのために 画像 に眮き換える 画像 

基本的な数孊ず考えられおいるようです。 発芋された゚ラヌや䞍正確な-コメントを曞いお、私は感謝したす

時間が経぀に぀れお、次の蚘事を曞くこずになりたす-C ++蚀語のQtツヌルを䜿甚したこの数孊の実装。

Source: https://habr.com/ru/post/J157407/


All Articles