numerix hat geschrieben:ichbinsisyphos hat geschrieben:winkel zu jedem wertepaar berechnen und danach sortieren ist euch zu wenig elegant?
ich würd einfach atan(y/x), für jeden quadranten modifiziert, in eine neue liste schreiben und die abarbeiten.
Zeig doch mal.
Ich habe mir über einen Zugang über Winkel auch Gedanken gemacht und ich sehe noch nicht, dass das auf diese Weise (einfach) lösbar wäre.
Code: Alles auswählen
#!/usr/bin/env python
import math
points = [(1.,3.),(0.,0.),(7.,-1.)]
def quadmod(point):
if point[0] < 0:
return 180
else:
if point[1] < 0:
return 360
else:
return 0
def achsentest(point):
if point[0] == 0:
if point[1] < 0:
return 270
else:
return 90
if point[1] == 0:
if point[0] < 0:
return 180
else:
return 0
winkel = list()
for i in points:
if i[0] == 0 and i[1] == 0:
winkel.append(0) #Punkt im Koordinatenursprung
elif i[0] == 0 or i[1] == 0: #Punkt auf irgendeiner Achse
winkel.append(achsentest(i))
else:
winkel.append( math.degrees(math.atan(i[1]/i[0])) + quadmod(i) )
winkelsort = list()
for i in winkel:
winkelsort.append(i)
winkelsort.sort()
for i in range(0,len(points)):
print points[winkel.index(winkelsort[i])]
Naja, so schön ist das auch wieder nicht

. Funktionieren sollts aber.
edit: Ich seh grad, der Ursprung macht Probleme. Wenn ich einen Punkt einfüge für den der Winkel wirklich 0 ist, z.B. (1,0), dann wird am Schluß zweimal der Ursprung ausgegeben.
Man könnte (0,0) einen negativen Winkel zuordnen, dann kommt er vor allen anderen, oder einen von 360 oder darüber, dann kommt er nach allen anderen. Vielleicht kann man den Punkt überhaupt ausschliessen.
Ausserdem kann man sicher auch intelligenter sortieren so dass das Problem nicht auftaucht.
edit edit: Es gibt überhaupt ein Problem wenn zwei Winkel gleich sind, dann wird der erste passende Werte doppelt ausgegeben. Beim Sortieren kenn ich mich nicht übermässig aus.