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);
	} 
}
Exemplo n.º 2
0
/* 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);
		}
	}
}