El primer software personal de trabajo del proyecto de ingeniería para la intersección --algo

proyecto de trabajo de la persona - el número de la demanda de gráficos de intersección

proyecto contenido
Esta obra pertenece a la Primavera del Norte 2020 Ingeniería de Software conexión de la clase Blog Parque
Este trabajo es un proyecto personal del trabajo del curso Los requisitos operativos
Mi objetivo en este curso es Cosecha de experiencia en el desarrollo de proyectos de equipo, para mejorar su nivel de desarrollo de software
En aspectos particulares de la tarea que me ayudó a alcanzar las metas La experiencia de desarrollo de tuberías MSCV

Ideas de resolución de problemas

Según la descripción de los requisitos, se puede obtener el software necesario para ejecutar el proceso, en general, dividido en tres pasos:

  • Parámetros de línea de comandos de análisis sintáctico, obtener la ruta del archivo de entrada y el archivo de salida
  • Obtener entrada del archivo de entrada, y analiza el parámetro gráfico almacenado en la estructura de datos correspondiente
  • Resolver el número de intersecciones entre el patrón y salidas
  1. Intersección de dos ecuaciones lineales, la simultánea

\[ A_1 x + B_1 y + C_1 = 0 \\ A_2 x + B_2 y + 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. La intersección de dos círculos fórmula \ (C_1 (O_1, r_1) , C_2 (O_2, r_2) \)

    Donde disjuntos \ [| O_1O_2 | <| r_1 -r_2 | \] o \ (| O_1O_2 |> r_1 + r_2 \)

    En otros casos, incluso investigado la relación entre la línea central y la intersección de la cadena, cadenas verticales e incluso para encontrar las intersecciones de la intersección línea central \ (P \)

    \ (P = O_1 + \ overrightarrow {i_ {O_1O_2}} \ times A \)

    Donde $ a = \ frac {r_1 ^ 2 - r_2 ^ 2 + d ^ 2} {2d} $

    Entonces los puntos de intersección en la dirección vertical \ (P '= P \ pm \ j overrightarrow \ veces h \)

    \ (\ Overrightarrow j \) es \ (\ overrightarrow i \) del vector normal, \ (H = \ ^ R_1 sqrt {2 - A ^ 2} \)

  2. Y un interseca la línea recta del círculo ecuación, teniendo en cuenta la fórmula vector lineal \ (U = T + U_0 (U_1-U_0) \) , para el círculo \ (C (O, r) \)

    Por el \ (| uO | = r \ ) eliminación para dar \ (| u_0 + t (U_1 -u_0) - O | = r \) es de aproximadamente \ (T \) una ecuación cuadrática, la solución fue de dos \ (T \) , era la intersección

diseño

Estructura de datos

Los tipos básicos de operaciones vectoriales

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

Análisis de la complejidad

Teniendo en cuenta todas las líneas y enumerar los casos se cruza con el círculo, y toda la complejidad de clasificación intersección es \ (O (n ^ 2 + m \ log m) \) donde \ (n- \) es el número de líneas y círculos, \ (m \) es el número de intersecciones.

la implementación del código

Organización código

Tres tipos de la intersección de la función

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

Valor de retorno tratado bajo diferentes condiciones

prueba

OpenCPPCoverage

análisis de la calidad del código

Remodeladora C ++

Mejoras en el rendimiento

retrospectiva

A medida que la demanda de esta tarea consiste en determinar, no hay necesidad de colocar demasiada especulación, y por lo tanto necesita menos tiempo empleado en el análisis.

mesa de PSP

PSP2.1 Etapas del Proceso de Software Personal Estimado de consumo de tiempo (minutos) Los que consumen mucho tiempo reales (minutos)
Planificación plan
· Estimación • Calcular la cantidad de tiempo esta tarea requiere 5 5
Desarrollo desarrollar
· Análisis · Análisis de Necesidades (incluyendo el aprendizaje de nuevas tecnologías) 15 15
· Diseño de especificaciones Generar documentos de diseño 10 10
· Revisión de diseño · Revisión de Diseño (y sus colegas revisaron los documentos de diseño) 0 0
· Codificación Estándar · Especificaciones de códigos (desarrollo de normas apropiadas para el desarrollo actual) 0 0
· Diseño · Diseño específico 60 90
· Codificación · Codificación específica 240 240
· Revisión de código · Revisión Código 10 10
· Prueba · Test (autoprueba, modificar el código, enviar modificaciones) 60 60
la presentación de informes informe
· Informe de prueba · Informe de prueba 10 10
· Medida del tamaño · Cargas de trabajo informáticas 10 10
· Postmortem y Plan de Mejora de Procesos · La retrospección, y proponer plan de mejora de procesos 30 30
total 450 480

Supongo que te gusta

Origin www.cnblogs.com/i-love-ange-and-oo-forever/p/12457257.html
Recomendado
Clasificación