交差点の最初の個人的なソフトウェアエンジニアリングプロジェクトの作業--algo

個々のプロジェクトの作業 - 交差点グラフィック需要の数

プロジェクト コンテンツ
この作品は、北部春2020ソフトウェアエンジニアリングに属し ブログのクラス接続パーク
このジョブは、コースワークの個人的なプロジェクトであります 運用要件
このコースでの私の目標です 収穫チームプロジェクトの開発経験、彼らのソフトウェア開発のレベルを向上させるために
私は目標を達成する助けたジョブの特定の局面において 経験パイプラインMSCV開発

問題解決のためのアイデア

要件の説明によると、我々は3つのステップに分け、一般的にプロセスを実行するために必要なソフトウェアを、取得することができます:

  • 解析コマンドラインパラメータは、入力ファイルのパスと出力ファイルを取得します
  • 入力ファイルから入力を取得し、対応するデータ構造に格納されたグラフィックパラメータを解析
  • パターンと出力との間の交差点の数を解きます
  1. 2次方程式の交差点、同時

\ [A_1 X + Y + B_1 C_1 = 0 \\ A_2とB_2 + X + C_2 = 0 \]

解得
\ [X = \ FRAC {B_1 C_2 - B_2 C_1} {A_1 B_2 - A_2 B_1} \\ Y = \ FRAC {B_1 C_2 - B_2 C_1} {A_1 B_2 - A_2 B_1} \]

  1. 二つの円の式との交点\(C_1(O_1、R_1) 、C_2(O_2、R_2)\)

    どこにばらばら\ [| O_1O_2 | <| R_1 -r_2 | \] または\(| O_1O_2 |> R_1 + R_2 \)

    他の例では、でも中心線と垂直方向の文字列、文字列の交点とさえ中心線の交差点の交差点を見つけるとの関係を調べた(P \)\

    \(P = O_1 + \ overrightarrow {I_ {O_1O_2}} \回\)

    $ A = \ FRAC {R_1 ^ 2 - R_2 ^ 2 + D ^ 2} {2D} $

    次に、垂直方向の交点\(「P = P \ PM \ overrightarrow J \回H \)

    \(\ overrightarrow J \)である\(\ overrightarrow I \)法線ベクトルの、\(H = \ ^ R_1のSQRT {2 - A ^ 2} \)

  2. 直線の交差円の方程式、線形ベクトル式を考慮\(U = T + U_0(U_1-U_0)\) 円のための\(C(O、R) \)

    (| UO | = R \ \ ) を与えるために除去\(| U_0 + T(U_1 -u_0) - O | = R \) 程度である\(T \)二次方程式、溶液であった2 \(T \) 交差点でした

デザイン

データの構造

ベクトル演算の基本タイプ

struct inter {
    double x;
    double y;
    inter() { x = 0; y = 0; }
    inter(double x, double y) : x(x), y(y) {}
    inter(poi p) : x(p.first * 1.), y(p.second * 1.) {}
    bool operator == (const inter& rhs) const {
        return dcmp(x - rhs.x) == 0 && dcmp(y - rhs.y) == 0;
    }
    bool operator < (const inter& rhs) const {
        int d = dcmp(x - rhs.x);
        if (d < 0) return true;
        if (d > 0) return false;
        if (dcmp(y - rhs.y) < 0) return true;
        return false;
    }

    friend inter operator + (const inter& lhs, const inter& rhs) {
        return inter(lhs.x + rhs.x, lhs.y + rhs.y);
    }

    friend inter operator - (const inter& lhs, const inter& rhs) {
        return inter(lhs.x - rhs.x, lhs.y - rhs.y);
    }

    friend inter operator / (const inter& lhs, const double& d) {
        return inter(lhs.x / d, lhs.y / d);
    }
    
    friend inter operator * (const inter& lhs, const double& d) {
        return inter(lhs.x * d, lhs.y * d);
    }

    friend double operator * (const inter& lhs, const inter& rhs) {
        return lhs.x * rhs.x + lhs.y * rhs.y;
    }

    double length() {
        return sqrt(x * x + y * y);
    }

    double length2() {
        return x * x + y * y;
    }
};

複雑性分析

考慮し、すべての行と円と交差し、複雑さをソート全ての交点である場合を列挙する(O(N ^ 2 + \ M \ログmは)\) ここで\(N- \)は、ラインおよび円の数であります\(M \)交差点の数です。

コードの実装

コードの組織

関数の交点の三種類

void addLineInter(int i, int j) {
    line *lhs = (line *)(pro[i]);
    line *rhs = (line *)(pro[j]);
    
    long long D = (lhs->A * rhs->B) - (rhs->A * lhs->B);

    if (D == 0) return ;
    double xx = (lhs->B * 1. * rhs->C) - (rhs->B * lhs->C);
    double yy = (lhs->A * 1. * rhs->C) - (rhs->A * lhs->C);

    gb_in.push_back(inter(xx / D, yy / D));
}
void addCircleInter(int i, int j) {
    circle* lhs = (circle*)(pro[i]);
    circle* rhs = (circle*)(pro[j]);

    long long dis = (lhs->o.first - rhs->o.first) * (lhs->o.first - rhs->o.first) + (lhs->o.second - rhs->o.second) * (lhs->o.second - rhs->o.second);

    if (dis > (lhs->r + rhs->r) * (lhs->r + rhs->r)) return; 
    if (dis < (lhs->r - rhs->r) * (lhs->r - rhs->r)) return;
    
    double alpha = dis + lhs->r * lhs->r - rhs->r * rhs->r;
    alpha /= 2 * sqrt(dis);

    double h = std::sqrt(lhs->r * lhs->r - alpha * alpha);

    inter o1o2 = inter(rhs->o) - inter(lhs->o);
    o1o2 = o1o2 / o1o2.length();
    inter vert = inter(o1o2.y, -o1o2.x);
    inter P = inter(lhs->o) + o1o2 * alpha;
    inter Q = P + vert * h;
    gb_in.push_back(Q);
    Q = P - vert * h;
    gb_in.push_back(Q);
}
void addLcInter(int i, int j) {
    line* lhs = (line*)(pro[i]);
    circle* rhs = (circle*)(pro[j]);

    inter li = inter(lhs->b) - inter(lhs->a);
    inter lc = inter(lhs->a) - inter(rhs->o);

    double A = li.length2();
    double B = (lc * li) * 2;
    double C = lc.length2() - (rhs->r) * (rhs->r);

    double delta = B * B - 4 * A * C;
    if (delta >= 0) {

        delta = sqrt(delta);

        double x1 = (delta - B) / (2 * A);
        double x2 = (-delta - B) / (2 * A);

        inter t1 = inter(lhs->a) + li * x1;
        inter t2 = inter(lhs->a) + li * x2;
        gb_in.push_back(t1);
        gb_in.push_back(t2);
    }
}

戻り値は、異なる条件下で処理しました

テスト

OpenCPPCoverage

コード品質分析

整形C ++

パフォーマンスの改善

あと知恵

このタスクの需要が決定することであるので、そこにあまりにも多くの憶測を配置する必要がないので、分析に費やす時間を必要とします。

PSPテーブル

PSP2.1 パーソナルソフトウェアプロセス段階 推定時間がかかる(分) 実際の時間がかかる(分)
プランニング 計画
・見積り •このタスクが必要と推定どのくらいの時間 5 5
開発 開発
・分析 (新しい技術を学ぶ含む)・ニーズ分析 15 15
・デザインスペック 設計ドキュメントの生成 10 10
・デザインレビュー ・デザインレビュー(と彼の同僚は、設計文書を見直し) 0 0
・コーディング標準 ・コードの仕様(現在の開発のための適切な規範の開発) 0 0
・ 設計 ・具体的な設計 60 90
・コーディング ・具体的なコーディング 240 240
・コードレビュー ・コードレビュー 10 10
・テスト ・テスト(セルフテスト、コードを変更し、変更を提出) 60 60
報告 レポート
・ 試験報告書 ・テストレポート 10 10
・サイズ測定 ・コンピューティングのワークロード 10 10
・死後&プロセス改善計画 ・後知恵、およびプロセス改善計画を提案します 30 30
トータル 450 480

おすすめ

転載: www.cnblogs.com/i-love-ange-and-oo-forever/p/12457257.html