Cattle pasajero Challenge 38 - A - polígono y el círculo

enlaces a los temas: https://ac.nowcoder.com/acm/contest/4643/A

El significado de problemas: un círculo hueco de radio r, y n tiene un puntos convexa de polígonos internos, el círculo interior envuelta de rodillo de polígono. fin en sentido antihorario dado vértices del polígono, cada vértice ha garantizado el acceso a la carcasa circular.

Inicialmente, punto 1, punto 2, en un cierto círculo, el punto inicial 1 al eje, y luego sucesivamente a 2, 3, ..., n el número de puntos que el eje "rodar". número de punto Específicamente, cuando el número i apunta al eje "roll", el polígono permanecerá fijo i, y en que el punto central comienza a las agujas del reloj girando, hasta que los círculos punto i + 1 de contacto, a continuación, cambiar el eje corazón, seguirá "roll".

Buscando polígono a partir de la puesta en marcha inicial de laminación hasta el 1 llegó en el círculo de nuevo hasta el eje, 1ª puntos en el proceso global de desplazarse por el viaje es.

Solución: encontrado después de pintar por un largo tiempo, el ángulo central que consiste en dos cadenas se calcula acorde i-ésimo ángulo de rotación central, puede estar compuesto de la i-ésimo punto, i + 1-ésimo punto, el i + 2 puntos de los pares (calcula utilizando la ley de los cosenos), y luego calcula la cuerda del triángulo isósceles con ángulos de la base que consta de un ángulo central del centro (o directamente a partir de la ley de los cosenos esquina). Entonces estos dos ángulos de la base es el ángulo de rotación de la i + 1 y restando la esquina polígono puntos se encuentran. Radio de rotación no será necesariamente el borde del polígono, pero el primer punto y la conexión i + 1 puntos. Y se observará el primer punto que el punto enésima vez transcurrido el tiempo de rotación n-1 vuelve a aparecer en el círculo.

const double PI = acos(-1.0);

double x[105], y[105];

double distance(int i, int j) {
    return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
}

double angle(int i, int j, int k) {
    double p1x = x[i] - x[j], p1y = y[i] - y[j];
    double p2x = x[k] - x[j], p2y = y[k] - y[j];
    double cosval = (p1x * p2x + p1y * p2y) / (sqrt(p1x * p1x + p1y * p1y) * sqrt(p2x * p2x + p2y * p2y));
    return acos(cosval);
}

int main() {
    int n, r;
    scanf("%d%d", &n, &r);
    for(int i = 1; i <= n; ++i)
        scanf("%lf%lf", &x[i], &y[i]);
    x[n + 1] = x[1], y[n + 1] = y[1];
    x[n + 2] = x[2], y[n + 2] = y[2];
    double sum = 0;
    for(int i = 1; i <= n - 1; ++i) {
        double alpha = acos(distance(i, i + 1) / (2.0 * r));
        double beta = acos(distance(i + 1, i + 2) / (2.0 * r));
        double A = alpha + beta - angle(i, i + 1, i + 2);
        sum += A * distance(1, i + 1);
    }
    printf("%.12f\n", sum);
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/KisekiPurin2019/p/12536403.html
Recomendado
Clasificación