{{ tocSubheader }}
| {{ 'ml-lesson-number-slides' | message : article.intro.bblockCount }} |
| {{ 'ml-lesson-number-exercises' | message : article.intro.exerciseCount }} |
| {{ 'ml-lesson-time-estimation' | message }} |
Appe (Diskussion | bidrag) (Redigerar graf symmetrilinje345 via JXMagician.) | Appe (Diskussion | bidrag) (Redigerar graf symmetrilinje345 via JXMagician.) | ||
Rad 28: | Rad 28: | ||
function fnc(x) { | function fnc(x) { | ||
− | + | return (p1.Y() - p2.Y())*JXG.Math.pow((x-p2.X())/(p1.X() - p2.X()), 2) + p2.Y(); | |
} | } | ||
Rad 36: | Rad 36: | ||
var graph = b.board.create('functiongraph', [function(x) {return fnc(x);},function() { | var graph = b.board.create('functiongraph', [function(x) {return fnc(x);},function() { | ||
− | + | if(n.Y() > 12){ | |
− | + | return p2.X() - 3; | |
− | + | }else if(n.X() > 12){ | |
− | + | return p2.X() - 8; | |
− | + | }else{ | |
− | + | return xLeft - 1; | |
− | + | } | |
}, function() { | }, function() { | ||
− | + | if(n.Y() > 12){ | |
− | + | return p2.X() + 3; | |
− | + | }else if(n.X() > 12){ | |
− | + | return p2.X() + 8; | |
− | + | }else{ | |
− | + | return xRight + 1; | |
− | + | } | |
}],{strokeWidth:2,doAdvancedPlot:false,numberPointsLow:50,numberPointsHigh:50}); | }],{strokeWidth:2,doAdvancedPlot:false,numberPointsLow:50,numberPointsHigh:50}); | ||
− | var flyttaMig = b. | + | var flyttaMig = b.txt(-6.5,-2,'<!--T:23--> Drag mig!',{mathMode:false}); |
− | var flyttaMig2 = b. | + | var flyttaMig2 = b.txt(4,3.5,'<!--T:24--> Drag mig!',{mathMode:false}); |
/* Symmetrilinje */ | /* Symmetrilinje */ | ||
Rad 64: | Rad 64: | ||
var symText = b.textA(9,10,'<!--T:14--> Symmetrilinje',{flag:true}); | var symText = b.textA(9,10,'<!--T:14--> Symmetrilinje',{flag:true}); | ||
$(b.getId(symText)).css({ | $(b.getId(symText)).css({ | ||
− | + | "text-align":"center", | |
− | + | "padding":"4px", | |
}); | }); | ||
b.changeText(symText, '<!--T:15--> Symmetrilinje'); | b.changeText(symText, '<!--T:15--> Symmetrilinje'); | ||
Rad 77: | Rad 77: | ||
var nFlag = b.node(fAngle, fDist); | var nFlag = b.node(fAngle, fDist); | ||
var nFlagPos = b.node( | var nFlagPos = b.node( | ||
− | + | function() {return p2.X() + Math.cos(nFlag.X() * 2*Math.PI/360) * nFlag.Y();}, | |
− | + | function () {return p2.Y() + Math.sin(nFlag.X() * 2*Math.PI/360) * nFlag.Y();} | |
− | + | ); | |
var extremeFlag = b.textA(function() {return nFlagPos.X();}, function() {return nFlagPos.Y();}, '<!--T:16--> Maximum', {flag:true}); | var extremeFlag = b.textA(function() {return nFlagPos.X();}, function() {return nFlagPos.Y();}, '<!--T:16--> Maximum', {flag:true}); | ||
var flagSegment = b.segment(p2, nFlagPos, {strokeWidth:1}); | var flagSegment = b.segment(p2, nFlagPos, {strokeWidth:1}); | ||
Rad 85: | Rad 85: | ||
$(b.getId(extremeFlag)).css({ | $(b.getId(extremeFlag)).css({ | ||
− | + | "text-align":"center", | |
− | + | "padding":"4px", | |
− | + | "min-width":"19%" | |
}); | }); | ||
Rad 105: | Rad 105: | ||
var down = false; | var down = false; | ||
p2.on('drag', function() { | p2.on('drag', function() { | ||
− | + | if(!down){ | |
− | + | b.hide([flyttaMig, flyttaMig2]); | |
− | + | //Göm saker medan extrempunkten flyttas | |
− | + | if (!isAnimating) { | |
− | + | b.hide(symText); | |
− | + | b.hide([extremeFlag, flagSegment]); | |
− | + | n2.moveTo([2, 12]); | |
− | + | hasPressedDown = true; | |
− | + | } | |
− | + | down = true; | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | if(flyttvis){ | |
− | + | b.hide([flyttaMig, flyttaMig2]); | |
− | + | flyttvis = false; | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | /* Se till att punkten håller sig inom ramarna */ | ||
+ | if (p2.X() < xMin) { | ||
+ | p2.moveTo([xMin, p2.Y()]); | ||
+ | } | ||
+ | else if (p2.X() > xMax) { | ||
+ | p2.moveTo([xMax, p2.Y()]); | ||
+ | } | ||
+ | if (p2.Y() < yMin) { | ||
+ | p2.moveTo([p2.X(), yMin]); | ||
+ | } | ||
+ | else if (p2.Y() > yMax) { | ||
+ | p2.moveTo([p2.X(), yMax]); | ||
+ | } | ||
− | + | /* Se till att punkten inte kommer för nära den andra punkten */ | |
− | + | if (Math.abs(p2.X() - p1.X()) < clipDistX) { | |
− | + | var dSign = Math.sign(p2.X() - p1.X()); | |
− | + | if (dSign === 0) { | |
− | + | dSign = 1; | |
− | + | } | |
− | + | if (Math.abs(p1.X() - xMax) < 1*clipDistX) { | |
− | + | dSign = -1; | |
− | + | } | |
− | + | else if (Math.abs(p1.X() - xMin) < 1*clipDistX) { | |
− | + | dSign = 1; | |
− | + | } | |
− | + | p2.moveTo([p1.X() + dSign*clipDistX, p2.Y()]); | |
+ | } | ||
+ | |||
+ | |||
+ | if (Math.abs(p2.Y() - p1.Y()) < clipDistY) { | ||
+ | dSign = Math.sign(p2.Y() - p1.Y()); | ||
+ | if (dSign === 0) { | ||
+ | dSign = 1; | ||
+ | } | ||
+ | if (Math.abs(p1.Y() - yMax) < 1*clipDistY) { | ||
+ | dSign = -1; | ||
+ | } | ||
+ | else if (Math.abs(p1.Y() - yMin) < 1*clipDistY) { | ||
+ | dSign = 1; | ||
+ | } | ||
+ | p2.moveTo([p2.X(), p1.Y() + dSign*clipDistY]); | ||
+ | } | ||
}); | }); | ||
Rad 170: | Rad 170: | ||
p1.on('<!--T:18--> drag', function() { | p1.on('<!--T:18--> drag', function() { | ||
− | + | if(flyttvis){ | |
− | + | b.hide([flyttaMig, flyttaMig2]); | |
− | + | flyttvis = false; | |
− | + | } | |
− | + | ||
− | + | /* Se till att punkten håller sig inom ramarna */ | |
− | + | if (p1.X() < xMin) { | |
− | + | p1.moveTo([xMin, p1.Y()]); | |
− | + | } | |
− | + | else if (p1.X() > xMax) { | |
− | + | p1.moveTo([xMax, p1.Y()]); | |
− | + | } | |
− | + | if (p1.Y() < yMin) { | |
− | + | p1.moveTo([p1.X(), yMin]); | |
− | + | } | |
− | + | else if (p1.Y() > yMax) { | |
− | + | p1.moveTo([p1.X(), yMax]); | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | /* Se till att punkten inte kommer för nära den andra punkten */ | ||
+ | if (Math.abs(p1.X() - p2.X()) < clipDistX) { | ||
+ | var dSign = Math.sign(p1.X() - p2.X()); | ||
+ | if (dSign === 0) { | ||
+ | dSign = 1; | ||
+ | } | ||
+ | if (Math.abs(p2.X() - xMax) < 1*clipDistX) { | ||
+ | dSign = -1; | ||
+ | } | ||
+ | else if (Math.abs(p2.X() - xMin) < 1*clipDistX) { | ||
+ | dSign = 1; | ||
+ | } | ||
+ | p1.moveTo([p2.X() + dSign*clipDistX, p1.Y()]); | ||
+ | } | ||
− | + | ||
− | + | if (Math.abs(p1.Y() - p2.Y()) < clipDistY) { | |
− | + | dSign = Math.sign(p1.Y() - p2.Y()); | |
− | + | if (dSign === 0) { | |
− | + | dSign = 1; | |
− | + | } | |
− | + | if (Math.abs(p2.Y() - yMax) < 1*clipDistY) { | |
− | + | dSign = -1; | |
− | + | } | |
− | + | else if (Math.abs(p2.Y() - yMin) < 1*clipDistY) { | |
− | + | dSign = 1; | |
− | + | } | |
− | + | p1.moveTo([p1.X(), p2.Y() + dSign*clipDistY]); | |
− | + | } | |
− | + | ||
− | + | /* Byt texten som anger sortens extrempunkt */ | |
− | + | if (p1.Y() < p2.Y()) { | |
− | + | b.changeText(extremeFlag, '<!--T:19--> Maximum'); | |
− | + | } | |
− | + | else { | |
− | + | b.changeText(extremeFlag, '<!--T:20--> Minimum'); | |
+ | } | ||
}); | }); | ||
p2.on('up', function() { | p2.on('up', function() { | ||
− | + | if (!isAnimating) { | |
− | + | if (hasPressedDown) { | |
− | + | isAnimating = true; | |
− | + | p1.setAttribute({fixed:true}); | |
− | + | p2.setAttribute({fixed:true}); | |
− | + | ||
− | + | /* Förbered symmetrilinjen */ | |
− | + | n2.moveTo([p2.X(), 12]); | |
− | + | n1.moveTo([p2.X(), 12]); | |
− | + | /* Förbered label för symmetrilinjen */ | |
− | + | if (p2.Y() > 0) { | |
− | + | symText.moveTo([p2.X(), yBottom + 1.5]); | |
− | + | } | |
− | + | else { | |
− | + | symText.moveTo([p2.X(), yTop - 1.5]); | |
− | + | } | |
− | + | if (symText.X() > xRight - 3) { | |
− | + | symText.moveTo([xRight - 3, symText.Y()]); | |
− | + | } | |
− | + | if (symText.X() < xLeft + 3) { | |
− | + | symText.moveTo([xLeft + 3, symText.Y()]); | |
− | + | } | |
− | + | /* Förbered flagga för extrempunkten */ | |
− | + | var flagUp = true; | |
− | + | var flagRight = true; | |
− | + | if (p1.Y() < p2.Y()) { | |
− | + | b.changeText(extremeFlag, '<!--T:21--> Maximum'); | |
− | + | flagUp = true; | |
− | + | } | |
− | + | else { | |
− | + | b.changeText(extremeFlag, '<!--T:22--> Minimum'); | |
− | + | flagUp = false; | |
− | + | } | |
− | + | var flagDist = 3.5; | |
− | + | if (p2.X() < 0) { | |
− | + | flagRight = false; | |
− | + | } | |
− | + | else { | |
− | + | flagRight = true; | |
− | + | } | |
− | + | if (xMax - p2.X() < flagDist) { | |
− | + | flagRight = false; | |
− | + | } | |
− | + | else if (-xMin + p2.X() < flagDist) { | |
− | + | flagRight = true; | |
− | + | } | |
− | + | if (flagRight){ | |
− | + | nFlag.moveTo([fAngle,fDist]); | |
− | + | } | |
− | + | else { | |
− | + | nFlag.moveTo([180 - fAngle,fDist]); | |
− | + | } | |
− | + | if (!flagUp) { | |
− | + | nFlag.moveTo([-nFlag.X(),fDist]); | |
− | + | } | |
− | + | ||
− | + | var animTimer = 0; | |
− | + | /* Animera symmetrilinjen */ | |
− | + | n2.moveTo([p2.X(), -12], animTimer += 1000); | |
− | + | /* Visa label för symmetrilinje */ | |
− | + | setTimeout(function() {b.show(symText);}, animTimer += 300); | |
− | + | /* Visa flagga för extrempunkten */ | |
− | + | setTimeout(function() {b.show([extremeFlag, flagSegment]);}, animTimer += 500); | |
− | + | setTimeout(function() { | |
− | + | p1.setAttribute({fixed:false}); | |
− | + | p2.setAttribute({fixed:false}); | |
− | + | isAnimating = false; | |
− | + | hasPressedDown = false; | |
− | + | }, animTimer); | |
− | + | } | |
− | + | } | |
− | + | down = false; | |
}); | }); | ||
</jsxgpre> | </jsxgpre> |
Två punkter på varsin halva med samma y-koordinat, t.ex. funktionens nollställen, ligger alltid på samma avstånd från symmetrilinjen. Symmetrilinjens ekvation anger vilket x-värde, a, som linjen ligger på.
xs=a
Det finns olika metoder för att bestämma symmetrilinjen. Ibland kan man läsa av den direkt i koordinatsystemet och har man funktionsuttrycket kan man använda pq-formeln.