# Podle knihy PLOCHY 2. STUPNE, Pavel Pech zpracoval Marek Dvoroznak # Verze 1.0 # Priklady z knihy PLOCHY 2. STUPNE, Pavel Pech, strana 54, cviceni 3 # a - stredova regularni - dvojdilny hyperboloid # b - nestredova regularni - elipticky paraboloid # c - nestredova singularni - parabolicka valcova plocha # d - nestredova singularni - primka # e - stredova regularni - trojosy elipsoid # f - stredova singularni - kuzelova plocha # g - nestredova regularni - hyperbolicky paraboloid # h - stredova regularni - trojosy elipsoid # i - nestredova singularni - dve rovnobezne roviny # j - nestredova singularni - elipticka valcova plocha # k - nestredova singularni - hyperbolicka valcova plocha # l - stredova regularni - imaginarni elipsoid # m - nestredova singularni - valcova plocha # n - nestredova singularni - dvojnasobna rovina # o - nestredova singularni - hyperbolicka valcova plocha # p - stredova regularni - rotacni dvojdilny hyperboloid # q - nestredova regularni - hyperbolicky paraboloid # r - stredova singularni - kuzelova plocha # s - nestredova regularni - elipticky paraboloid # Dalsi priklady # t - stredova regularni - zplostely rotacni elipsoid # u - nestredova singularni - dve ruznobezne roviny # v - stredova regularni - kulova plocha # w - nestredova singularni - imaginarni rovnobezne roviny # x - stredova regularni - jednodilny hyperboloid # y - stredova singularni - bod (imaginarni kuzelova plocha) # z - nestredova singularni - imaginarni elipticka valcova plocha # 1 - stredova regularni - jednodilny hyperboloid restart; with(linalg): with(Maplets[Elements]): with(MathML): with(XMLTools): with(plots): defaultSize:=5: presnost:=3: kvalita1:=10: # hlavni roviny kvalita2:=25: # ostatni zapnoutNumerickeVypocty:=0: # ZACATEK POMOCNYCH PROCEDUR extrakceKoeficientu:=proc(rceKvadriky) global a11,a22,a33,a12,a13,a23,a14,a24,a34,a44; local koeficient, i, rce; rce:=rceKvadriky; # zkusime, zda je zadana rovnice a zareagujeme na to if type(rceKvadriky, `equation`) = true then rce:=lhs(rce)-rhs(rce); end if; a11:=coeff(rce,x,2); a22:=coeff(rce,y,2); a33:=coeff(rce,z,2); a12:=coeff(coeff(rce,x),y)/2; a13:=coeff(coeff(rce,x),z)/2; a23:=coeff(coeff(rce,y),z)/2; a14:=coeff(coeff(coeff(rce,x),y,0),z,0)/2; a24:=coeff(coeff(coeff(rce,y),x,0),z,0)/2; a34:=coeff(coeff(coeff(rce,z),x,0),y,0)/2; a44:=rce-(a11*x^2+a22*y^2+a33*z^2+2*a12*x*y+2*a13*x*z+2*a23*y*z+2*a14*x+2*a24*y+2*a34*z); if evalf(a11) = 0 and evalf(a12) = 0 and evalf(a13) = 0 and evalf(a22) = 0 and evalf(a23) = 0 and evalf(a33) = 0 then # chyba - alespon jeden z techto koeficientu se nesmi rovnat nule error "COEFNULL"; end if; for i in [a11, a22, a33, a12, a13, a23, a14, a24, a34, a44] do if type(evalf(i),realcons) = false then error "COEFNOTREAL"; end if; end do; end proc: znamenko:=proc(cislo, zacatek) if signum(cislo) = -1 then return "-"; elif zacatek = false then return "+"; end if; end proc: dalsiKrok:=proc() global aktualniKrok; local rce; try rce:=Maplets:-Tools:-Get('rceKvadriky'('value')); if StringTools[Trim](rce) = "" then error "NOEQ"; end if; Maplets:-Tools:-Set('btnMain'('enabled') = 'false'); Maplets:-Tools:-Set('rceKvadriky'('value') = expand(parse(rce))); reinit(parse(Maplets:-Tools:-Get('rceKvadriky'('value')))); Maplets:-Tools:-Set('btnNew'('enabled') = 'true'); Maplets:-Tools:-Set('btnMain'('caption') = "Dalsi krok"); Maplets:-Tools:-Set('btnChoose'('enabled') = 'false'); Maplets:-Tools:-Set('ChB1'('enabled') = 'true'); Maplets:-Tools:-Set('ChB2'('enabled') = 'true'); Maplets:-Tools:-Set('ChB3'('enabled') = 'true'); Maplets:-Tools:-Set('ChB4'('enabled') = 'true'); Maplets:-Tools:-Set('ChB5'('enabled') = 'true'); Maplets:-Tools:-Set('zoom'('visible') = 'true'); Maplets:-Tools:-Set('rceKvadriky'('editable') = 'false'); Maplets:-Tools:-Set('MMLViewer'('value') = postup(aktualniKrok)); Maplets:-Tools:-Set('btnMain'('enabled') = 'true'); if (aktualniKrok >= 17) then Maplets:-Tools:-Set('btnMain'('enabled') = 'false'); else aktualniKrok:=aktualniKrok+1; end if; catch "COEFNULL": Maplets:-Tools:-Set('btnMain'('enabled') = 'true'); error "Alespon jeden z koeficientu a11, a12, a13, a22, a23, a33 zadane rovnice musi byt nenulovy."; catch "COEFNOTREAL": Maplets:-Tools:-Set('btnMain'('enabled') = 'true'); error "Zadana rovnice musi byt ve tvaru a11*x^2+a22*y^2+a33*z^2+2*a12*x*y+2*a13*x*z+2*a23*y*z+2*a14*x+2*a24*y+2*a34*z+a44=0 a koeficienty zadane rovnice musi byt realne."; catch "NOEQ": Maplets:-Tools:-Set('btnMain'('enabled') = 'true'); error "Nejdrive zadejte obecnou rovnici kvadriky."; catch : Maplets:-Tools:-Set('btnMain'('enabled') = 'true'); error lasterror; end try; end proc: getReference:=proc(nazev) global reference; local i, j; j:=0; for i in reference do j:=j+1; if i = nazev then return j; end if; end do; end proc: setReference:=proc(nazev) global reference; reference:=[op(reference), nazev]; return nops(reference); end proc: # KONEC POMOCNYCH PROCEDUR # ZACATEK PROCEDUR PRO DEFINICI MATHML VYPISU definiceMMLVypisu:=proc() global a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43, a44, delta, charRce, rozepsanaCharRce, hlavniRovina1, hlavniRovina2, hlavniRovina3, deltaMML, A44MML, charRceMML, rozepsanaCharRceMML, rozlozenaCharRceMML, reseniCharRceMML, vlastniVektorySoustavaMML, uMML, lambdaPodminkyMML, nestredovaRegularniNeupravenyKanonickyTvarMML, e2MML, e3MML, GMML, FMML, delkyPoloosMML, stredovaNeupravenyKanonickyTvarMML, neupravenyKanonickyTvarDosazenoMML, deltaA44MML, minusNeupravenyKanonickyTvarDosazenoMML, kanonickaRceMML, stredSoustavaMML, NMML, nestredovaNeupravenyKanonickyTvar1MML, nestredovaNeupravenyKanonickyTvar2MML, nestredovaNeupravenyKanonickyTvar3MML, nestredovaNeupravenyKanonickyTvar4MML, osaStreduKvadrikyMML, rovinaStreduKvadrikyMML, bodMMML, SMML, vztahProZiskaniHlavnichRovinMML, vztahProZiskaniHlavnichRovinDosazenoMML, hlavniRovina1MML, hlavniRovina2MML, hlavniRovina3MML, osaMML, VMML, rezRovKMML, rezRovKvRMML, rezRovK2MML; local stredeqns, osa, K_, delta_, A44_, rozepsanaCharRce_, lambda1_, lambda2_, lambda3_, r1_, r2_, r3_, bodyOsy_, bodyRoviny_, puvodniNeupravenaKanonickaRce_, neupravenaKanonickaRce_, e2_, e3_, F_, G_, S_, V_, M_, N_, kanonickaRce_, a_, b_, c_, hlavniRovina1_, hlavniRovina2_, hlavniRovina3_; if zapnoutNumerickeVypocty = 1 then Digits:=presnost; K_:=evalf(evalm(K));delta_:=evalf(delta);A44_:=evalf(A44); rozepsanaCharRce_:=evalf(rozepsanaCharRce); lambda1_:=evalf(lambda1);lambda2_:=evalf(lambda2);lambda3_:=evalf(lambda3); r1_:=evalf(r1);r2_:=evalf(r2);r3_:=evalf(r3); bodyOsy_:=evalf(bodyOsy);bodyRoviny_:=evalf(bodyRoviny); puvodniNeupravenaKanonickaRce_:=evalf(puvodniNeupravenaKanonickaRce); neupravenaKanonickaRce_:=evalf(neupravenaKanonickaRce); e2_:=evalf(evalm(e2));e3_:=evalf(evalm(e3));F_:=evalf(F);G_:=evalf(G);S_:=evalf(S);V_:=evalf(V);M_:=evalf(M);N_:=evalf(N); kanonickaRce_:=evalf(kanonickaRce);a_:=evalf(a);b_:=evalf(b);c_:=evalf(c); hlavniRovina1_:=evalf(hlavniRovina1);hlavniRovina2_:=evalf(hlavniRovina2);hlavniRovina3_:=evalf(hlavniRovina3); vlastniVektorySoustavaMML:=proc(lambda) Digits:=presnost; return cat("<mtable columnalign='right'><mtr><mtd>", PrintToString(FirstChild(ParseString(ExportPresentation(evalf(r1(lambda)))))), "</mtd></mtr><mtr><mtd>", PrintToString(FirstChild(ParseString(ExportPresentation(evalf(r2(lambda)))))), "</mtd></mtr><mtr><mtd>", PrintToString(FirstChild(ParseString(ExportPresentation(evalf(r3(lambda)))))), "</mtd></mtr></mtable>"); end proc; vztahProZiskaniHlavnichRovinDosazenoMML:=proc(u) Digits:=presnost; return cat(PrintToString(FirstChild(ParseString(ExportPresentation(matrix(1,4,[evalf(u[1]),evalf(u[2]),evalf(u[3]),0])*`K`*matrix(4,1,[x,y,z,1])=0))))); end proc; uMML:=proc(vektor, cislo) Digits:=presnost; return cat("<msub><mi>u</mi><mrow><mn>", cislo,"</mn></mrow></msub><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(evalf(vektor)))))); end proc; rezRovKMML:=proc(cislo) Digits:=presnost; return cat("<mfenced open='|' close='|' separators=','><mrow><mi>k</mi></mrow></mfenced><mo>&gt;</mo>",PrintToString(FirstChild(ParseString(ExportPresentation(evalf(cislo)))))); end proc; rezRovK2MML:=proc(cislo,operator) Digits:=presnost; return cat("<mi>k</mi><mo>", operator,"</mo>",PrintToString(FirstChild(ParseString(ExportPresentation(evalf(cislo)))))); end proc; osa:=proc(c1,c2) Digits:=presnost; return eval([x,y,z],evalf(solve({eval(cat(`hlavniRovina`,c1)),eval(cat(`hlavniRovina`,c2))},{x,y,z}))); end proc; else K_:=evalm(K);delta_:=delta;A44_:=A44; rozepsanaCharRce_:=rozepsanaCharRce; lambda1_:=lambda1;lambda2_:=lambda2;lambda3_:=lambda3; r1_:=r1;r2_:=r2;r3_:=r3; bodyOsy_:=bodyOsy;bodyRoviny_:=bodyRoviny; puvodniNeupravenaKanonickaRce_:=puvodniNeupravenaKanonickaRce; neupravenaKanonickaRce_:=neupravenaKanonickaRce; e2_:=e2;e3_:=e3;F_:=F;G_:=G;S_:=S;V_:=V;M_:=M;N_:=N; kanonickaRce_:=kanonickaRce;a_:=a;b_:=b;c_:=c; hlavniRovina1_:=hlavniRovina1;hlavniRovina2_:=hlavniRovina2;hlavniRovina3_:=hlavniRovina3; vlastniVektorySoustavaMML:=lambda->cat("<mtable columnalign='right'><mtr><mtd>", PrintToString(FirstChild(ParseString(ExportPresentation(r1(lambda))))), "</mtd></mtr><mtr><mtd>", PrintToString(FirstChild(ParseString(ExportPresentation(r2(lambda))))), "</mtd></mtr><mtr><mtd>", PrintToString(FirstChild(ParseString(ExportPresentation(r3(lambda))))), "</mtd></mtr></mtable>"); vztahProZiskaniHlavnichRovinDosazenoMML:=u->cat(PrintToString(FirstChild(ParseString(ExportPresentation(matrix(1,4,[u[1],u[2],u[3],0])*`K`*matrix(4,1,[x,y,z,1])=0))))); uMML:=(vektor, cislo)->cat("<msub><mi>u</mi><mrow><mn>", cislo,"</mn></mrow></msub><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(vektor))))); rezRovKMML:=cislo->cat("<mfenced open='|' close='|' separators=','><mrow><mi>k</mi></mrow></mfenced><mo>&gt;</mo>",PrintToString(FirstChild(ParseString(ExportPresentation(cislo))))); rezRovK2MML:=(cislo,operator)->cat("<mi>k</mi><mo>", operator,"</mo>",PrintToString(FirstChild(ParseString(ExportPresentation(cislo))))); osa:=(c1,c2)->eval([x,y,z],solve({eval(cat(`hlavniRovina`,c1)),eval(cat(`hlavniRovina`,c2))},{x,y,z})); end if; deltaMML:=cat("<mo>&Delta;</mo><mo>=</mo><mo>|</mo>", PrintToString(FirstChild(FirstChild(ParseString(ExportPresentation(evalm(K_)))))), "<mo>|</mo><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(delta_))))); A44MML:=cat("<msub><mi>A</mi><mrow><mn>4</mn><mn>4</mn></mrow></msub><mo>=</mo><mo>|</mo>", PrintToString(FirstChild(FirstChild(ParseString(ExportPresentation(evalm(submatrix(K_,1..3,1..3))))))), "<mo>|</mo><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(A44_))))); charRceMML:=cat("<mo>|</mo>", PrintToString(FirstChild(FirstChild(ParseString(ExportPresentation(evalm(submatrix(K_,1..3,1..3)-lambda)))))), "<mo>|</mo><mo>=</mo><mi>0</mi>"); rozepsanaCharRceMML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(rozepsanaCharRce_)))), "<mo>=</mo><mi>0</mi>"); rozlozenaCharRceMML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(factor(rozepsanaCharRce_))))), "<mo>=</mo><mi>0</mi>"); reseniCharRceMML:=cat("<msub><mi>&lambda;</mi><mrow><mn>1</mn></mrow></msub><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(lambda1_)))), "<mo>,</mo><mspace width='0.5em' />", "<msub><mi>&lambda;</mi><mrow><mn>2</mn></mrow></msub><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(lambda2_)))), "<mo>,</mo><mspace width='0.5em' />", "<msub><mi>&lambda;</mi><mrow><mn>3</mn></mrow></msub><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(lambda3_))))); stredeqns:=geneqns(submatrix(K_,1..3,1..3),[x,y,z],evalm(-1*subvector(K_,1..3,4))); if nops(stredeqns) > 0 then stredSoustavaMML:=cat("<mtable columnalign='right'><mtr><mtd>", PrintToString(FirstChild(ParseString(ExportPresentation(stredeqns[1])))), "</mtd></mtr>"); if nops(stredeqns) > 1 then stredSoustavaMML:=cat(stredSoustavaMML, "<mtr><mtd>", PrintToString(FirstChild(ParseString(ExportPresentation(stredeqns[2])))), "</mtd></mtr>"); end if; if nops(stredeqns) = 3 then stredSoustavaMML:=cat(stredSoustavaMML, "<mtr><mtd>", PrintToString(FirstChild(ParseString(ExportPresentation(stredeqns[3])))), "</mtd></mtr>"); end if; stredSoustavaMML:=cat(stredSoustavaMML, "</mtable>"); end if; if (nops(bodyOsy) > 0) then osaStreduKvadrikyMML:=cat("<mtable columnalign='left'><mtr><mtd><mi>x</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(bodyOsy_[1])))), "</mtd></mtr>", "<mtr><mtd><mi>y</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(bodyOsy_[2])))), "</mtd></mtr>", "<mtr><mtd><mi>z</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(bodyOsy_[3])))), "</mtd></mtr></mtable>"); end if; if (nops(bodyRoviny) > 0) then rovinaStreduKvadrikyMML:=cat("<mtable columnalign='left'><mtr><mtd><mi>x</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(bodyRoviny_[1])))), "</mtd></mtr>", "<mtr><mtd><mi>y</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(bodyRoviny_[2])))), "</mtd></mtr>", "<mtr><mtd><mi>z</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(bodyRoviny_[3])))), "</mtd></mtr></mtable>"); end if; lambdaPodminkyMML:=(o1,o2,o3)->cat("<msub><mi>&lambda;</mi><mrow><mn>1</mn></mrow></msub><mo>", o1,"</mo><mi>0</mi><mo>,</mo><mspace width='0.5em' />", "<msub><mi>&lambda;</mi><mrow><mn>2</mn></mrow></msub><mo>", o2,"</mo><mi>0</mi><mo>,</mo><mspace width='0.5em' />", "<msub><mi>&lambda;</mi><mrow><mn>3</mn></mrow></msub><mo>", o3,"</mo><mi>0</mi>"); # nestredovaRegularniNeupravenyKanonickyTvarMML:="<msub><mi>&lambda;</mi><mrow><mn>1</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><msub><mi>&lambda;</mi><mrow><mn>2</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>y</mi><mn>2</mn></msup><mo>+</mo><mn>2</mn><mo>&InvisibleTimes;</mo><mi>G</mi><mo>&InvisibleTimes;</mo><mi>z</mi><mo>+</mo><mi>N</mi><mo>=</mo><mn>0</mn>"; nestredovaNeupravenyKanonickyTvar1MML:="<msub><mi>&lambda;</mi><mrow><mn>1</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><msub><mi>&lambda;</mi><mrow><mn>2</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>y</mi><mn>2</mn></msup><mo>+</mo><mn>2</mn><mo>&InvisibleTimes;</mo><mi>G</mi><mo>&InvisibleTimes;</mo><mi>z</mi><mo>=</mo><mn>0</mn>"; nestredovaNeupravenyKanonickyTvar2MML:="<msub><mi>&lambda;</mi><mrow><mn>1</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><msub><mi>&lambda;</mi><mrow><mn>2</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>y</mi><mn>2</mn></msup><mo>+</mo><mi>N</mi><mo>=</mo><mn>0</mn>"; nestredovaNeupravenyKanonickyTvar4MML:="<msub><mi>&lambda;</mi><mrow><mn>1</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mn>2</mn><mo>&InvisibleTimes;</mo><mi>G</mi><mo>&InvisibleTimes;</mo><mi>z</mi><mo>+</mo><mn>2</mn><mo>&InvisibleTimes;</mo><mi>F</mi><mo>&InvisibleTimes;</mo><mi>y</mi><mo>=</mo><mn>0</mn>"; nestredovaNeupravenyKanonickyTvar3MML:="<msub><mi>&lambda;</mi><mrow><mn>1</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mi>N</mi><mo>=</mo><mn>0</mn>"; neupravenyKanonickyTvarDosazenoMML:=PrintToString(FirstChild(ParseString(ExportPresentation(lhs(puvodniNeupravenaKanonickaRce_)-rhs(puvodniNeupravenaKanonickaRce_)=0)))); minusNeupravenyKanonickyTvarDosazenoMML:=PrintToString(FirstChild(ParseString(ExportPresentation(lhs(neupravenaKanonickaRce_)-rhs(neupravenaKanonickaRce_)=0)))); stredovaNeupravenyKanonickyTvarMML:="<msub><mi>&lambda;</mi><mrow><mn>1</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><msub><mi>&lambda;</mi><mrow><mn>2</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>y</mi><mn>2</mn></msup><mo>+</mo><msub><mi>&lambda;</mi><mrow><mn>3</mn></mrow></msub><mo>&InvisibleTimes;</mo><msup><mi>z</mi><mn>2</mn></msup><mo>+</mo><mfrac><mrow><mi>&Delta;</mi></mrow><mrow><msub><mi>A</mi><mrow><mn>4</mn><mn>4</mn></mrow></msub></mrow></mfrac><mo>=</mo><mn>0</mn>"; if (A44 <> 0) then deltaA44MML:=cat("<mfrac><mrow><mi>&Delta;</mi></mrow><mrow><msub><mi>A</mi><mrow><mn>4</mn><mn>4</mn></mrow></msub></mrow></mfrac><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(delta_/A44_))))); end if; e2MML:=cat("<msub><mi>e</mi><mrow><mn>2</mn></mrow></msub><mo>=</mo><mfrac><mrow><msub><mi>u</mi><mrow><mn>2</mn></mrow></msub></mrow><mrow><mo>|</mo><msub><mi>u</mi><mrow><mn>2</mn></mrow></msub><mo>|</mo></mrow></mfrac><mo>=</mo><mo>[</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(e2_[1])))), "<mo>,</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(e2_[2])))), "<mo>,</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(e2_[3])))), "<mo>]</mo>"); e3MML:=cat("<msub><mi>e</mi><mrow><mn>3</mn></mrow></msub><mo>=</mo><mfrac><mrow><msub><mi>u</mi><mrow><mn>3</mn></mrow></msub></mrow><mrow><mo>|</mo><msub><mi>u</mi><mrow><mn>3</mn></mrow></msub><mo>|</mo></mrow></mfrac><mo>=</mo><mo>[</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(e3_[1])))), "<mo>,</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(e3_[2])))), "<mo>,</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(e3_[3])))), "<mo>]</mo>"); FMML:=cat("<mi>F</mi><mo>=</mo><msub><mi>a</mi><mrow><mn>1</mn><mn>4</mn></mrow></msub><mo>&InvisibleTimes;</mo><msub><msub><mi>e</mi><mrow><mn>2</mn></mrow></msub><mrow><mn>1</mn></mrow></msub><mo>+</mo><msub><mi>a</mi><mrow><mn>2</mn><mn>4</mn></mrow></msub><mo>&InvisibleTimes;</mo><msub><msub><mi>e</mi><mrow><mn>2</mn></mrow></msub><mrow><mn>2</mn></mrow></msub><mo>+</mo><msub><mi>a</mi><mrow><mn>3</mn><mn>4</mn></mrow></msub><mo>&InvisibleTimes;</mo><msub><msub><mi>e</mi><mrow><mn>2</mn></mrow></msub><mrow><mn>3</mn></mrow></msub><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(F_))))); GMML:=cat("<mi>G</mi><mo>=</mo><msub><mi>a</mi><mrow><mn>1</mn><mn>4</mn></mrow></msub><mo>&InvisibleTimes;</mo><msub><msub><mi>e</mi><mrow><mn>3</mn></mrow></msub><mrow><mn>1</mn></mrow></msub><mo>+</mo><msub><mi>a</mi><mrow><mn>2</mn><mn>4</mn></mrow></msub><mo>&InvisibleTimes;</mo><msub><msub><mi>e</mi><mrow><mn>3</mn></mrow></msub><mrow><mn>2</mn></mrow></msub><mo>+</mo><msub><mi>a</mi><mrow><mn>3</mn><mn>4</mn></mrow></msub><mo>&InvisibleTimes;</mo><msub><msub><mi>e</mi><mrow><mn>3</mn></mrow></msub><mrow><mn>3</mn></mrow></msub><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(G_))))); SMML:=cat("<mi>S</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(S_))))); VMML:=cat("<mi>V</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(V_))))); bodMMML:=cat("<mi>M</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(M_))))); NMML:=cat("<mi>N</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(N_))))); kanonickaRceMML:=cat("<mo>", znamenko(coeff(lhs(kanonickaRce_),x,2), true),"</mo><mfrac><mrow><msup><mi>x</mi><mrow><mn>2</mn></mrow></msup></mrow><mrow>", PrintToString(FirstChild(ParseString(ExportPresentation(a_^2)))),"</mrow></mfrac>"); if evalf(lambda2) <> 0 then kanonickaRceMML:=cat(kanonickaRceMML, "<mo>", znamenko(coeff(lhs(kanonickaRce_),y,2), false),"</mo><mfrac><mrow><msup><mi>y</mi><mrow><mn>2</mn></mrow></msup></mrow><mrow>", PrintToString(FirstChild(ParseString(ExportPresentation(b_^2)))),"</mrow></mfrac>"); end if; if evalf(lambda3) <> 0 then kanonickaRceMML:=cat(kanonickaRceMML, "<mo>", znamenko(coeff(lhs(kanonickaRce_),z,2), false),"</mo><mfrac><mrow><msup><mi>z</mi><mrow><mn>2</mn></mrow></msup></mrow><mrow>", PrintToString(FirstChild(ParseString(ExportPresentation(c_^2)))),"</mrow></mfrac>"); end if; kanonickaRceMML:=cat(kanonickaRceMML, "<mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(rhs(kanonickaRce_)))))); # stredovaKanonickaRceMML:=cat("<mo>", znamenko(coeff(lhs(kanonickaRce),x,2), true),"</mo><mfrac><mrow><msup><mi>x</mi><mrow><mn>2</mn></mrow></msup></mrow><mrow>", PrintToString(FirstChild(ParseString(ExportPresentation(a^2)))),"</mrow></mfrac><mo>", znamenko(coeff(lhs(kanonickaRce),y,2), false),"</mo><mfrac><mrow><msup><mi>y</mi><mrow><mn>2</mn></mrow></msup></mrow><mrow>", PrintToString(FirstChild(ParseString(ExportPresentation(b^2)))),"</mrow></mfrac><mo>", znamenko(coeff(lhs(kanonickaRce),z,2), false),"</mo><mfrac><mrow><msup><mi>z</mi><mrow><mn>2</mn></mrow></msup></mrow><mrow>", PrintToString(FirstChild(ParseString(ExportPresentation(c^2)))),"</mrow></mfrac><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(rhs(kanonickaRce)))))); # stredovaRegularniKanonickaRceMML:=cat("<mfrac><mrow><msup><mi>x</mi><mrow><mn>2</mn></mrow></msup></mrow><mrow>", PrintToString(FirstChild(ParseString(ExportPresentation(a^2)))),"</mrow></mfrac><mo>+</mo><mfrac><mrow><msup><mi>y</mi><mrow><mn>2</mn></mrow></msup></mrow><mrow>", PrintToString(FirstChild(ParseString(ExportPresentation(b^2)))),"</mrow></mfrac><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(rhs(kanonickaRce)))))); delkyPoloosMML:=cat("<mtable columnalign='left'><mtr><mtd><msup><mi>a</mi><mrow><mn>2</mn></mrow></msup><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(a_^2)))), "<mo>&rArr;</mo><mi>a</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(a_))))); if zapnoutNumerickeVypocty = 0 then delkyPoloosMML:=cat(delkyPoloosMML, "<mo>&cong;</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(evalf[3](a)))))); end if; delkyPoloosMML:=cat(delkyPoloosMML, "</mtd></mtr>"); if evalf(lambda2) <> 0 then delkyPoloosMML:=cat(delkyPoloosMML, "<mtr><mtd><msup><mi>b</mi><mrow><mn>2</mn></mrow></msup><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(b_^2)))), "<mo>&rArr;</mo><mi>b</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(b_))))); if zapnoutNumerickeVypocty = 0 then delkyPoloosMML:=cat(delkyPoloosMML, "<mo>&cong;</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(evalf[3](b)))))); end if; delkyPoloosMML:=cat(delkyPoloosMML, "</mtd></mtr>"); end if; if evalf(lambda3) <> 0 then delkyPoloosMML:=cat(delkyPoloosMML, "<mtr><mtd><msup><mi>c</mi><mrow><mn>2</mn></mrow></msup><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(c_^2)))), "<mo>&rArr;</mo><mi>c</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(c_))))); if zapnoutNumerickeVypocty = 0 then delkyPoloosMML:=cat(delkyPoloosMML, "<mo>&cong;</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(evalf[3](c)))))); end if; delkyPoloosMML:=cat(delkyPoloosMML, "</mtd></mtr>"); end if; delkyPoloosMML:=cat(delkyPoloosMML, "</mtable>"); vztahProZiskaniHlavnichRovinMML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(matrix(1,4,[`v`[1],`v`[2],`v`[3],0])*`K`*matrix(4,1,[x,y,z,1])=0))))); if evalf(lambda1) <> 0 then hlavniRovina1MML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(hlavniRovina1_=0))))); end if; if evalf(lambda2) <> 0 then hlavniRovina2MML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(hlavniRovina2_=0))))); end if; if evalf(lambda3) <> 0 then hlavniRovina3MML:=cat(PrintToString(FirstChild(ParseString(ExportPresentation(hlavniRovina3_=0))))); end if; osaMML:=(c1,c2)->cat("<mtable columnalign='left'><mtr><mtd><mi>x</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(osa(c1,c2)[1])))), "</mtd></mtr>", "<mtr><mtd><mi>y</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(osa(c1,c2)[2])))), "</mtd></mtr>", "<mtr><mtd><mi>z</mi><mo>=</mo>", PrintToString(FirstChild(ParseString(ExportPresentation(osa(c1,c2)[3])))), "</mtd></mtr></mtable>"); rezRovKvRMML:="<mi>k</mi><mo>&isin;</mo><mi>&reals;</mi>"; end proc: cislovaniMML:=proc(cislo) return cat("<mfenced open='(' close=')' separators=','><mrow><mn>", cislo, "</mn></mrow></mfenced><mspace width='0.5em' />"); end proc: radekMML:=proc(mmltext) return cat("<mtr><mtd>", mmltext, "</mtd></mtr>"); end proc: celyMMLtext:="": postup:=proc(krok) global delta, A44, typKvadriky, lambda1, lambda2, lambda3, celyMMLtext, aktualniKrok, dosazenoVlastniVektor1, dosazenoVlastniVektor2, dosazenoVlastniVektor3; local text, cislovani, hlavicka, paticka, MMLtext, rovnice, rezRov1, rezRov2; hlavicka:="<math display='block' xmlns='http://www.w3.org/1998/Math/MathML'><mrow><mtable columnalign='left'>"; paticka:="</mtable></mrow></math>"; MMLtext:=""; if krok = 1 then text:=cat("Vypocteme diskriminant (", setReference("delta"),"). Vychazi nam cislo, ktere je "); if evalf(delta) <> 0 then text:=cat(text, "ruzne od nuly, jedna se tedy o regularni kvadriku."); else text:=cat(text, "rovno nule, jedna se tedy o singularni kvadriku."); end if; MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("delta")), deltaMML))); end if; if krok = 2 then text:=cat("Vypocteme determinant A44 (", setReference("A44"),"). Vychazi nam cislo, ktere je "); if evalf(A44) <> 0 then text:=cat(text, "ruzne od nuly, jedna se tedy o stredovou kvadriku."); else text:=cat(text, "rovno nule, jedna se tedy o nestredovou kvadriku."); end if; text:=cat(text, " Kvadrika bude tedy "); if typKvadriky = "Nestredova regularni" then text:=cat(text, "paraboloid"); end if; if typKvadriky = "Nestredova singularni" then text:=cat(text, "valcova plocha (elipticka, imaginarni elipticka, hyperbolicka, parabolicka), primka nebo dve ruznobezne roviny, dve rovnobezne roviny nebo dve imaginarni rovnobezne roviny nebo dvojnasobna rovina."); end if; if typKvadriky = "Stredova regularni" then text:=cat(text, "elipsoid nebo hyperboloid"); end if; if typKvadriky = "Stredova singularni" then text:=cat(text, "bod (imaginarni kuzelova plocha) nebo kuzelova plocha"); end if; text:=cat(text, "."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("A44")), A44MML))); end if; if krok = 3 then text:=cat("Urcime kanonickou rovnici a hlavni smery. Nejprve vypocitame koreny charakteristicke rovnice (", setReference("charRce"),"), ktera ma v rozepsanem stavu tvar (", setReference("charRceRozepsana"),")"); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("charRce")), charRceMML)), radekMML(cat(cislovaniMML(getReference("charRceRozepsana")), rozepsanaCharRceMML))); if rozepsanaCharRceMML <> rozlozenaCharRceMML then text:=cat(text, ", tj. (", setReference("charRceRozlozena"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("charRceRozlozena")), rozlozenaCharRceMML))); else text:=cat(text, "."); end if; end if; if krok = 4 then text:=cat("Rovnici (", getReference("charRceRozepsana"),") vyresime a dostaneme vlastni cisla (", setReference("reseniCharRce"),"). "); if typKvadriky = "Nestredova regularni" then if nazevKvadriky = "hyperbolicky paraboloid" then text:=cat(text, "Nenulova vlastni cisla maji ruzna znamenka, proto se jedna o hyperbolicky paraboloid."); else text:=cat(text, "Nenulova vlastni cisla maji stejna znamenka, proto se jedna o elipticky paraboloid."); end if; elif typKvadriky = "Stredova regularni" then if podtypKvadriky = "Elipticky typ" then text:=cat(text, "Vlastni cisla maji stejna znamenka, proto se jedna o kvadriku eliptickeho typu."); else text:=cat(text, "Vlastni cisla maji ruzna znamenka, proto se jedna o kvadriku hyperbolickeho typu."); end if; elif typKvadriky = "Stredova singularni" then if nazevKvadriky = "bod (imaginarni kuzelova plocha)" then text:=cat(text, "Vlastni cisla maji stejna znamenka, proto se jedna o bod, cili imaginarni kuzelovou plochu."); else text:=cat(text, "Vlastni cisla maji ruzna znamenka, proto se jedna o kuzelovou plochu."); end if; end if; MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("reseniCharRce")), reseniCharRceMML))); end if; if krok = 5 then text:="Nyni najdeme hlavni smery kvadriky. Tyto smery jsou urceny vlastnimi vektory, ktere jsou prirazene vlastnim cislum (", getReference("reseniCharRce"),"). Prvnimu vlastnimu cislu odpovida soustava (", setReference("vlastniVektorySoustava1"),"), jejiz resenim je "; MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vlastniVektorySoustava1")), vlastniVektorySoustavaMML(lambda1)))); if nops(dosazenoVlastniVektor1) = 3 and type(op(1,dosazenoVlastniVektor1), list) = true then # resenim je prostor text:=cat(text, "prostor vektoru. Z teto roviny vybereme, dosazenim za parametry, 3 vlastni vektory - (", setReference("u1"),"), (", setReference("u2"),") a (", setReference("u3"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u1")), uMML(u1, 1)))); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u2")), uMML(u2, 2)))); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u3")), uMML(u3, 3)))); elif nops(dosazenoVlastniVektor1) = 2 and type(op(1,dosazenoVlastniVektor1), list) = true then # resenim je rovina text:=cat(text, "rovina vektoru. Z teto roviny vybereme, dosazenim za parametry, 2 vlastni vektory - (", setReference("u1"),"), (", setReference("u2"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u1")), uMML(u1, 1)))); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u2")), uMML(u2, 2)))); else # resenim je primka text:=cat(text, "vlastni vektor (", setReference("u1"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u1")), uMML(u1, 1)))); end if; end if; if krok = 6 then text:=""; if evalf(lambda1) = evalf(lambda2) and evalf(lambda1) = evalf(lambda3) then text:=cat(text, "Vsechna tri vlastni cisla jsou stejna, tudiz jim odpovida stejna soustava (", getReference("vlastniVektorySoustava1"),"), ktera ma stejne reseni jako pro prvni vlastni cislo."); # dalsi krok tedy muzeme preskocit aktualniKrok:=aktualniKrok+1; elif evalf(lambda1) = evalf(lambda2) then text:=cat(text, "Prvni dve vlastni cisla jsou stejna, tudiz jim odpovida stejna soustava (", getReference("vlastniVektorySoustava1"),"), ktera ma stejne reseni jako pro prvni vlastni cislo."); else text:="Druhemu vlastnimu cislu odpovida soustava (", setReference("vlastniVektorySoustava2"),"), jejiz resenim je "; MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vlastniVektorySoustava2")), vlastniVektorySoustavaMML(lambda2)))); if nops(dosazenoVlastniVektor2) = 2 and type(op(1,dosazenoVlastniVektor2), list) = true then # resenim je rovina text:=cat(text, "rovina vektoru. Z teto roviny vybereme, dosazenim za parametry, 2 vlastni vektory - (", setReference("u2"),"), (", setReference("u3"),")"); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u2")), uMML(u2, 2)))); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u3")), uMML(u3, 3)))); if evalf(lambda2) = 0 then text:=cat(text, ", ktere urcuji asymptoticky smer kvadriky"); end if; text:=cat(text, "."); else # resenim je primka text:=cat(text, "vlastni vektor (", setReference("u2"),")"); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("u2")), uMML(u2, 2)))); if evalf(lambda2) = 0 then text:=cat(text, ", ktery urcuje asymptoticky smer kvadriky"); end if; text:=cat(text, "."); end if; end if; end if; if krok = 7 then text:=""; if evalf(lambda1) = evalf(lambda3) then text:=cat(text, "Prvni a treti vlastni cislo je stejne. Temto dvema cislum tudiz odpovida stejna soustava (", getReference("vlastniVektorySoustava1"),"), ktera ma stejne reseni jako pro prvni vlastni cislo."); elif evalf(lambda2) = evalf(lambda3) then text:=cat(text, "Druhe a treti vlastni cislo je stejne. Temto dvema cislum tudiz odpovida stejna soustava (", getReference("vlastniVektorySoustava2"),"), ktera ma stejne reseni jako pro druhe vlastni cislo."); else text:="Tretimu vlastnimu cislu odpovida soustava (", setReference("vlastniVektorySoustava3"),"), jejiz resenim je vlastni vektor (", setReference("u3"),")"; if evalf(lambda3) = 0 then text:=cat(text, ", ktery urcuje asymptoticky smer kvadriky"); end if; text:=cat(text, "."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vlastniVektorySoustava3")), vlastniVektorySoustavaMML(lambda3))), radekMML(cat(cislovaniMML(getReference("u3")), uMML(u3, 3)))); end if; end if; if krok = 8 then if typKvadriky = "Nestredova regularni" or typKvadriky = "Nestredova singularni" then if typKvadriky = "Nestredova regularni" then text:=cat("Nestredovou regularni kvadriku lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), nestredovaNeupravenyKanonickyTvar1MML))); text:=cat(text, " Pro kanonickou rovnici kvadriky budeme take potrebovat normovany vektor smeru, ktery je urceny vektorem (", getReference("u3"),"). Takovy vektor ma souradnice (", setReference("e3"),"). Dale vypocitame G podle (", setReference("G"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("e3")), e3MML)), radekMML(cat(cislovaniMML(getReference("G")), GMML))); else if evalf(lambda2) = 0 then text:=cat("Vypocitame normovany vektor smeru, ktery je urceny vektorem (", getReference("u2"),") a normovany vektor smeru, urceny vektorem (", getReference("u3"),"). Takoveto vektory maji souradnice (", setReference("e2"),") a (", setReference("e3"),"). Dale vypocitame F podle (", setReference("F"),") a G podle (", setReference("G"),"). "); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("e2")), e2MML)), radekMML(cat(cislovaniMML(getReference("e3")), e3MML)), radekMML(cat(cislovaniMML(getReference("F")), FMML)), radekMML(cat(cislovaniMML(getReference("G")), GMML))); if evalf(F) = 0 and evalf(G) = 0 then text:=cat(text, "Cisla F a G jsou nulove, kvadrika tedy nema zadny stred. Takovouto nestredovou singularni kvadriku, pro jejiz vlastni cisla plati (", setReference("lambdaPodminky"),"), lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), nestredovaNeupravenyKanonickyTvar3MML))); else text:=cat(text, "Jedno z cisel F a G neni nulove, stredem kvadriky je tedy neprazdna mnozina (rovina). Takovouto nestredovou singularni kvadriku, pro jejiz vlastni cisla plati (", setReference("lambdaPodminky"),"), lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("lambdaPodminky")), lambdaPodminkyMML("&ne;", "=", "=")))); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), nestredovaNeupravenyKanonickyTvar4MML))); end if; else text:=cat("Nestredovou singularni kvadriku, pro jejiz vlastni cisla plati (", setReference("lambdaPodminky"),"), lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("lambdaPodminky")), lambdaPodminkyMML("&ne;", "&ne;", "=")))); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), nestredovaNeupravenyKanonickyTvar2MML))); text:=cat(text, " Pro kanonickou rovnici kvadriky budeme take potrebovat hodnotu cisla N. Pro vypocteni teto hodnoty potrebujeme urcit mnozinu stredu kvadriky. Vyresime tedy soustavu rovnic (", setReference("stredSoustava"), ") pro urceni stredu kvadriky, vychazi nam (", setReference("stredSoustavaVysledek"), "), coz je parametricka rovnice "); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("stredSoustava")), stredSoustavaMML))); if (nops(bodyOsy) > 0) then text:=cat(text, "primky"); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("stredSoustavaVysledek")), osaStreduKvadrikyMML))); end if; if (nops(bodyRoviny) > 0) then text:=cat(text, "roviny"); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("stredSoustavaVysledek")), rovinaStreduKvadrikyMML))); end if; text:=cat(text, ". Hodnotu N vypocitame dosazenim libovolneho bodu M z mnoziny stredu (", getReference("stredSoustavaVysledek"), ") do rovnice kvadriky. Zvolime bod M napr. jako (", setReference("bodM"), ") a vypocitame hodnotu N (", setReference("N"), ")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("bodM")), bodMMML)), radekMML(cat(cislovaniMML(getReference("N")), NMML))); end if; end if; end if; if typKvadriky = "Stredova regularni" or typKvadriky = "Stredova singularni" then text:="Kazdou stredovou kvadriku lze prevest vhodnou volbou kartezske soustavy na kanonicky tvar (", setReference("neupravenyKanonickyTvar"),"). "; if typKvadriky = "Stredova regularni" then text:=cat(text, "Vypocitame hodnotu (", setReference("deltaA44"),") a do rovnice (", getReference("neupravenyKanonickyTvar"),") dosadime konkretni hodnoty a dostaneme rovnici (", setReference("dosazenyNeupravenyKanonickyTvar"),")."); else text:=cat(text, "Clen (", setReference("deltaA44"),") se v rovnici (", getReference("neupravenyKanonickyTvar"),") neprojevi, protoze je roven nule. Do rovnice (", getReference("neupravenyKanonickyTvar"),") dosadime konkretni hodnoty a dostaneme rovnici (", setReference("dosazenyNeupravenyKanonickyTvar"),")."); end if; MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("neupravenyKanonickyTvar")), stredovaNeupravenyKanonickyTvarMML)), radekMML(cat(cislovaniMML(getReference("deltaA44")), deltaA44MML)), radekMML(cat(cislovaniMML(getReference("dosazenyNeupravenyKanonickyTvar")), neupravenyKanonickyTvarDosazenoMML))); end if; end if; if krok = 9 then if typKvadriky = "Nestredova regularni" or typKvadriky = "Nestredova singularni" then text:="Do rovnice (", getReference("neupravenyKanonickyTvar"),") dosadime konkretni hodnoty a dostaneme kanonicky tvar (", setReference("dosazenyNeupravenyKanonickyTvar"),") rovnice kvadriky."; text:=cat(text, " Tento kanonicky tvar muzeme jeste upravit na tvar (", setReference("upravenyKanonickyTvar"),"), kde plati (", setReference("delkyPoloos"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("dosazenyNeupravenyKanonickyTvar")), neupravenyKanonickyTvarDosazenoMML)), radekMML(cat(cislovaniMML(getReference("upravenyKanonickyTvar")), kanonickaRceMML)), radekMML(cat(cislovaniMML(getReference("delkyPoloos")), delkyPoloosMML))); if nazevKvadriky = "rotacni paraboloid" then text:=cat(text, " Jelikoz rovina z=k, kde plati (", setReference("rezRovK"),"), protina kvadriku v kruznici, rikame kvadrice o rovnici (", getReference("upravenyKanonickyTvar"),") rotacni paraboloid."); if signum(rhs(kanonickaRce)/z) = -1 then MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovK2MML(0,"&lt;")))); else MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovK2MML(0,"&gt;")))); end if; else text:=cat(text, " Kvadrice o rovnici (", getReference("upravenyKanonickyTvar"),") rikame ", nazevKvadriky,"."); end if; end if; if typKvadriky = "Stredova regularni" or typKvadriky = "Stredova singularni" then text:=""; rovnice:="dosazenyNeupravenyKanonickyTvar"; if puvodniNeupravenaKanonickaRce = -neupravenaKanonickaRce then text:=cat(text, "Rovnici (", getReference("dosazenyNeupravenyKanonickyTvar"),") vynasobime cislem -1 a dostaneme (", setReference("-dosazenyNeupravenyKanonickyTvar"),"). "); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("-dosazenyNeupravenyKanonickyTvar")), minusNeupravenyKanonickyTvarDosazenoMML))); rovnice:="-dosazenyNeupravenyKanonickyTvar"; end if; if evalf(rhs(neupravenaKanonickaRce)) > 0 then text:=cat(text, "Cislo (", getReference("deltaA44"),") je v rovnici (", getReference(rovnice),") zaporne. Po vydeleni rovnice (", getReference(rovnice),") cislem minus (", getReference("deltaA44"),") dostaneme kvadriku, jejiz kanonicky tvar je (", setReference("kanonickaRce"),"), pricemz plati (", setReference("delkyPoloos"),")."); elif evalf(rhs(neupravenaKanonickaRce)) < 0 then text:=cat(text, "Cislo (", getReference("deltaA44"),") je v rovnici (", getReference(rovnice),") kladne. Po vydeleni rovnice (", getReference(rovnice),") cislem (", getReference("deltaA44"),") dostaneme kvadriku, jejiz kanonicky tvar je (", setReference("kanonickaRce"),"), pricemz plati (", setReference("delkyPoloos"),")."); else text:=cat(text, "Rovnici (", getReference(rovnice),") muzeme jeste upravit. Tim dostaneme konecny tvar kanonicke rovnice (", setReference("kanonickaRce"),"), pricemz plati (", setReference("delkyPoloos"),")."); end if; MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("kanonickaRce")), kanonickaRceMML)), radekMML(cat(cislovaniMML(getReference("delkyPoloos")), delkyPoloosMML))); if nazevKvadriky = "zplostely rotacni elipsoid" then text:=cat(text, " Jelikoz jsou delky dvou poloos stejne a treti poloosa je nejkratsi, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky,"."); elif nazevKvadriky = "vejcity rotacni elipsoid" then text:=cat(text, " Jelikoz jsou delky dvou poloos stejne a treti poloosa je nejdelsi, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky,"."); elif nazevKvadriky = "kulova plocha" then text:=cat(text, " Jelikoz jsou delky vsech tri poloos stejne, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky,"."); elif (substring(nazevKvadriky, 1..3) = "rov" or substring(nazevKvadriky, 1..3) = "rot") and (nazevKvadriky <> "rotacni kuzelova plocha") then if signum(lambda1) = -1 then rezRov1:="y=0, popr. z=0"; rezRov2:=cat("x=k, kde plati (", setReference("rezRovK"),"),"); elif signum(lambda2) = -1 then rezRov1:="x=0, popr. z=0"; rezRov2:=cat("y=k, kde plati (", setReference("rezRovK"),"),"); else rezRov1:="x=0, popr. y=0"; rezRov2:=cat("z=k, kde plati (", setReference("rezRovK"),"),"); end if; if (substring(nazevKvadriky, 1..3) = "rov" and substring(nazevKvadriky, 18) = "j") or (substring(nazevKvadriky, 1..3) = "rot" and substring(nazevKvadriky, 9) = "j") then # jednodilny hyperboloid MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKvRMML))); else # dvojdilny hyperboloid if signum(lambda1) = -1 then MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKMML(a)))); elif signum(lambda2) = -1 then MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKMML(b)))); else MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKMML(c)))); end if; end if; if substring(nazevKvadriky, 1..3) = "rot" then text:=cat(text, " Jelikoz rovina ", rezRov2," protina kvadriku v kruznici, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky, "."); else text:=cat(text, " Jelikoz jsou delky vsech tri poloos stejne (rovina ", rezRov1," protina kvadriku v rovnoose hyperbole a rovina ", rezRov2," protina kvadriku v kruznici), rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky, "."); end if; elif nazevKvadriky = "rotacni kuzelova plocha" then text:=cat(text, " Jelikoz rovina z=k, kde plati (", setReference("rezRovK"),") protina kvadriku v kruznici, rikame kvadrice o rovnici (", getReference("kanonickaRce"),") ", nazevKvadriky,"."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("rezRovK")), rezRovKMML(0)))); else text:=cat(text, " Kvadrice o rovnici (", getReference("kanonickaRce"),") rikame ", nazevKvadriky,"."); end if; end if; end if; if krok = 10 then text:="Kanonickou rovnici kvadriky si nyni zobrazime."; Maplets:-Tools:-Set('ChB1'('value') = 'true'); prekresli(); end if; if krok = 11 then text:="Pro prehlednost transformovanou kvadriku zase skryjeme a budeme vysetrovat puvodni polohu kvadriky. "; if typKvadriky = "Stredova regularni" or typKvadriky = "Stredova singularni" then text:=cat(text, "Jelikoz jde o stredovou kvadriku, zajimaji nas souradnice stredu S. Stred vypocitame vyresenim soustavy (", setReference("stredSoustava"),") pro urceni stredu kvadriky. Vychazi nam stred (", setReference("S"),"), ktery si zobrazime."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("stredSoustava")), stredSoustavaMML)), radekMML(cat(cislovaniMML(getReference("S")), SMML))); Maplets:-Tools:-Set('ChB5'('value') = 'true'); prekresli(); end if; text:=cat(text, "Urcime hlavni roviny. Hlavni rovina je prumerova rovina, ktera je kolma k hlavnimu smeru kvadriky. Rovnici hlavni roviny lze ziskat pomoci vztahu (", setReference("vztahProZiskaniHlavnichRovin"),") (kde K je matice koeficientu kvadriky) dosazenim vlastniho vektoru, ktery nenalezi asymptotickemu smeru kvadriky."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vztahProZiskaniHlavnichRovin")), vztahProZiskaniHlavnichRovinMML))); Maplets:-Tools:-Set('ChB1'('value') = 'false'); prekresli(); end if; if krok = 12 then text:="Prvni vlastni cislo "; if evalf(lambda1) <> 0 then text:=cat(text, "je ruzne od nuly, tzn., ze nenalezi asymptotickemu smeru. Dosazenim prvniho vlastniho vektoru do (", getReference("vztahProZiskaniHlavnichRovin"),") ziskame (", setReference("vztahProZiskaniHlavnichRovinDosazeno1"),"). Vynasobenim dostavame rovnici hlavni roviny (", setReference("hlavniRovina1"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vztahProZiskaniHlavnichRovinDosazeno1")), vztahProZiskaniHlavnichRovinDosazenoMML(u1))), radekMML(cat(cislovaniMML(getReference("hlavniRovina1")), hlavniRovina1MML))); else text:=cat(text, "je rovno nule, tzn., ze nalezi asymptotickemu smeru."); end if; end if; if krok = 13 then text:="Druhe vlastni cislo "; if evalf(lambda2) <> 0 then text:=cat(text, "je ruzne od nuly, tzn., ze nenalezi asymptotickemu smeru. Dosazenim druheho vlastniho vektoru do (", getReference("vztahProZiskaniHlavnichRovin"),") ziskame (", setReference("vztahProZiskaniHlavnichRovinDosazeno2"),"). Vynasobenim dostavame rovnici hlavni roviny (", setReference("hlavniRovina2"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vztahProZiskaniHlavnichRovinDosazeno2")), vztahProZiskaniHlavnichRovinDosazenoMML(u2))), radekMML(cat(cislovaniMML(getReference("hlavniRovina2")), hlavniRovina2MML))); else text:=cat(text, "je rovno nule, tzn., ze nalezi asymptotickemu smeru."); end if; end if; if krok = 14 then text:="Treti vlastni cislo "; if evalf(lambda3) <> 0 then text:=cat(text, "je ruzne od nuly, tzn., ze nenalezi asymptotickemu smeru. Dosazenim tretiho vlastniho vektoru do (", getReference("vztahProZiskaniHlavnichRovin"),") ziskame (", setReference("vztahProZiskaniHlavnichRovinDosazeno3"),"). Vynasobenim dostavame rovnici hlavni roviny (", setReference("hlavniRovina3"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("vztahProZiskaniHlavnichRovinDosazeno3")), vztahProZiskaniHlavnichRovinDosazenoMML(u3))), radekMML(cat(cislovaniMML(getReference("hlavniRovina3")), hlavniRovina3MML))); else text:=cat(text, "je rovno nule, tzn., ze nalezi asymptotickemu smeru."); end if; end if; if krok = 15 then if evalf(lambda2) = 0 and evalf(lambda3) = 0 then text:="Hlavni rovinu si nyni zobrazime."; else text:="Hlavni roviny si nyni zobrazime."; end if; Maplets:-Tools:-Set('ChB3'('value') = 'true'); prekresli(); end if; if krok = 16 then text:="Dale vyresime osy kvadriky. Osa kvadriky je prusecnice dvou hlavnich rovin. "; if evalf(lambda2) = 0 then text:=cat(text, "V nasem pripade ale existuje pouze jedna hlavni rovina, proto nema kvadrika zadne osy."); end if; if evalf(lambda2) <> 0 and evalf(lambda3) = 0 then text:=cat(text, "V nasem pripade existuji dve hlavni roviny, proto ma kvadrika jednu osu."); elif evalf(lambda2) <> 0 and evalf(lambda3) <> 0 then text:=cat(text, "V nasem pripade existuji vsechny tri hlavni roviny, proto ma kvadrika tri osy."); end if; if evalf(lambda2) <> 0 then text:=cat(text, " Prusecik prvni (", getReference("hlavniRovina1"),") a druhe (", getReference("hlavniRovina2"),") hlavni roviny nam dava osu (", setReference("osa1"),")."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("osa1")), osaMML(1,2)))); end if; if evalf(lambda2) <> 0 and evalf(lambda3) = 0 then text:=cat(text, " Osu si nyni zobrazime."); end if; if evalf(lambda3) <> 0 then text:=cat(text, " Prusecik prvni (", getReference("hlavniRovina1"),") a treti (", getReference("hlavniRovina3"),") hlavni roviny nam dava osu (", setReference("osa2"),")."); text:=cat(text, " Prusecik druhe (", getReference("hlavniRovina2"),") a treti (", getReference("hlavniRovina3"),") hlavni roviny nam dava osu (", setReference("osa3"),")."); text:=cat(text," Osy si nyni zobrazime."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("osa2")), osaMML(1,3))), radekMML(cat(cislovaniMML(getReference("osa3")), osaMML(2,3)))); end if; Maplets:-Tools:-Set('ChB4'('value') = 'true'); prekresli(); end if; if krok = 17 then text:=""; if typKvadriky = "Nestredova regularni" then text:=cat(text, "Jelikoz se jedna o ", nazevKvadriky, ", zajima nas jeste vrchol kvadriky, coz je prusecik kvadriky s jeji osou. Vychazi nam vrchol (", setReference("V"),"). Vrchol i puvodni kvadriku nakonec zobrazime."); MMLtext:=cat(MMLtext, radekMML(cat(cislovaniMML(getReference("V")), VMML))); Maplets:-Tools:-Set('ChB5'('value') = 'true'); else text:=cat(text, "Nakonec puvodni kvadriku zobrazime."); end if; Maplets:-Tools:-Set('ChB2'('value') = 'true'); prekresli(); end if; celyMMLtext:=cat(celyMMLtext, MMLtext); # MMLtext:=cat(MMLtext, paticka); Maplets:-Tools:-Set('doprovodnyText' ('appendline') = cat("- ", text)); Maplets:-Tools:-Set('doprovodnyText' ('appendline') = ""); return cat(hlavicka, celyMMLtext, paticka); end proc: kresli:=proc(size) local xd,xh,yd,yh,zd,zh; global hlavniRovinap, osaKvadriky1p, osaKvadriky2p, osaKvadriky3p, Vp, Vt, V, transformovanaKvadrikap, puvodniKvadrikap, Sp, St, hlavniRovina1, hlavniRovina2, hlavniRovina3, bodyOsyKvadriky, kanonickaRce, prazdnop; xd:=-size:xh:=size:yd:=-size:yh:=size:zd:=-size:zh:=size: if evalf(lambda1) <> 'lambda1' then hlavniRovinap:=implicitplot3d({hlavniRovina1,hlavniRovina2,hlavniRovina3},x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita1,kvalita1,kvalita1],style=LINE,scaling=constrained,shading=XYZ,gridstyle=rectangular); bodyOsyKvadriky:=proc(hlRovina1,hlRovina2) local bodyOsy,tmp,B1,B2,a; bodyOsy:=eval([x,y,z],solve({hlRovina1,hlRovina2},{x,y,z})); tmp:=solve({bodyOsy[1]>=xd,bodyOsy[2]>=yd,bodyOsy[3]>=zd,bodyOsy[1]<=xh,bodyOsy[2]<=yh,bodyOsy[3]<=zh}); if tmp = NULL or nops(tmp) = 1 then return NULL; end if; B1:=[]:B2:=[]: for a from 1 to nops(tmp) do # if type(tmp[a],`<=`) then if type(evalf(lhs(tmp[a])),numeric) then B1:=[op(B1),isolate(convert(tmp[a],equality),rhs(tmp[a]))]; else B2:=[op(B2),convert(tmp[a],equality)]; end if; # end if; end do; return [subs(op(B1),bodyOsy),subs(op(B2),bodyOsy)]; end proc: osaKvadriky1p:=NULL:osaKvadriky2p:=NULL:osaKvadriky3p:=NULL: if hlavniRovina3 = NULL then if hlavniRovina2 <> NULL then if bodyOsyKvadriky(hlavniRovina1,hlavniRovina2) <> NULL then osaKvadriky1p:=polygonplot3d(bodyOsyKvadriky(hlavniRovina1,hlavniRovina2),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]); end if; end if; else if bodyOsyKvadriky(hlavniRovina1,hlavniRovina2) <> NULL then osaKvadriky1p:=polygonplot3d(bodyOsyKvadriky(hlavniRovina1,hlavniRovina2),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]); end if; if bodyOsyKvadriky(hlavniRovina2,hlavniRovina3) <> NULL then osaKvadriky2p:=polygonplot3d(bodyOsyKvadriky(hlavniRovina2,hlavniRovina3),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]); end if; if bodyOsyKvadriky(hlavniRovina1,hlavniRovina3) <> NULL then osaKvadriky3p:=polygonplot3d(bodyOsyKvadriky(hlavniRovina1,hlavniRovina3),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]); end if; end if; Vp:=NULL:Vt:=NULL: if delta <> 0 and A44 = 0 then # if evalf(lambda1) <> evalf(lambda2) then V:=eval([x,y,z],solve({hlavniRovina1,hlavniRovina2,kvadrika},{x,y,z})); if zapnoutNumerickeVypocty = 1 then V:=evalf(V); end if; Vp:=pointplot3d(V,color=black,symbol=CROSS,symbolsize=15,view=[xd..xh,yd..yh,zd..zh]); Vt:=textplot3d([V[1],V[2],V[3],'V'],color=black,align=LEFT,font=[HELVETICA,ROMAN,13],view=[xd..xh,yd..yh,zd..zh]); # end if; end if; transformovanaKvadrikap:=NULL: if nazevKvadriky = "primka (imaginarni ruznobezne roviny)" then # implicitplot3d nezobrazi primku transformovanaKvadrikap:=polygonplot3d([[0,0,zd],[0,0,zh]],scaling=constrained,view=[xd..xh,yd..yh,zd..zh]); elif nazevKvadriky = "bod (imaginarni kuzelova plocha)" then transformovanaKvadrikap:=pointplot3d([0,0,0], color=black, symbol=CROSS, symbolsize=15, view=[xd..xh,yd..yh,zd..zh]): elif nazevKvadriky = "dvojnasobna rovina" then implicitplot3d nechce zobrazit x^2, ale odmocninu zobrazi transformovanaKvadrikap:=implicitplot3d(sqrt(lhs(factor(kanonickaRce)),symbolic),x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita2,kvalita2,kvalita2],style=PATCHNOGRID,scaling=constrained,shading=XY); else transformovanaKvadrikap:=implicitplot3d(kanonickaRce,x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita2,kvalita2,kvalita2],style=PATCHNOGRID,scaling=constrained,shading=XY); end if; puvodniKvadrikap:=NULL: if nazevKvadriky = "primka (imaginarni ruznobezne roviny)" then # implicitplot3d nezobrazi primku puvodniKvadrikap:=polygonplot3d(bodyOsyKvadriky(hlavniRovina1,hlavniRovina2),scaling=constrained,view=[xd..xh,yd..yh,zd..zh]); elif nazevKvadriky = "bod (imaginarni kuzelova plocha)" then puvodniKvadrikap:=pointplot3d(S, color=black, symbol=CROSS, symbolsize=15, view=[xd..xh,yd..yh,zd..zh]): elif nazevKvadriky = "dvojnasobna rovina" then implicitplot3d nechce zobrazit (ax+by+cz+d)^2 - v tomto pripade puvodni kvadrice odpovida hlavni rovina, takze muzeme zobrazit ji puvodniKvadrikap:=implicitplot3d(hlavniRovina1,x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita2,kvalita2,kvalita2],style=PATCHNOGRID,scaling=constrained,shading=ZGRAYSCALE); else puvodniKvadrikap:=implicitplot3d(kvadrika,x=xd..xh,y=yd..yh,z=zd..zh,grid=[kvalita2,kvalita2,kvalita2],style=PATCHNOGRID,scaling=constrained,shading=ZGRAYSCALE); end if; Sp:=NULL:St:=NULL: if (delta <> 0 and A44 <> 0) or (delta = 0 and A44 <> 0) then Sp:=pointplot3d(S,color=black,symbol=CROSS,symbolsize=15,view=[xd..xh,yd..yh,zd..zh]); St:=textplot3d([S[1],S[2],S[3],'S'],color=black,align=LEFT,font=[HELVETICA,ROMAN,13],view=[xd..xh,yd..yh,zd..zh]); end if; end if; prazdnop:=pointplot3d([0,0,0], color=white, axes=BOXED, view=[-size..size,-size..size,-size..size]): end proc: prekresli:=proc() local zobrazit, i, j, titulek; zobrazit:=[]; if Maplets:-Tools:-Get('ChB1') then zobrazit:=[op(zobrazit), transformovanaKvadrikap]; end if; if Maplets:-Tools:-Get('ChB2') then zobrazit:=[op(zobrazit), puvodniKvadrikap]; end if; if Maplets:-Tools:-Get('ChB3') then zobrazit:=[op(zobrazit), hlavniRovinap]; end if; if Maplets:-Tools:-Get('ChB4') then zobrazit:=[op(zobrazit), osaKvadriky1p, osaKvadriky2p, osaKvadriky3p]; end if; if Maplets:-Tools:-Get('ChB5') then zobrazit:=[op(zobrazit), Sp, St, Vp, Vt]; end if; j:=false; for i in zobrazit do if i <> NULL then j:=true; end if; end do; if j = false then zobrazit:=prazdnop; titulek:=""; else titulek:=cat(typKvadriky," kvadrika\n",nazevKvadriky); end if; Maplets:-Tools:-Set('plotter'('value') = display3d(zobrazit, title=titulek, axes=boxed)); end proc: # KONEC PROCEDUR PRO DEFINICI MATHML VYPISU # ZACATEK HLAVNICH VYPOCTU hlavniVypocty:=proc() global delta, A44, typKvadriky, lambda1, lambda2, lambda3, a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43, a44, K, kvadrika, charRce, rozepsanaCharRce, reseniCharRce, r1, r2, r3, u1, u2, u3, e2, e3, G, F, kanonickaRce, a, b, c, r, nazevKvadriky, neupravenaKanonickaRce, puvodniNeupravenaKanonickaRce, podtypKvadriky, bodyOsy, bodyRoviny, M, N, neupravenaKanonickaRce2, S, hr, hlavniRovina1, hlavniRovina2, hlavniRovina3, hlavniRovinap, bodyOsyKvadriky, osaKvadriky1p, osaKvadriky2p, osaKvadriky3p, Vp, Vt, V, transformovanaKvadrikap, puvodniKvadrikap, Sp, St, prazdnop, defaultSize, dosazenoVlastniVektor1, dosazenoVlastniVektor2, dosazenoVlastniVektor3; local xd, xh, yd, yh, zd, zh, tmp, vlastniVektor1, vlastniVektor2, vlastniVektor3, dosazeni, ea, eb, ec, er, l1, l2, l3, mnozinaStredu, i, j, k, komplexniChyba, rce, l, tmp2; # ZACATEK VYPOCTU Matice K je symetricka a21:=a12:a31:=a13:a32:=a23:a41:=a14:a42:=a24:a43:=a34: kvadrika:=a11*x^2+a22*y^2+a33*z^2+2*a12*x*y+2*a13*x*z+2*a23*y*z+2*a14*x+2*a24*y+2*a34*z+a44; K:=matrix([[a11,a12,a13,a14],[a21,a22,a23,a24],[a31,a32,a33,a34],[a41,a42,a43,a44]]); delta:=det(K); A44:=det(submatrix(K,1..3,1..3)); charRce:=det(evalm(submatrix(K,1..3,1..3)-lambda))=0; rozepsanaCharRce:=lhs(charRce); reseniCharRce:=[solve(charRce,lambda)]; # opraveni chyby, kdy vychazi lambdy jako komplexni cisla komplexniChyba:=false; for i from 1 to 3 do if not type(evalf(reseniCharRce[i]), realcons) then # cislo vyjadrime v goniometrickem tvaru, kde uz komplexni cisla nebudou reseniCharRce:=subsop(i=evalc(reseniCharRce[i]), reseniCharRce); komplexniChyba:=true; end if; end do; lambda1:=reseniCharRce[1]:lambda2:=reseniCharRce[2]:lambda3:=reseniCharRce[3]: V pripade, ze je jedno z lambd rovno nule, chceme, aby to bylo lambda3 - chceme, aby nulove lambdy mely vetsi indexy nez nenulove. if evalf(lambda3) <> 0 then if evalf(lambda1) = 0 then tmp:=lambda3:lambda3:=lambda1:lambda1:=tmp; elif evalf(lambda2) = 0 then tmp:=lambda2:lambda2:=lambda3:lambda3:=tmp; end if; end if: r1:=lambda->(a11-lambda)*u+a12*v+a13*w=0: r2:=lambda->a21*u+(a22-lambda)*v+a23*w=0: r3:=lambda->a31*u+a32*v+(a33-lambda)*w=0: if komplexniChyba then rce:=[r1,r2,r3]; l:=[lambda1,lambda2,lambda3]; tmp2:=["","",""]; for i from 1 to 3 do for j from 1 to 2 do if op(i,tmp2) <> "" then break; end if; for k from j+1 to 3 do tmp:=eval([u,v,w],solve({rce[j](l[i]),rce[k](l[i])},{u,v,w})); if (tmp[1]=`u` and tmp[2]=`v`) or (tmp[2]=`v` and tmp[3]=`w`) or (tmp[2]=`v` and tmp[3]=`w`) or (tmp[1]=`u` and tmp[2]=`v` and tmp[3]=`w`) then next; else tmp2[i]:=tmp; break; end if; end do; end do; end do; vlastniVektor1:=tmp2[1]; vlastniVektor2:=tmp2[2]; vlastniVektor3:=tmp2[3]; else vlastniVektor1:=eval([u,v,w],solve({r1(lambda1),r2(lambda1),r3(lambda1)},{u,v,w})): vlastniVektor2:=eval([u,v,w],solve({r1(lambda2),r2(lambda2),r3(lambda2)},{u,v,w})): vlastniVektor3:=eval([u,v,w],solve({r1(lambda3),r2(lambda3),r3(lambda3)},{u,v,w})): end if; dosazeni:=proc(vektor) local p, i, j, k, l, m, tmp1, tmp2; p:=[];tmp2:=[];l:=1; if vektor[1] = `u` then p:=[op(p),`u`]; end if; if vektor[2] = `v` then p:=[op(p),`v`]; end if; if vektor[3] = `w` then p:=[op(p),`w`]; end if; for k in p do tmp1:=vektor; m:=0; for i in p do m:=m+1; if m = l then j:=1; else j:=0; end if; tmp1:=subs(i=j, tmp1); end do; l:=l+1; tmp2:=[op(tmp2),tmp1]; end do; if vektor[1] <> `u` and vektor[2] <> `v` and vektor[3] <> `w` then return [vektor]; else return tmp2; end; end proc: dosazenoVlastniVektor1:=dosazeni(vlastniVektor1); dosazenoVlastniVektor2:=dosazeni(vlastniVektor2); dosazenoVlastniVektor3:=dosazeni(vlastniVektor3); Ka\305\276d\303\251mu vlastn\303\255mu \304\215\303\255slu lambda_i odpov\303\255d\303\241 vlastn\303\255 vektor u_i. if evalf(lambda1) <> evalf(lambda2) and evalf(lambda1) <> evalf(lambda3) and evalf(lambda2) <> evalf(lambda3) then u1:=op(1,dosazenoVlastniVektor1); u2:=op(1,dosazenoVlastniVektor2); u3:=op(1,dosazenoVlastniVektor3); elif evalf(lambda1) = evalf(lambda2) and evalf(lambda1) <> evalf(lambda3) then u1:=op(1,dosazenoVlastniVektor1); u2:=op(2,dosazenoVlastniVektor1); u3:=op(1,dosazenoVlastniVektor3); elif evalf(lambda1) = evalf(lambda3) and evalf(lambda1) <> evalf(lambda2) then u1:=op(1,dosazenoVlastniVektor1); u2:=op(1,dosazenoVlastniVektor2); u3:=op(2,dosazenoVlastniVektor1); elif evalf(lambda2) = evalf(lambda3) and evalf(lambda2) <> evalf(lambda1) then u1:=op(1,dosazenoVlastniVektor1); u2:=op(1,dosazenoVlastniVektor2); u3:=op(2,dosazenoVlastniVektor2); else u1:=op(1,dosazenoVlastniVektor1); u2:=op(2,dosazenoVlastniVektor1); u3:=op(3,dosazenoVlastniVektor1); end if; Stredova regularni kvadrika if delta <> 0 and A44 <> 0 then typKvadriky:="Stredova regularni"; neupravenaKanonickaRce:=lambda1*x^2+lambda2*y^2+lambda3*z^2=-delta/A44: puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce; a:=rhs(neupravenaKanonickaRce)/lambda1:a:=sqrt(a*signum(a)): b:=rhs(neupravenaKanonickaRce)/lambda2:b:=sqrt(b*signum(b)): c:=rhs(neupravenaKanonickaRce)/lambda3:c:=sqrt(c*signum(c)): r:=1: ea:=evalf(a):eb:=evalf(b):ec:=evalf(c):er:=evalf(r): if (signum(lambda1) = signum(lambda2)) and (signum(lambda2) = signum(lambda3)) then vlastni cisla maji stejna znamenka - Eliptickeho typu podtypKvadriky:="Elipticky typ"; if (evalf(lambda1) < 0) then na leve strane rovnice chceme jen kladne koeficienty neupravenaKanonickaRce:=-neupravenaKanonickaRce: end if; if evalf(rhs(neupravenaKanonickaRce)) > 0 then v pripade, ze je prava strana rovnice kladna, ma rovnice realne reseni - Trojosy elipsoid kanonickaRce:=neupravenaKanonickaRce/rhs(neupravenaKanonickaRce); if (ea = eb and eb > ec) or (ea = ec and ec > eb) or (eb = ec and ec > ea) then nazevKvadriky:="zplostely rotacni elipsoid": elif (ea = eb and eb < ec) or (ea = ec and ec < eb) or (eb = ec and ec < ea) then nazevKvadriky:="vejcity rotacni elipsoid": elif ea = eb and eb = ec then nazevKvadriky:="kulova plocha": else nazevKvadriky:="trojosy elipsoid": end if; elif evalf(rhs(neupravenaKanonickaRce)) < 0 then v pripade, ze je prava strana rovnice zaporna, kvadrika neobsahuje zadny realny bod - Imaginarni elipsoid nazevKvadriky:="imaginarni elipsoid"; kanonickaRce:=neupravenaKanonickaRce/(-rhs(neupravenaKanonickaRce)); end if; else vlastni cisla maji ruzna znamenka - Hyperbolickeho typu l1:=lambda1:l2:=lambda2:l3:=lambda3: chceme, aby byl pouze jeden koeficient z leve strany rovnice zaporny podtypKvadriky:="Hyperbolicky typ"; if signum(lambda1*lambda2*lambda3) = 1 then neupravenaKanonickaRce:=-neupravenaKanonickaRce: l1:=-l1:l2:=-l2:l3:=-l3: end if; if evalf(rhs(neupravenaKanonickaRce)) < 0 then v pripade, ze je prava strana rovnice zaporna - Dvojdilny hyperboloid nazevKvadriky:="dvojdilny hyperboloid"; kanonickaRce:=neupravenaKanonickaRce/(-rhs(neupravenaKanonickaRce)); elif evalf(rhs(neupravenaKanonickaRce)) > 0 then v pripade, ze je prava strana rovnice kladna - Jednodilny hyperboloid nazevKvadriky:="jednodilny hyperboloid"; kanonickaRce:=neupravenaKanonickaRce/rhs(neupravenaKanonickaRce); end if; if ea = eb and eb = ec then nazevKvadriky:=cat("rovnoosy rotacni ", nazevKvadriky); elif (ea = eb and signum(l3)=-1) or (ea = ec and signum(l2)=-1) or (eb = ec and signum(l1)=-1) then nazevKvadriky:=cat("rotacni ", nazevKvadriky); end if; end if; end if; Stredova singularni if delta = 0 and A44 <> 0 then typKvadriky:="Stredova singularni": neupravenaKanonickaRce:=lambda1*x^2+lambda2*y^2+lambda3*z^2=0: puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce; a:=1/lambda1:a:=sqrt(a*signum(a)): b:=1/lambda2:b:=sqrt(b*signum(b)): c:=1/lambda3:c:=sqrt(c*signum(c)): ea:=evalf(a):eb:=evalf(b):ec:=evalf(c): if (signum(lambda1) = signum(lambda2)) and (signum(lambda2) = signum(lambda3)) then Imaginarni kuzelova plocha nazevKvadriky:="bod (imaginarni kuzelova plocha)"; chceme, aby koeficienty u prave strany rovnice byly kladne if evalf(lambda1) < 0 then neupravenaKanonickaRce:=-neupravenaKanonickaRce; end if; else Kuzelova plocha l1:=lambda1:l2:=lambda2:l3:=lambda3: chceme, aby byl pouze jeden koeficient z leve strany rovnice zaporny if signum(lambda1*lambda2*lambda3) = 1 then neupravenaKanonickaRce:=-neupravenaKanonickaRce: l1:=-l1:l2:=-l2:l3:=-l3: end if; if (ea = eb and signum(l3)=-1) or (ea = ec and signum(l2)=-1) or (eb = ec and signum(l1)=-1) then nazevKvadriky:="rotacni kuzelova plocha"; else nazevKvadriky:="kuzelova plocha"; end if; end if; kanonickaRce:=neupravenaKanonickaRce; end if; Nestredova regularni if delta <> 0 and A44 = 0 then typKvadriky:="Nestredova regularni": e3:=evalm(u3/norm(u3,2)); G:=a14*e3[1]+a24*e3[2]+a34*e3[3]; neupravenaKanonickaRce:=lambda1*x^2+lambda2*y^2=-2*G*z: puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce; a:=G/lambda1:a:=sqrt(a*signum(a)): b:=G/lambda2:b:=sqrt(b*signum(b)): ea:=evalf(a):eb:=evalf(b): if signum(lambda1) = signum(lambda2) then Elipticky paraboloid chceme, aby koeficienty u prave strany rovnice byly kladne if evalf(lambda1) < 0 then neupravenaKanonickaRce:=-neupravenaKanonickaRce; end if; kanonickaRce:=neupravenaKanonickaRce/(G*signum(G)); if ea = eb then nazevKvadriky:="rotacni paraboloid"; else nazevKvadriky:="elipticky paraboloid"; end if; else Hyperbolicky paraboloid nazevKvadriky:="hyperbolicky paraboloid"; kanonickaRce:=neupravenaKanonickaRce/(G*signum(G)); end if; end if; Nestredova singularni if delta = 0 and A44 = 0 then typKvadriky:="Nestredova singularni": e3:=evalm(u3/norm(u3,2)); G:=a14*e3[1]+a24*e3[2]+a34*e3[3]; e2:=evalm(u2/norm(u2,2)); F:=a14*e2[1]+a24*e2[2]+a34*e2[3]; bodyOsy:=[];bodyRoviny:=[]; if evalf(lambda2) <> 0 or (evalf(lambda2) = 0 and evalf(F) = 0 and evalf(G) = 0) then mnozinaStredu:=eval([m,n,p],solve(geneqns(submatrix(K,1..3,1..3),[m,n,p],evalm(-1*subvector(K,1..3,4))),{m,n,p})); # za parametr dosadime hodnotu 0 M:=mnozinaStredu; if M[1] = `m` then M:=subs(m=0, M); end if; if M[2] = `n` then M:=subs(n=0, M); end if; if M[3] = `p` then M:=subs(p=0, M); end if; if evalf(lambda1) <> 0 and evalf(lambda2) <> 0 and evalf(lambda3) = 0 then primka stredu bodyOsy:=mnozinaStredu; elif evalf(lambda1) <> 0 and evalf(lambda2) = 0 and evalf(lambda3) = 0 then rovina stredu bodyRoviny:=mnozinaStredu; end if; hodnotu N urcime dosazenim libovolneho bodu M osy nebo roviny do rovnice kvadriky N:=subs(x=M[1], y=M[2], z=M[3], kvadrika); end if; if evalf(lambda1) <> 0 and evalf(lambda2) <> 0 and evalf(lambda3) = 0 then neupravenaKanonickaRce:=lambda1*x^2+lambda2*y^2=-N; puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce; # G = 0, F = 0, E = 0, H = N if evalf(N) <> 0 then Valcova plocha a:=N/lambda1:a:=sqrt(a*signum(a)): b:=N/lambda2:b:=sqrt(b*signum(b)): ea:=evalf(a):eb:=evalf(b): if signum(lambda1) = signum(lambda2) then if evalf(lambda1) < 0 and evalf(lambda2) < 0 then neupravenaKanonickaRce:=-neupravenaKanonickaRce; end if; if evalf(rhs(neupravenaKanonickaRce)) > 0 then Elipticka valcova plocha if ea = eb then nazevKvadriky:="rotacni valcova plocha"; else nazevKvadriky:="elipticka valcova plocha"; end if; kanonickaRce:=neupravenaKanonickaRce/rhs(neupravenaKanonickaRce); elif evalf(rhs(neupravenaKanonickaRce)) < 0 then Imaginarni elipticka valcova plocha nazevKvadriky:="imaginarni elipticka valcova plocha"; kanonickaRce:=neupravenaKanonickaRce/(-rhs(neupravenaKanonickaRce)); end if; else Hyperbolicka valcova plocha nazevKvadriky:="hyperbolicka valcova plocha"; kanonickaRce:=neupravenaKanonickaRce/rhs(neupravenaKanonickaRce); if evalf(rhs(kanonickaRce)) < 0 then kanonickaRce:=-kanonickaRce; end if; end if; else a:=1/lambda1:a:=sqrt(a*signum(a)): b:=1/lambda2:b:=sqrt(b*signum(b)): ea:=evalf(a):eb:=evalf(b): if signum(lambda1) = signum(lambda2) then Primka nebo imaginarni ruznobezne roviny nazevKvadriky:="primka (imaginarni ruznobezne roviny)"; if evalf(lambda1) < 0 and evalf(lambda2) < 0 then neupravenaKanonickaRce:=-neupravenaKanonickaRce; end if; kanonickaRce:=neupravenaKanonickaRce; else Dve ruznobezne roviny nazevKvadriky:="dve ruznobezne roviny"; kanonickaRce:=factor(neupravenaKanonickaRce); end if; end if; elif evalf(lambda1) <> 0 and evalf(lambda2) = 0 and evalf(lambda3) = 0 then if evalf(G) = 0 and evalf(F) = 0 then # E = 0, H = N neupravenaKanonickaRce:=lambda1*x^2=-N; puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce; if evalf(N) <> 0 then a:=N/lambda1:a:=sqrt(a*signum(a)): ea:=evalf(a): if evalf(lambda1) < 0 then neupravenaKanonickaRce:=-neupravenaKanonickaRce; end if; if evalf(rhs(neupravenaKanonickaRce)) > 0 then Dve rovnobezne roviny nazevKvadriky:="dve rovnobezne roviny"; kanonickaRce:=factor(neupravenaKanonickaRce/rhs(neupravenaKanonickaRce)); elif evalf(rhs(neupravenaKanonickaRce)) < 0 then Imaginarni rovnobezne roviny nazevKvadriky:="imaginarni rovnobezne roviny"; kanonickaRce:=neupravenaKanonickaRce/(-rhs(neupravenaKanonickaRce)); end if; else Dvojnasobna rovina a:=1/lambda1:a:=sqrt(a*signum(a)): ea:=evalf(a): if evalf(lambda1) < 0 then neupravenaKanonickaRce:=-neupravenaKanonickaRce; end if; nazevKvadriky:="dvojnasobna rovina"; kanonickaRce:=neupravenaKanonickaRce; end if; else # G <> 0 nebo F <> 0 Parabolicka valcova plocha nazevKvadriky:="parabolicka valcova plocha"; neupravenaKanonickaRce:=lambda1*x^2=-2*F*y-2*G*z; puvodniNeupravenaKanonickaRce:=neupravenaKanonickaRce; a:=1/lambda1:a:=sqrt(a*signum(a)): ea:=evalf(a): if (evalf(lambda1) < 0) then neupravenaKanonickaRce:=-neupravenaKanonickaRce; end if; kanonickaRce:=neupravenaKanonickaRce; end if; end if; end if; if (delta <> 0 and A44 <> 0) or (delta = 0 and A44 <> 0) then Stredova kvadrika S:=eval([m,n,p],solve(geneqns(submatrix(K,1..3,1..3),[m,n,p],evalm(-1*subvector(K,1..3,4))),{m,n,p})); if zapnoutNumerickeVypocty = 1 then S:=evalf(S); end if; end if; hr:=proc(lambda,u) global K; if (evalf(lambda) <> 0) then return rhs(op(op(3,(multiply(matrix(1,4,[u[1],u[2],u[3],0]),K,matrix(4,1,[x,y,z,1])))))); else return NULL; end if; end proc: hlavniRovina1:=hr(lambda1,u1); hlavniRovina2:=hr(lambda2,u2); hlavniRovina3:=hr(lambda3,u3); kresli(defaultSize); end proc: # KONEC HLAVNICH VYPOCTU priklady:=[ "a) 7*x^2-13*y^2+6*z^2+24*x*y-12*x*z+12*y*z-84*x+90*y-24*z-63=0", "b) 4*x^2+4*y^2+12*z^2+4*x*y-12*y*z+4*x+2*y+3*z=0", "c) 1*x^2+9*y^2+16*z^2-6*x*y-8*x*z+24*y*z-4*z-2=0", "d) x^2+2*y^2+z^2+2*x*y+10-2*y*z-6*x-8*y+2*z=0", "e) 2*x^2+2*y^2+z^2-12-4*x+4*y=0", "f) x^2+2*y^2+7-2*x*y+3*y*z-6*x+7*y+6*z=0", "g) 5*x^2-4*y^2+z^2-8*x*y+6*x*z-8+2*x-8*y+6*z=0", "h) 11*x^2+10*y^2+6*z^2-12*x*y+4*x*z-8*y*z-22*x-1=0", "i) 9*x^2+4*y^2+z^2-12*x*y+6*x*z-4*y*z+3*x-2*y+z-3/2=0", "j) x^2+2*y^2+4*z^2-2*x*y-4-4*y*z+2*x-2*y=0", "k) 3*x^2-2*y^2-z^2+5*x*y-2*x*z+3*y*z-8*x+5*y-4*z-5=0", "l) 5*x^2+5*y^2+5*z^2+30+4*x*z+3*y*z-14*x-13*y-17*z=0", "m) 2*x^2+2*y^2+2*z^2+2*x*y-2*x*z+2*y*z-6*x+18*y+24*z=0", "n) x^2+9*y^2+z^2-6*x*y+2*x*z-6*y*z+8*x-24*y+8*z+16=0", "o) x^2+y^2+3*z^2+10*x*y+6*x*z+6*y*z-10*x-2*y-6*z+37=0", "p) -1+x*y+x*z+y*z=0", "q) 3*x^2-3*y^2+z^2+8*x*y-4*x*z-2*y*z-4*x+6*y+2*z=0", "r) 15*x^2+15*y^2-2*z^2-34*x*y+15-30*x+34*y=0", "s) 13*x^2+4*y^2+9*z^2+1+12*y*z+5*x-z=0", "t) x^2+y^2+z^2+x*y+x*z+y*z-6*x-4*y+2*z+5=0", "u) -x^2-4*y^2+9*z^2+4*x*y+8*x-16*y-16=0", "v) 1/3*x^2+1/3*y^2+1/3*z^2-8/3*x+2*y-4/3*z+11/3=0", "w) 9*x^2+2*y^2+9*z^2+6*sqrt(2)*x*y-18*x*z-6*sqrt(2)*y*z+3=0", "x) -y^2+x*y-x*z-y*z+1+x+z+1=0", "y) x^2+y^2+z^2-4*x-8*y-2*z+21=0", "z) 5*x^2+8*y^2+5*z^2+4*x*y-8*x*z+4*y*z+27=0", "1) 6*x^2-2*y^2+6*z^2+4*x*z+8*x-4*y-8*z+1=0" ]: init:=proc() global celyMMLtext, aktualniKrok, reference, stav, hlavniRovinap, osaKvadriky1p, osaKvadriky2p, osaKvadriky3p, Vp, Vt, transformovanaKvadrikap, puvodniKvadrikap, Sp, St, prazdnop, defaultSize; reference:=[]; celyMMLtext:=""; aktualniKrok:=1; stav:=0; Maplets:-Tools:-Set('doprovodnyText' = ""); # Maplets:-Tools:-Set('nazevKroku' = ""); Maplets:-Tools:-Set('MMLViewer' = ""); Sp:=NULL;St:=NULL;Vp:=NULL;Vt:=NULL;hlavniRovinap:=NULL;transformovanaKvadrikap:=NULL;puvodniKvadrikap:=NULL;osaKvadriky1p:=NULL;osaKvadriky2p:=NULL;osaKvadriky3p:=NULL; prazdnop:=pointplot3d([0,0,0], color=white, axes=BOXED, view=[-defaultSize..defaultSize,-defaultSize..defaultSize,-defaultSize..defaultSize]): end proc: reinit:=proc(rceKvadriky) global stav; if stav = 0 then init(); extrakceKoeficientu(rceKvadriky); hlavniVypocty(); definiceMMLVypisu(); Maplets:-Tools:-Set('zoom'('value') = defaultSize); zmenStav(1); end if; end proc: zmenStav:=proc(novyStav) global stav; stav:=novyStav; end proc: nastavKvalitu:=proc() global kvalita1, kvalita2; if Maplets:-Tools:-Get('RBMI10'('value')) = true then kvalita1:=10; kvalita2:=15; end if; if Maplets:-Tools:-Get('RBMI11'('value')) = true then kvalita1:=10; kvalita2:=25; end if; if Maplets:-Tools:-Get('RBMI12'('value')) = true then kvalita1:=10; kvalita2:=35; end if; if Maplets:-Tools:-Get('RBMI13'('value')) = true then kvalita1:=10; kvalita2:=50; end if; end proc: prepniNumerickeVypocty:=proc() global zapnoutNumerickeVypocty; if zapnoutNumerickeVypocty = 0 then zapnoutNumerickeVypocty:=1; else zapnoutNumerickeVypocty:=0; end if; if stav = 1 then definiceMMLVypisu(); end if; end proc: upravPriklad:=proc() local priklad; priklad:=Maplets:-Tools:-Get('LB1'('value')); return parse(substring(priklad,4..length(priklad))); end proc: #nastavVelikostPisma:=proc() # local i, j; # j:=9; # for i in [RBMI1, RBMI2, RBMI3, RBMI4, RBMI5, RBMI6, RBMI7, RBMI8, RBMI9] do # j:=j+1; # if Maplets:-Tools:-Get('i'('value')) = true then # Maplets:-Tools:-Set('MMLViewer' = NULL); # Maplets:-Tools:-Set('MMLViewer'('fontsize') = j); # end if; # end do; #end proc: maplet:=Maplet( onstartup = 'A1', Window['hlavni']('menubar' = 'MB1', 'resizable' = 'false', 'title' = "Vysetreni kvadrik", [ BoxLayout( BoxColumn( "Zadejte obecnou rovnici kvadriky:", TextField['rceKvadriky'](""), # TextField['nazevKroku'](), TextBox['doprovodnyText']('height' = 13, 'editable' = false), MathMLViewer['MMLViewer']('fontsize' = 12, 'width' = 600, 'height' = 250), [ Button['btnMain']("Zahajit vypocet", 'onclick' = 'A2'), Button['btnNew']("Zadat novou rovnici", 'onclick' = 'A3', 'enabled' = 'false'), Button['btnChoose']("Vyber prikladu", RunWindow('vyberPrikladu')) ] ), BoxColumn('halign'='left','valign'='none', Plotter['plotter']('width' = 300, 'height' = 300), Slider['zoom'](1..51, defaultSize, 'showticks', 'majorticks'=5, 'minorticks'=1, 'snapticks'=false, 'onchange' = 'A6', 'visible' = false), CheckBox['ChB1']("zobrazit transformovanou kvadriku", 'onchange' = 'A5', 'enabled' = 'false'), CheckBox['ChB2']("zobrazit puvodni kvadriku", 'onchange' = 'A5', 'enabled' = 'false'), CheckBox['ChB3']("zobrazit hlavni roviny", 'onchange' = 'A5', 'enabled' = 'false'), CheckBox['ChB4']("zobrazit osy", 'onchange' = 'A5', 'enabled' = 'false'), CheckBox['ChB5']("zobrazit stred nebo vrchol", 'onchange' = 'A5', 'enabled' = 'false') ) ) ]), Window['vyberPrikladu']([ ["Vyberte si jeden z prikladu:"], [ListBox['LB1'](priklady, 'value' = priklady[1])], [Button("OK", 'onclick' = 'A4'), Button("Storno", CloseWindow('vyberPrikladu'))] ]), MenuBar['MB1']( Menu("Nastaveni", CheckBoxMenuItem("Ciselne vysledky", 'onclick' = 'A9', 'value' = 'false'), # Menu("Velikost pisma v algebraickem okne", # RadioButtonMenuItem['RBMI1']("10", 'group'='BG2'), # RadioButtonMenuItem['RBMI2']("11", 'group'='BG2'), # RadioButtonMenuItem['RBMI3']("12", 'group'='BG2'), # RadioButtonMenuItem['RBMI4']("13", 'group'='BG2', 'value' = 'true'), # RadioButtonMenuItem['RBMI5']("14", 'group'='BG2'), # RadioButtonMenuItem['RBMI6']("15", 'group'='BG2'), # RadioButtonMenuItem['RBMI7']("16", 'group'='BG2'), # RadioButtonMenuItem['RBMI8']("17", 'group'='BG2'), # RadioButtonMenuItem['RBMI9']("18", 'group'='BG2') # ), Menu("Kvalita vykreslovani", RadioButtonMenuItem['RBMI10']("nizka", 'group'='BG1'), RadioButtonMenuItem['RBMI11']("stredni", 'group'='BG1', 'value' = 'true'), RadioButtonMenuItem['RBMI12']("vysoka", 'group'='BG1'), RadioButtonMenuItem['RBMI13']("nejlepsi", 'group'='BG1') ) ) ), ButtonGroup['BG1']('onchange' = 'A7'), # ButtonGroup['BG2']('onchange' = 'A8'), Action['A1']( RunWindow('hlavni'), Evaluate(function = 'init()'), Evaluate('plotter'= 'prazdnop') ), Action['A2']( Evaluate(function = 'dalsiKrok()') ), Action['A3']( SetOption('btnMain'('caption') = "Zahajit vypocet"), SetOption('btnNew'('enabled') = 'false'), SetOption('ChB1'('enabled') = 'false'), SetOption('ChB2'('enabled') = 'false'), SetOption('ChB3'('enabled') = 'false'), SetOption('ChB4'('enabled') = 'false'), SetOption('ChB5'('enabled') = 'false'), SetOption('ChB1'('value') = 'false'), SetOption('ChB2'('value') = 'false'), SetOption('ChB3'('value') = 'false'), SetOption('ChB4'('value') = 'false'), SetOption('ChB5'('value') = 'false'), SetOption('zoom'('visible') = 'false'), SetOption('zoom'('value') = defaultSize), SetOption('btnChoose'('enabled') = 'true'), SetOption('btnMain'('enabled') = 'true'), SetOption('rceKvadriky'('editable') = 'true'), SetOption('rceKvadriky'('focus') = 'true'), Evaluate(function = 'init()'), Evaluate('plotter'= 'prazdnop') ), Action['A4']( Evaluate('rceKvadriky' = 'upravPriklad()'), # SetOption('btnMain'('caption') = "Zahajit vypocet"), Evaluate(function = 'init()'), CloseWindow('vyberPrikladu') ), Action['A5']( Evaluate(function = 'prekresli()') ), Action['A6']( Evaluate(function = 'kresli(zoom)'), Evaluate(function = 'prekresli()') ), Action['A7']( Evaluate(function = 'nastavKvalitu()'), Evaluate(function = 'kresli(zoom)'), Evaluate(function = 'prekresli()') ), Action['A8']( Evaluate(function = 'nastavVelikostPisma()') ), Action['A9']( Evaluate(function = 'prepniNumerickeVypocty()') ) ): Maplets[Display](maplet); Warning, the protected names norm and trace have been redefined and unprotectedWarning, the name changecoords has been redefined