# Sovellus: Kolmion merkilliset pisteet
# Lauri Ruotsalainen, 2011
xy = [0]*3
# Palauttaa kulman <A[a],A[c],A[b] puolittajasuoran ja yksikköympyrän leikkauspisteen. Kulmat annetaan radiaaneissa.
def puol(A, a, b, c):
if (A[a] < A[b] and (A[c] < A[a] or A[c] > A[b])) or (A[a] > A[b] and (A[c] > A[a] or A[c] < A[b])):
p = A[a] + (A[b]-A[a])/2.0
else:
p = A[b] + (2*pi-(A[b]-A[a]))/2.0
return (cos(p), sin(p))
# Palauttaa pisteiden välisen etäisyyden.
def etaisyys((x1,y1), (x2,y2)):
return sqrt((x2-x1)^2 + (y2-y1)^2)
# Palauttaa kahden pisteen kautta kulkevan suoran yhtälön GraphicPrimitive-objektin.
def suora((x1,y1), (x2,y2), vari=None, koko=1):
return plot((y2-y1)/(x2-x1)*(x-x1)+y1, x, rgbcolor=vari, thickness=koko)
@interact
def merkilliset(a0 = slider(0,360,1,30,label="A"),
a1 = slider(0,360,1,180,label="B"),
a2 = slider(0,360,1,300,label="C"),
nayta_keskijanat = checkbox(False, label="Keskijana"),
nayta_keskinormaalit = checkbox(False, label="Keskinormaalit"),
nayta_korkeusjanat = checkbox(False, label="Korkeusjanat"),
nayta_kulmanpuolittajat = checkbox(False, label="Kulmanpuolittajat"),
nayta_sisaympyra = checkbox(False, label="Sisäympyrä "),
nayta_euler = checkbox(False, label="Eulerin suora ")):
# Kulmien koordinaatit.
a = [math.radians(a0), math.radians(a1), math.radians(a2)]
for i in range(3):
xy[i] = (cos(a[i]), sin(a[i]))
# Kulmien tunnukset.
a_tunnus = text("A", (xy[0][0]*1.07, xy[0][1]*1.07))
b_tunnus = text("B", (xy[1][0]*1.07, xy[1][1]*1.07))
c_tunnus = text("C", (xy[2][0]*1.07, xy[2][1]*1.07))
tunnukset = a_tunnus + b_tunnus + c_tunnus
# Yksikköympyrä.
ympyra = circle((0,0), 1, aspect_ratio=1)
# Kolmio.
kolmio = line([xy[0], xy[1], xy[2], xy[0]], rgbcolor="black")
kolmio_pisteet = point(xy, pointsize=30)
# Kolmion kulmia (a,b,c) vastaavien sivujen pituudet (bc, ca, ab).
al = [etaisyys(xy[1], xy[2]), etaisyys(xy[2], xy[0]), etaisyys(xy[0], xy[1])]
# Kolmion kulmia (a,b,c) vastaavien sivujen keskipisteet.
a_kesk = [((xy[1][0]+xy[2][0])/2.0, (xy[1][1]+xy[2][1])/2.0), ((xy[2][0]+xy[0][0])/2.0,(xy[2][1]+xy[0][1])/2.0), ((xy[0][0]+xy[1][0])/2.0,(xy[0][1]+xy[1][1])/2.0)]
# Kolmion sisälle piirretyn ympyrän keskipiste.
piiri = al[0] + al[1] + al[2]
sisa_keskipiste = ((al[0]*xy[0][0]+al[1]*xy[1][0]+al[2]*xy[2][0])/piiri, (al[0]*xy[0][1]+al[1]*xy[1][1]+al[2]*xy[2][1])/piiri)
# Kolmion sisälle piirretty ympyrä.
if nayta_sisaympyra:
s = piiri/2.0
sisa_sade = sqrt((s-al[0])*(s-al[1])*(s-al[2])/s)
sisa_ympyra = circle(sisa_keskipiste, sisa_sade)
else:
sisa_ympyra = Graphics()
# Kulmanpuolittajat.
if nayta_kulmanpuolittajat:
a_kp = line([xy[0],puol(a,1,2,0)], rgbcolor="blue")
b_kp = line([xy[1],puol(a,2,0,1)], rgbcolor="blue")
c_kp = line([xy[2],puol(a,0,1,2)], rgbcolor="blue")
kp_piste = point(sisa_keskipiste, rgbcolor="blue", pointsize=28)
kulmanpuolittajat = a_kp + b_kp + c_kp + kp_piste
else:
kulmanpuolittajat = Graphics()
# Keskijanat.
if nayta_keskijanat:
a_kj = line([xy[0], a_kesk[0]], rgbcolor="green")
b_kj = line([xy[1], a_kesk[1]], rgbcolor="green")
c_kj = line([xy[2], a_kesk[2]], rgbcolor="green")
kj_piste = point(((xy[0][0]+xy[1][0]+xy[2][0])/3.0, (xy[0][1]+xy[1][1]+xy[2][1])/3.0), rgbcolor="green", pointsize=28)
keskijanat = a_kj + b_kj + c_kj + kj_piste
else:
keskijanat = Graphics()
# Keskinormaalit.
if nayta_keskinormaalit:
a_kn = suora(a_kesk[0], puol(a, 1, 2, 0), "red")
b_kn = suora(a_kesk[1], puol(a, 2, 0, 1), "red")
c_kn = suora(a_kesk[2], puol(a, 0, 1, 2), "red")
kn_piste = point((0,0), rgbcolor="red", pointsize=28)
keskinormaalit = a_kn + b_kn + c_kn + kn_piste
else:
keskinormaalit = Graphics()
# Korkeusjanat.
if nayta_korkeusjanat:
xA = xy[0][0]; xB=xy[1][0]; xC=xy[2][0]
yA = xy[0][1]; yB=xy[1][1]; yC=xy[2][1]
a_koj = plot(((xC-xB)*x+(xB-xC)*xA)/(yB-yC)+yA, x, rgbcolor="brown")
b_koj = plot(((xA-xC)*x+(xC-xA)*xB)/(yC-yA)+yB, x, rgbcolor="brown")
c_koj = plot(((xB-xA)*x+(xA-xB)*xC)/(yA-yB)+yC, x, rgbcolor="brown")
koj_lx = (xA*xB*(yA-yB) + xB*xC*(yB - yC) + xC*xA*(yC-yA) - (yA-yB)*(yB-yC)*(yC-yA))/(xC*yB - xB*yC + xA*yC - xC*yA + xB*yA - xA*yB)
koj_ly = (yA*yB*(xA-xB) + yB*yC*(xB-xC) + yC*yA*(xC-xA) - (xA-xB)*(xB-xC)*(xC-xA))/(yC*xB - yB*xC + yA*xC - yC*xA + yB*xA - yA*xB)
koj_leikkauspiste = point((koj_lx,koj_ly), rgbcolor="brown", pointsize=28)
korkeusjanat = a_koj + b_koj + c_koj + koj_leikkauspiste
else:
korkeusjanat = Graphics()
# Eulerin suora.
if nayta_euler:
euler_suora = suora((0,0), ((xy[0][0]+xy[1][0]+xy[2][0])/3.0, (xy[0][1]+xy[1][1]+xy[2][1])/3.0), "purple", 2)
else:
euler_suora = Graphics()
# Yhdistetään ja esitetään kaikki piirretyt kuvaajat.
show(ympyra + kolmio + kolmio_pisteet + tunnukset + kulmanpuolittajat + keskijanat + keskinormaalit + korkeusjanat + sisa_ympyra + euler_suora, figsize=[5,5], xmin=-1, xmax=1, ymin=-1, ymax=1)
|
|
Click to the left again to hide and once more to show the dynamic interactive window
|