Sovellus: Kolmion merkilliset pisteet

91 days ago by Lauri_Ruotsalainen

Lauri Ruotsalainen, 2011
Sage-ohjelmisto matematiikan opetuksessa
 

Kolmion merkilliset pisteet

Vuorovaikutteiset ohjelmat soveltuvat hyvin kolmion trigonometristen ominaisuuksien ja niiden välisten riippuvuussuhteiden tarkasteluun. Kirjoitetaan ohjelma, jossa tarkastelun kohteena ovat kolmion merkilliset pisteet. Näillä tarkoitetaan pisteitä, joissa kolmion kulmanpuolittajat, sivujen keskinormaalit, korkeusjanat ja keskijanat leikkaavat. Piirretään myös suora, joka kulkee edellä mainittujen pisteiden kautta kulmanpuolittajien leikkauspistettä lukuun ottamatta, eli niin sanottu Eulerin suora. Lisäksi piirretään kolmion sisälle suurin mahdollinen ympyrä. Sen keskipiste on sama kuin kulmanpuolittajien leikkauspiste.

Sovellusta on mahdollista muokata esimerkiksi siten, että kolmion kulmapisteiden koordinaatit xy[i] syötetään ohjelmalle suoraan sen sijaan, että kulmapisteet määräytyvät yksikköympyrän kehältä astelukujen perusteella.

Kuvia:


 

# 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