void spin_points(struct my_point_t *points, int npoints, struct my_point_t **spun_points, int nangles, int originx, int originy) { int i; double angle; double angle_inc; *spun_points = (struct my_point_t *) malloc(sizeof(*spun_points) * npoints * nangles); memset(*spun_points, 0, sizeof(*spun_points) * npoints * nangles); if (*spun_points == NULL) return; angle_inc = (2.0 * M_PI) / (nangles); for (i = 0; i < nangles; i++) { angle = angle_inc * (double) i; /* printf("Rotation angle = %f\n", angle * 180.0 / M_PI); */ rotate_points(points, npoints, &(*spun_points)[i * npoints], angle, originx, originy); } }
/* Gewichtete Abbildung des Trajektorienverlaufs zwischen den momentan * betrachteten Aufpunkten (x_old, y_old und x_new, y_new) in einer * temporaeren Matrix `plot_field'. Im Grunde zeichnen wir eine * Gerade zwischen dem alten und dem neuen Punkt im Plotbereich ;) */ void plot_to_next_point(double* plot_field, struct trajectory* current, struct state* state) { double tmp, x1, y1, x2, y2, dx, dy, w, m, n; /* Wichtung des aktuellen Punktes berechnen */ w = get_weight(current); /* Umrechnen der Netzelementhoehe in km (RES) * in die Netzelementhoehe in Rad (dy) */ dy = get_int(RES) / DEGDISTANCE; /* Umrechnen der Netzelementbreite in km (RES) * in die Netzelementbreite in Rad (dx) fuer die * Breite des erten Aufpunkts (x_old, y_old) */ dx = get_int(RES) / (DEGDISTANCE * cos(deg2rad(current->y_old))); /* Berechnen des Astands in x- und y-Richtung des ersten * Aufpunkts (x_old, y_old) zum Ursprung (lo_min, la_min) des * Berechnungsgebiets in der Einheit Netzelement */ x1 = (current->x_old - state->lo_min) / dx; y1 = (current->y_old - state->la_min) / dy; /* Umrechnen der Netzelementbreite in km (RES) * in die Netzelementbreite in Rad (dx) fuer die * Breite des zweiten Aufpunkts (x_new, y_new) */ dx = get_int(RES) / (DEGDISTANCE * cos(deg2rad(current->y_new))); /* Berechnen des Abstands in x- und y-Richtung des zweiten * Aufpunkts (x_new, y_new) zum Ursprung (lo_min, la_min) des * Berechnungsgebiets in der Einheit Netzelement */ x2 = (current->x_new - state->lo_min) / dx; y2 = (current->y_new - state->la_min) / dy; if (y1 == y2) { /* Wenn Steigung 0 */ /* x2 muss der groessere Wert sein */ if (x2 < x1) /* Vertauschen der Punkte (x1,y1) und (x2,y2) */ rotate_points(&x1, &y1, &x2, &y2); /* In x-Richtung den Netzelementebereich zwischen den * beiden Aufpunkten abwandern und den Trajektorienverlauf * (y=const.) plotten */ while (x1 < x2) { /* Checken, ob Element im Plotbereich liegt */ if (check_plot_area(x1, y1, current)) { unsigned i = (int)y1 * state->x_field + (int)x1; if (plot_field[i] == 0) plot_field[i] += w; } x1 += dx; } } else { /* y2 muss der groessere Werte sein */ if (y2 < y1) /* Vertauschen der Punkte (x1,y1) und (x2,y2) */ rotate_points(&x1, &y1, &x2, &y2); /* Geradengleichung zwischen den beiden Aufpunkten * berechnenen */ m = (x2 - x1) / (y2 - y1); n = x1 - (m * y1); /* In y-Richtung den Netzelementebereich zwischen den * beiden Aufpunkten abwandern und den linear * interpolierten Trajektorienverlauf (Geradengleichung) * zwischen den beiden Aufpunkten plotten */ while (y1 < y2) { tmp = (m * y1) + n; /* Checken, ob Element im Plotbereich liegt */ if (check_plot_area(tmp, y1, current)) { unsigned i = (int)y1 * state->x_field + (int)tmp; if (plot_field[i] == 0) plot_field[i] += w; } y1 += dy / get_int(RES); } } }