S
Hey,
ich hatte die Aufgabe eine bestimmte Anzahl von Punkten einzulesen und diese zu einem "einfach geschlossenen Weg" zusammenzufügen.
Danach will ich nur die Eckpunkte wieder ausgeben.
Mein Code sieht so aus:
#define Nmax 50
struct point {
int x, y;
float angle;
char c;
};
float theta(struct point p1, struct point p2) {
int dx, dy, ax, ay;
float t;
dx = p2.x - p1.x;
ax = abs(dx);
dy = p2.y - p1.y;
ay = abs(dy);
t = (ax + ay == 0) ? 0 : (float) dy / (ax + ay);
if (dx < 0)
t = 2 - t;
else if (dy < 0)
t = 4 + t;
return t * 90.0;
}
void createPoly(struct point p[], int N) {
int i, min;
for (min = 0, i = 1; i <= N; i++) {
if (p[i].y < p[min].y) {
min = i;
}
}
/* Nimm Punkt mit kleinstem y-Wert als Ankerpunkt */
struct point tmp = p[0];
p[0] = p[min];
p[min] = tmp;
/* Berechne Winkel zum Ankerpunkt für jeden Punkt */
int j;
for (j = 1; j <= N; j++) {
p[j].angle = theta(p[0], p[j]);
}
/*Sortiere nach größe der Winkel (Bubblesort) - Ankerpunkt bleibt an erster Stelle.*/
for (i = 1; i < N; ++i) {
for (j = 1; j <= N - i ; ++j) {
if (p[j].angle > p[j + 1].angle) {
struct point tmp = p[j];
p[j] = p[j + 1];
p[j + 1] = tmp;
}
}
}
}
Die Punkte liegen dann praktisch (angefangen beim Ankerpunkt) in der richtigen Reihenfolge im Array.
Problem ist, dass ich nicht prüfen kann ob ein Punkt ein Eckpunkt ist oder nicht.
Wenn ich die Punkte p1, p2, p3 habe, kann es ja sein, dass p2 auf der Geraden zwischen p1 und p3 liegt und dementsprechend kein Randpunkt ist.
Ich habe erst versucht das über die Steigung rauszufinden. Dh die Steigung der Geraden von p1p2 verglichen mit der Steigung von p2p3. Wenn die Steigung gleich ist, kann p2 ja kein Eckpunkt sein.
Problem ist, dass ja auch Punkte verbunden sein können, die den gleichen x-Wert haben. Dann teile ich durch 0 und kriege eine Exception. Allgemein hat das Prinzip leider nicht geklappt.
Vllt kann mir jemand helfen, nur die Randpunkte auszugeben.
Grüße