[BUAA travail doux projet individuel travail de géométrie plane Fun]

génie logiciel BUAA travail individuel de projet

projet teneur
Cours: 2020 des cours de génie logiciel de blog Spring (Roger, Ren Jian) Parc lien de blog de classe
Job: génie logiciel BUAA travail individuel de projet exigences opérationnelles
Objectifs du cours L'apprentissage des compétences et des méthodes de développement de logiciels à grande échelle, la formation et les capacités de développement
objectif d'emploi Terminez le premier projet solo
Classes Vendredi matin classe 006
GitHub adresse de projet lien GitHub

PSP

PSP2.1 Etapes du processus Logiciels personnels consommatrice de temps estimé (minutes) Les chronophages réelles (minutes)
Planification plan
· Estimation • Estimez combien de temps cette tâche exige 60 80
Développement développer
· Une analyse · Analyse des besoins (y compris l'apprentissage de nouvelles technologies) 40 32
· Conception Spec Générer des documents de conception 30 45
· Examen de la conception · Design Review (et ses collègues ont examiné les documents de conception) 20 16
· Norme de codage · Les spécifications du Code (élaboration de normes appropriées pour le développement en cours) 5 3
· Conception · Conception spécifique 60 48
· codage · Codage spécifique 360 373
· Code Review · Code Review 60 49
· test · Test (auto-test, modifier le code, présenter des modifications) 60 83
rapports rapport
· Rapport d'essai · Rapport d'essai 50 68
· Taille de mesure · La charge de travail de l'informatique 5 5
· Postmortem et processus plan d'amélioration · Hindsight et processus proposer plan d'amélioration dix 24
total 760 826

idées de résolution de problèmes

Les questions de base

Au début, pour obtenir le titre, tout simplement regardé deux questions, trouver deux questions dans la deuxième question est comparée à la première question à se développer, et le sujet du problème à résoudre est de résoudre tangible de la vie réelle un ensemble de problèmes, de sorte que le départ a décidé d'utiliser des idées orientées objet pour concevoir le code. Titre petite description, le concept de valeurs de coordonnées de la ligne, la configuration suivante a décidé plusieurs catégories:

  • RationalNumber: Classe rationnelle
  • RationalPoint: Point rationnel comme une valeur de coordonnées
  • Line: Classe linéaire
  • GeometryStatistic: Classe statistique, enregistrement linéaire, le nombre de points.
  • Reader: La classe de traitement d'entrée.

Après avoir vu le titre, le titre est destiné à examiner la première question, un sommet au moins après deux droites intention est en fait l'intersection de la ligne. Pensez à l'intersection de la ligne, on trouve l'intersection de deux lignes sont connues pour, mais pour résoudre un ensemble d'équations linéaires, et sa solution peut être représentée par les paramètres d'une ligne droite. Ainsi , lorsque nous trouvons l'intersection des deux lignes droites, cette étape peut être fait \ (O (1) \) a. À savoir, deux lignes droites sont utilisées :

\ [Y_1 = k_1 x + b_1 \]

\ [Y_2 = k_2 x + B_2 \]

S'il y a une intersection entre une ligne droite, le point d' intersection supposé \ ((x_0, y_0) \) , les équations simultanées sont résolues pour donner

\ [X_0 = \ frac {B_2 - B_1} {k_1 - k_2} \]

\ [Y_0 = k_1 x + b_1 \]

Puis, quand donné deux sommets de chaque ligne, Simplifie d'expression algébrique

\ [X_0 = \ frac {(x_ {21} y_ {22} - y_ {21} x_ {22}) (x_ {11} - x_ {12}) - (x_ {11} y_ {12} - y_ { 11} x_ {12}) (x_ {21} - x_ {22})} {(y_ {11} - y_ {12}) (x_ {21} - x_ {22}) - (x_ {11} - x_ {12}) (y_ {21} - {22} y_)} \]

\ [Y_0 = k_1 x_0 + B_1 \]

Bien sûr, pour tenir compte des circonstances particulières dans lesquelles, si \ (k_1 \) à l' infini, alors \ (k_2 \) remplacer \ (k_1 \) (inévitable lorsque deux lignes se croisent \ (k_1 \) et \ (k_2 \) En même temps , impossible à l' infini).

Considérons le point de coordonnées des problèmes de précision, car la pente des deux lignes droites peut être peu de différence, intersection et très loin, afin d'éviter l' apparition d' une double précision ou suppressions, a décidé de construire une classe RationalNumber, la classe pour décrire un nombre rationnel, sous la forme de scores représentation. La première question, toutes les coordonnées qui peuvent être exprimées par des nombres rationnels, qui doivent être en mesure d'assurer une comparaison précise de deux différentes intersection.

Mais la question nécessite solution est l'intersection de toutes les lignes, le plus grand nombre de lignes droites peut atteindre \ (1000000 \) barres, ce qui indique que si la meilleure façon tous les deux lignes se croisent la violence pour résoudre la complexité temporelle est \ (O ( 2 ^ n-) \) , le résultat de délai d' attente. Cependant, grâce à un meilleur algorithme d'optimisation ne s'attendait pas, il a été décidé dans la perspective de la structure de données pour résoudre ce problème.

Grâce à l' accès à l' information trouvée, cpp et il y a une Java- HashSetcomme la structure de données pour \ (unordered_set \) , qui existe lorsque les interfaces personnalisées de classe doivent passer outre hachage et de l' égalité, que je l'interface conçu suit le hachage et égale :

size_t my_hash::operator()(RationalPoint* const& a) const {
    return hash<string>{}(a->hashstring);
}

bool my_equal::operator()(RationalPoint* const& a, RationalPoint* const& b) const {
    return a->equals(*b);
}

RationalPointest la construction de classe de points, ses deux composantes de deux valeurs de coordonnées XY des nombres rationnels, puisque la fonction de hachage est définie dans les coordonnées d'une chaîne de nos connaissances, la chaîne de valeur de hachage de requête, égale en comparaison plus évidente, qui compare deux composants sont égaux, respectivement.

crédit supplémentaire

En raison du problème supplémentaire d'introduire le concept d'un cercle, il est nécessaire d'augmenter les catégories suivantes:

  • Circle: Classe ronde
  • UnRationalPoint: Point de classe nombre irrationnel, à savoir un composant pour les deux sommets nombre irrationnel

Après l'intersection de la demande et linéaire De même, l'introduction du cycle, et l'intersection des situations suivantes:

  • intersection de la ligne de fil
  • intersection du cercle ligne
  • intersection ronde

Dans lequel l'intersection de la première question de la ligne de la ligne a été obtenue, le cercle d'intersection de la ligne même, l'équation quadratique peut être résolu simultanée

\ [Y = kx + b \]

\ [(X - m) ^ 2 + (y - n) ^ 2 = r ^ 2 \]

Vous pouvez résoudre pour:

\ [X 1 = \ frac {- (2kb - 2kN - 2m) + \ sqrt {(2kb - 2kN - 2m) ^ 2 - 4 (k ^ 2 + 1) (m ^ 2 + (bn) ^ 2 - r ^ 2)}} {2 (k ^ 2 + 1)} \]

\ [X 2 = \ frac {- (2kb - 2kN - 2m) - \ sqrt {(2kb - 2kN - 2m) ^ 2 - 4 (k ^ 2 + 1) (m ^ 2 + (bn) ^ 2 - r ^ 2)}} {2 (k ^ 2 + 1)} \]

\ [Y_1 = k x 1 + b \]

\ [Y_2 = k x 2 + b \]

Dans lequel, dans le plus nombre d'expression peut être inférieure à 0, inférieure à 0 indique s'il n'y a pas d'intersection, pour revenir, k peut être infini, l'infini lorsque k, une ligne droite arbitraire x = x-valeur de coordonnée d'un sommet, y dans l'équation d'un cercle vous pouvez être calculé.

Calculé par le théorème suivant de longueur d'intersection dont deux pour l'équation de l'expression différentielle d'un cercle, d'une ligne circulaire d'intersection, la ligne d'intersection de la première demande ronde, puis amené dans une ligne de calcul d'intersection circulaire, le point d'intersection. Note complétée par la peine de circonstances particulières.

Calculé intersection, certaines valeurs de coordonnées rationnelles sont possibles, et certains peuvent être des nombres irrationnels, nombre rationnel et irrationnel est déterminé à savoir si l'ouverture est un nombre entier plus de résoudre les équations est déterminé en fonction du nombre d'autres. Si l'ouverture est un entier plus, par rapport à un nombre rationnel, en classe rationnelle, si elle est un nombre irrationnel, place les coordonnées d'un point représentant doubles, des nombres irrationnels en classes.

Compte tenu des problèmes de précision, en raison du rayon limité du cercle et le sommet, afin de ne pas franchir un point loin, de sorte que la précision de point d'intersection ligne droite et pas trop petite. Le sujet de la double précision comparée à 1E-10 à envisager.

processus de conception

Les questions de base

classe nombreRationnel

Ces nombres rationnels sont représentés, qui a deux valeurs d'attribut du numérateur et le dénominateur, les deux types long long, il y a les fonctions membres suivantes:

  • Constructor: passer le numérateur et le dénominateur, le plus grand commun diviseur euclidienne de simplification, les symboles de la molécule.
  • equals(RationalNumber a): Comparaison de deux nombres rationnels sont égaux
  • toString(): Les nombres rationnels dans une chaîne

classe RationalPoint

Cette classe est utilisée pour représenter les coordonnées de point de sommet rationnels, à savoir, l'intersection de deux lignes droites avec x, y deux composants, le type de classe est un nombre rationnel, il existe une fonction membre:

  • : Deux Constructors entrants composants
  • equals(RationalNumber a): Comparaison de deux nombres rationnels sommets sont égaux
  • toString(): Les nombres rationnels dans un sommet de la chaîne

classe ligne

classe linéaire, soumis à stocker une ligne droite donnée, en raison de coordonnées à l'entier de valeurs, de sorte qu'il y a quatre éléments, respectivement, x1, x2, y1, y2, int, et ont des fonctions membres:

  • Constructeur: deux coordonnées de sommet entrants

classe GeometryStatistic

Cette classe est les statistiques de classe, des graphiques en ligne droite, et l'intersection de la ligne, les membres de variables vector<Line> lineschoses au clair, et unordered_set<RationalPoint*, my_hash, my_equal>sauver l'intersection a été obtenu, dans lequel my_hashet my_equalpour l'interface personnalisée, responsable de RationalPoint*générer de la valeur de hachage et comparer spécifique défini Code dessus. Nous avons des fonctions membres:

  • feed(Line line): Ajoutez des lignes, et l'intersection de la nouveauté
  • line_line_intersect(Line l1, Line l2): Calcul de l'intersection de deux lignes droites.
  • getPointCount(): Obtenez tout le nombre actuel d'intersection

classe lecteur

Une telle entrée et le traitement de sortie de la classe

programme débit

  • la fonction principale lit les paramètres de ligne de commande, la configuration instance Reader, l'entrée d'initialisation et de fichiers de sortie, la configuration objet GeometryStatistic.
  • Lecteur lit l'entrée, chaque fini de lire une ligne, appelez GeometryStatistic la fonction d'alimentation, les statistiques des Inject linéaires
  • fonction d'alimentation en ligne droite, d' abord et avant que toutes les lignes ont été ajoutées une fois traversal, les appels line_line_intersectfonctionnent pour résoudre l'intersection
  • line_line_intersectEn utilisant l'équation de la fonction dérivée ci - dessus, les coordonnées d'intersection de la construction de l' objet rationnel, l'objet et rationnelles insertpour unordered_setla.
  • Après avoir lu le fichier d'entrée, lit les Statisticobjets de getPointCount()valeurs, sortie vers un fichier, la fin du programme.

Unité de test configuré

  • Après avoir écrit la classe rationnelle, test rationnelle de l'unité de construction, vérifier s'il est nécessaire une configuration de simplification.
  • Après avoir écrit le sommet rationnelle et rationnelle, dans lequel la surcharge my_hashet my_equalune interface, la configuration de l'essai de l' unité respective, instancier un unordered_settest d'objet si deux interfaces pour répondre aux exigences
  • Après avoir écrit l'intersection résolu unité test configuré pour tester Statisticla classe, si l'intersection peut être précisément calculée et stockée.

crédit supplémentaire

Augmenter la classe:

classe cercle

Classe cercle, le rayon de sommet et le stockage du cercle

classe UnRationalPoint

nombre irrationnel classe de sommet, aussi longtemps que le composant de stockage sommet nombre irrationnel, à stocker.

À la fin de la classe, ont également besoin de recharger hashet equalinterfaces. problèmes de précision qui ont besoin d' attention, en prenant en compte 1e-10;

fonction croissante de la classe GeometryStatistic

  • line_circle_intersect(Line l, Circle c): Résolution de l'intersection des lignes et des cercles, pour résoudre la formule décrite ci-dessus dérivée. Dans lequel , lorsque la détermination de l' opportunité d'ouvrir nombre plus rationnelle, si elle est rationnelle pour construire l' RationalPointinstance d'objet correspondant à coexister dans l'ensemble, si le nombre irrationnel est configuré UnRationalPointexemples existent pour définir le correspondant
  • circle_circle_intersect(circle c1, circle c2): De même, la nécessité de faire la distinction entre les nombres rationnels et irrationnels

programme débit

  • la fonction principale lit les paramètres de ligne de commande, la configuration instance Reader, l'entrée d'initialisation et de fichiers de sortie, la configuration objet GeometryStatistic.
  • Lecteur lit l'entrée:
    • Après chaque lecture d'une ligne, appeler GeometryStatistic la fonction d'alimentation, les statistiques des Inject linéaires
    • Chaque lecture d'un cercle complet, les appels GeometryStatistic la fonction d'alimentation qui statistique ronde Inject
  • Dans la fonction d'alimentation:
    • fonction d'alimentation en ligne droite, d' abord et avant que toutes les lignes ont été ajoutées une fois traversal, les appels line_line_intersectfonctionnent pour résoudre l'intersection, puis à travers tous les cercles, les appels de line_circle_intersectrésolution et l' intersection circulaire, et l'intersection à un ensemble correspondant de
    • fonction d'alimentation de cercle, d' abord et avant que toutes les lignes ont été ajoutées une fois traversal, les appels line_circle_intersectfonctionnent pour résoudre l'intersection, puis à travers tous les cercles, les appels de circle_circle_intersectrésolution et l' intersection circulaire, et l'intersection à un ensemble correspondant de
  • Après avoir lu le fichier d'entrée, lit les Statisticobjets de getPointCount()valeurs, sortie vers un fichier, la fin du programme.

optimisation du code

code description

Je suppose que tu aimes

Origine www.cnblogs.com/lpxofbuaa/p/12457792.html
conseillé
Classement