プロジェクト | コンテンツ |
---|---|
この作品は、コースに属し | 春2020コンピュータソフトウェア工学研究所(ロジャー・レン・ジアンキン) |
どこの仕事でこの要件 | 個々のプロジェクトの作業 |
このコースでの私の目標です | 完了し、完全なソフトウェア開発の経験を し、中にブログ開発プロセスの記録経験の マスターにチームワークのスキル 、長期的な、意味のある製品に優れ作成します |
私は目標を達成する助けたジョブの特定の局面において | 参照して「法の構築」経験 の助けをもたらすために、パフォーマンス分析とプロジェクト開発のための個人的なソフトウェア開発プロセス |
クラスを教えます | 006 |
プロジェクトアドレス | 交差点| Q2LのGitHubの |
パーソナルソフトウェアプロセス表(PSP)
我々は記録するために、次の形式で、プログラムを実行開始する前に、あなたのPSPはプログラム期間の様々なモジュールの開発に費やされると推定されます。(0.5「)
PSP2.1 | パーソナルソフトウェアプロセス段階 | 推定時間がかかる(分) | 実際の時間がかかる(分) |
---|---|---|---|
プランニング | 計画 | 10 | 10 |
・見積り | •このタスクが必要と推定どのくらいの時間 | 10 | 10 |
開発 | 開発 | 115 | 180 |
・分析 | (新しい技術を学ぶ含む)・ニーズ分析 | 20 | 15 |
・デザインスペック | 設計ドキュメントの生成 | 10 | 10 |
・デザインレビュー | ・デザインレビュー(と彼の同僚は、設計文書を見直し) | 0 | 0 |
・コーディング標準 | ・コードの仕様(現在の開発のための適切な規範の開発) | 5 | 5 |
・ 設計 | ・具体的な設計 | 10 | 20 |
・コーディング | ・具体的なコーディング | 30 | 60 |
・コードレビュー | ・コードレビュー | 10 | 10 |
・テスト | ・テスト(セルフテスト、コードを変更し、変更を提出) | 30 | 60 |
報告 | レポート | 80 | 80 |
・ 試験報告書 | ・テストレポート | 30 | 30 |
・サイズ測定 | ・コンピューティングのワークロード | 20 | 20 |
・死後&プロセス改善計画 | ・後知恵、およびプロセス改善計画を提案します | 30 | 30 |
トータル | 235 | 270 |
問題解決のためのアイデア
問題解決のアイデアを説明しました。つまり、タイトルを取得するために開始した後、どのように考えるように、どのようにプロセス内の情報を検索することができます。(3「)
カジュアルな作業を取得するにはまず、それは幾何学的なトピックは以下の具体的として、:
リニア交差点たちを解決するために、直接暴力から行列演算は、我々はすべての交点を求め、直接暴力を取り、その後、私たちが選んだ道保存しないアカウントにコードのスタイルとスケーラビリティを取って、その代表とする多くの方法があるクライン一次方程式の解決ムー法法は、線形方程式は、プロセスパラメータとして表現されます。
具体的には、各点へ直線プラス発現ベクターの方向パラメトリック方程式の形を表すことができる:
$$ライン:ポイント(X_0、Y_0)ベクター(X_0、X_1、Y_0-Y_1)を$$
クラメルの公式を使用して、特定の、線分決定基道の交差点によって決定することができます。
$$ \開始{アレイ} {CC} a_1x + b_1y = C_1 \ a_2x + b_2y = C_2 \端{アレイ} $$
$$ D = \左は[\ {行列}開始
A_1&B_1 \
A_2&B_2
\端{行列}
\右]
D_1 = \左[\ {行列}開始
C_1&B_1 \
C_2&B_2
\端{行列}
\右]
D_2 = \左[\開始{行列}
A_1&C_1 \
A_2&C_2
\端{行列}
\権利] $$
$$ X = \ FRAC {D1} {D}、。Y = \ FRAC {D2} {D} $$
両者の間のリンクである:
$$ \ FRAC-X_1} {X_0 Y_0-Y_1} = { - \ FRAC {B} {A} $$
$$ by_0 + C = ax_0
確認するために、簡素化を持参。
表現単位ベクトルと点に起因する(x、y)は、同じで格納する構造を定義しないので、余分な定義我々ができます。
私たちは、これらの構造の定義を格納するためのライブラリをカスタマイズして、演算子オーバーロードの構造にすることができます。
また、この作業入力は整数点であるが、ライン(すなわち単位ベクトル)のスロープが整数でない、浮動小数点精度の問題はまた、我々が使用できる場合、考慮状況がゼロに再定義されたテープの精度の一部を相殺します損失に。
追加の質問のスコアポイントの基本的な質問に焦点が練習を放棄することを選択したように、この時以来のタスクは、重いです。
設計と実装
設計と実装プロセス。コードの組織を設計する方法を含めて、そのようになどの主要な機能は、フロー・チャートを描画する必要があるかどうか、いくつかのクラス、いくつかの機能、それらの間にどのような関係がありますか?ユニットテストは、どのようなデザインですか?(4「)
この操作は単純であるので、それだけは、項目のクラスを定義しIntersection
、そしてためPoint
、およびVector
クラスからなる線形方程式は設計されず、直接使用しstruct
た一連の動作を完了するために構造を。
私たちは、線形代数の基本的な知識を使用するように、彼らは唯一の、基本を達成しているので、この段階で必要がフローチャートの形で提示していません。
ユニットテストの主な目的であるコーナーを覆う場合、この場合は、三のコーナーを含みます。
- 平行線
- 平行な直線の目的のためにかどうかを検出することができるが発生しないゼロによる除算演算。
- 得られた交点のx軸とy軸に平行な場合に正しい結果の可用性。
- 平行な直線の目的のためにかどうかを検出することができるが発生しないゼロによる除算演算。
- 縦線
- 交差点の垂直方向の直線だけの特別な場合、主線形と円形の計算は、後に、ここでそれがダウン予約されているために使用されます。
- 交差点の垂直方向の直線だけの特別な場合、主線形と円形の計算は、後に、ここでそれがダウン予約されているために使用されます。
- データ境界
- あるデータの範囲境界は、ここで使用して精度を確保するかどうかを
eps=1e-12
精度の損失の加工精度が。
- データ量規定時間内に完了し、正しい結果を得ることができ、操作中のストレステスト、与えられたデータライン1000と50000、それぞれ。
- あるデータの範囲境界は、ここで使用して精度を確保するかどうかを
各ケースのために我々はテストコンクリート及び有形ディレクトリにサンプルユニットテストの数を設計しているUnitTest
の中でresources
。
パフォーマンス分析
費やした時間を記録するプログラムのパフォーマンスを改善するには、改善のアイデアを説明し、パフォーマンス分析チャートを示した(VSは、2019年のパフォーマンス解析ツールによって自動的に生成)、そしてあなたが最大のプログラム機能を消費示しています。(3「)
改善する方法
私の実装では、改善された行はこれです:
- 使用を開始する
Set
交点の数を繰り返すことなく算出されるので、構造を。
- 分析
Set
、その内部には、パフォーマンスデータ構造である赤黒木の実装は、赤黒木は常に秩序状態を保証することができますが、常に見つけることが、それぞれの時間を維持する必要があるかどうか、既存の交差点とそれが関連するストーリーにかかる時間、実質的にすべてのlog(cnt_n)
それらのcnt_n
数は既に交差点に格納されています。
- 使用しようとし
Hashset
、HashSet
実装は浴槽、ハッシュテーブルの内部に達成される、各要素が第1バレルに格納され、バレル部材は、ハッシュテーブルで接続されています。
- 試し
List
に加えてSort
追加Unique
の新機能を、最後に重複データアウト画面。
パフォーマンス分析チャート
コード説明
void Intersection::solveLineLineIntersection() {
int i, j, n, ssize;
Vector u, v, w;
n = (int) vectors.size();
ssize = (int) intersects.size();
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
u = points[i] - points[j];
v = vectors[i];
w = vectors[j];
double denominator = Cross(v, w);
if (dcmp(denominator) == 0) { // parallel case
continue;
}
double t = 1.0 * Cross(w, u) / denominator;
intersects.push_back(points[i] + v * t);
}
}
}
すなわちの使用ケレム法は、直線の交点を達成解決します。