![]() |
|||
| HSG |
|
3_Dualer_Ansatz.ggb, 4_Dualer_Ansatz_Mannheim.ggb, 5_Verbotenes_Gebiet.ggb, 5_Verbotenes_Gebiet_Projektion.ggb, 8_Steiner_120.ggb, 8_Steiner_Punkt.ggb, 9_Mannheim_Metrik.ggb, 10_Euklid_Metrik.ggb Doku_final.ppt
minimaler Maximalabstand
# Punkte
P = [(0,4),(7.02,4.78),(7,-3),(1,1)]
import math
# Metriken
def d1(p1,p2):
"""
euklidisch
"""
return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)
def d2(p1,p2):
"""
'Mannheim-Metrik'
"""
return abs(p1[0]-p2[0]) + abs(p1[1]-p2[1])
# Bewertungsfunktion
def wert(punkt,P,m):
"""
gibt das Maximum der 'Abstaende' des Punktes punkt zu den Punkten aus P
zurueck, dabei wird die Metrik m benutzt
"""
maxi = 0
for p in P:
dist = m(p,punkt)
if dist > maxi:
maxi = dist
return maxi
def schwerpunkt(P):
sx = 0
sy = 0
for p in P:
sx = sx + p[0]
sy = sy + p[1]
n = len(P)
xs = sx/n
ys = sy/n
return (xs,ys)
import random
diff = 0.01
(x,y) = schwerpunkt(P)
w = wert((x,y),P,d1)
for i in range(20000):
dx = 2*diff*random.random()-diff
dy = 2*diff*random.random()-diff
xneu = x + dx
yneu = y + dy
wneu = wert((xneu,yneu),P,d1)
if wneu < w:
(x,y) = (xneu,yneu)
w = wneu
# print((x,y),w)
print((x,y),w)
ohne 'See', minimaler Gesamtabstand
# Punkte
P = [(2,3),(7,1),(5,8)]
import math
# Bewertungsfunktion
def wert(punkt,P):
x = punkt[0]
y = punkt[1]
s = 0
for p in P:
s = s + math.sqrt((x-p[0])**2+(y-p[1])**2)
return s
def schwerpunkt(P):
sx = 0
sy = 0
for p in P:
sx = sx + p[0]
sy = sy + p[1]
n = len(P)
xs = sx/n
ys = sy/n
return (xs,ys)
import random
d = 0.01
(x,y) = schwerpunkt(P)
w = wert((x,y),P)
for i in range(10000):
dx = 2*d*random.random()-d
dy = 2*d*random.random()-d
xneu = x + dx
yneu = y + dy
wneu = wert((xneu,yneu),P)
if wneu < w:
(x,y) = (xneu,yneu)
w = wneu
# print((x,y),w)
print((x,y),w)
mit 'See'
# Punkte
P = [(2,3),(7,1),(5,8)]
# 'See'
S = [(4,3),(5,3),(5,4),(4,4)]
import math
# Bewertungsfunktion
def wert(punkt,P):
"""
wert gibt die Summe der Entfernungen der Punkte aus P (Liste von 2-Tupeln
von floats) zu dem Punkt punkt (2-Tupel von float) zurueck
"""
x = punkt[0]
y = punkt[1]
s = 0
for p in P:
s = s + math.sqrt((x-p[0])**2+(y-p[1])**2)
return s
def schwerpunkt(P):
"""
gibt den Schwerpunkt (2-Tupel von floats) der Punkte aus P
(Liste von 2-Tupeln von floats) zurueck
"""
sx = 0
sy = 0
for p in P:
sx = sx + p[0]
sy = sy + p[1]
n = len(P)
xs = sx/n
ys = sy/n
return (xs,ys)
def ccw(p0,p1,p2):
"""
Die Funktion ccw (counterclockwise) gibt für drei Punkte P0, P1 und P2 an,
ob sie in dieser Reihenfolge im Gegenuhrzeigersinn (linksherum, ccw = +1)
oder im Uhrzeigersinn (rechtsherum, ccw= - 1)durchlaufen werden.
ccw = 0 bedeutet, dass P2 auf der Strecke [P0,P2] (einschließlich P0,P1)
liegt.
Der Algorithmus ist aus Robert Sedgewick, Algorithmen, Kapitel 24 entnommen.
"""
dx1 = p1[0] - p0[0]
dy1 = p1[1] - p0[1]
dx2 = p2[0] - p0[0]
dy2 = p2[1] - p0[1]
if dx1*dy2 > dy1*dx2:
return +1
elif dx1*dy2 < dy1*dx2:
return -1
else:
if (dx1*dx2 < 0) or (dy1*dy2 < 0):
return -1
else:
if (dx1*dx1 + dy1*dy1) >= (dx2*dx2 + dy2*dy2):
return 0
else:
return +1
def inside(punkt,P):
"""
gibt genau dann True zurueck, wenn der Punkt punkt in dem
durch P beschriebenenen konvexen Polygon liegt.
"""
n = len(P)
innen = True
i = 0
while (i < n-1) and innen:
innen = (ccw(P[i],P[i+1],punkt) == +1)
i = i + 1
if innen:
innen = (ccw(P[n-1],P[0],punkt) == +1)
return innen
import random
d = 0.01
(x,y) = (0,0)
w = wert((x,y),P)
for i in range(10000):
dx = 2*d*random.random()-d
dy = 2*d*random.random()-d
xneu = x + dx
yneu = y + dy
while inside((xneu,yneu),S):
dx = 2*d*random.random()-d
dy = 2*d*random.random()-d
xneu = x + dx
yneu = y + dy
wneu = wert((xneu,yneu),P)
if wneu < w:
(x,y) = (xneu,yneu)
w = wneu
print((x,y),w)
print((x,y),w)
Links
Python: standort3.py ...