proyecto de trabajo de la persona - el número de la demanda de gráficos de intersección
- clases de enseñanza: 005
- Dirección del proyecto: https://github.com/prime21/IntersectProject.git
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
- 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} \]
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} \)
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 |