Bastian
Aus LNTwww
<!DOCTYPE html>
<html> <head>
<title>Periodendauer T0 periodischer Signale</title> <style> body { display: flex; justify-content: center; }
input { height: 30px; width: 60px; }
input[type="checkbox"] { height: 20px; width: 20px; }
.flex-center { display: flex; justify-content: center; }
.text-center { text-align: center; }
.label-y-axis { display: flex; justify-content: flex-start; }
.grid { display: flex; }
.align-vertical { display: flex; align-items: center; }
.margin-left-1 { margin-left: 5px; }
.margin-right-2 { margin-right: 10px; }
.margin-bottom-1 { margin-bottom: 10px; }
.margin-top-1 { margin-top: 5px; }
.boarderedall { border: 1px solid black; padding: 5px; }
.bordered { border: 1px solid red; padding: 5px; }
.color-blue { color: blue; font-weight: 600; }
.color-red { color: red; font-weight: 600; } </style>
</head> <body onload="canvasWidthWithDelay()" onresize="calculateWidth()"> <div class="text-center boarderedall">
<h1>Periodendauer T<sub>0</sub> periodischer Signale</h1> <!-- Input fields --> <div class="margin-bottom-1 flex-center"> <div class="margin-right-2"> <i>A</i><sub> 1</sub> = <input onclick="drawGraph()" type="number" id="a1" placeholder="a1" value="0.5" min="0" max="1" step="0.05"> V </div> <div class="margin-right-2"> <i>f</i><sub> 1</sub> = <input onclick="drawGraph()" type="number" id="f1" placeholder="f1" value="1" min="0" max="10" step="0.1"> kHz </div> <div class="margin-right-2"> <i>φ</i><sub> 1</sub> = <input onclick="drawGraph()" type="number" id="phi1" placeholder="phi1" value="0" min="-180" max="180" step="5"> Grad </div> </div> <div class="margin-bottom-1 flex-center"> <div class="margin-right-2"> <i>A</i><sub> 2</sub> = <input onclick="drawGraph()" type="number" id="a2" placeholder="a2" value="0.5" min="0" max="1" step="0.05"> V </div> <div class="margin-right-2"> <i>f</i><sub> 2</sub> = <input onclick="drawGraph()" type="number" id="f2" placeholder="f2" value="2" min="0" max="10" step="0.1"> kHz </div> <div class="margin-right-2"> <i>φ</i><sub> 2</sub> = <input onclick="drawGraph()" type="number" id="phi2" placeholder="phi2" value="90" min="-180" max="180" step="5"> Grad </div> </div> <div class="margin-bottom-1"> <!-- Formel für x(t) --> <span class="bordered"> <i>x(t)</i> = <i>A</i><sub><sub>1</sub></sub> ⋅ <i>cos</i> (2π<i>f</i><sub><sub>1</sub></sub> ⋅ <i>t</i> - <i>φ</i><sub>1</sub>) + <i>A</i><sub>2</sub> ⋅ cos (2π <i>f</i><sub>2</sub> ⋅ <i>t</i> - <i>φ</i><sub>2</sub>) </span> </div>
<!-- Ausgabe Periodendauer, Funktionswerte x(t) und Eingabefeld t --> <div class="margin-bottom-1 flex-center"> <div class="margin-right-2 align-vertical"> t = <input onclick="displayY(); drawGraph();" type="number" id="t" placeholder="t" value="0.5" min="0" max="10" step="0.02"> ms </div> <div class="margin-right-2 align-vertical color-red"> <span>x(t) = <span id="y-value"></span> V</span> </div> <div class="margin-right-2 align-vertical color-blue"> <span>T<sub>0</sub> = <span id="t0"></span> ms</span> </div> </div>
<!-- Beschriftung x-Achse--> <div class="label-y-axis"> x(t) / V</div> <div class="grid"> <div> <canvas width="1000" height="400" id="graph-view"></canvas> </div> <div class="align-vertical"> <span class="margin-left-1">t / ms</span> </div> </div>
<div class="flex-center"> <label class="align-vertical" onclick="drawGraph()"> <input type="checkbox" id="show-grid-layout" checked> Gitter anzeigen </label> <label class="align-vertical margin-left-1" onclick="drawGraph()"> <input type="checkbox" id="show-coordinates" checked> Koordinatensystem anzeigen </label> </div> <div> Abszisse<input type="number" step="1" min="5" max="12" value="12" id="abscissa" onclick="drawGraph()"> Ordinaten<input type="number" class="margin-left-1" step="0.5" min="0.5" max="2" value="2" id="ordinates" onclick="drawGraph()">
</div>
</div>
<script>
// Define fields var a1, a2, f1, f2, phi1, phi2, canvas, ctx, canvasWidth, canvasHeight, showGrid, currentT;
// Constants var offset = 30; // in px var maxX = 12; // Abscissa var maxY = 2; // Ordinate
drawGraph();
function canvasWidthWithDelay() { setTimeout(calculateWidth(), 1000); }
function calculateWidth() { var currentBodyWidth = document.getElementsByTagName('body')[0].offsetWidth; console.log('Calculating width', currentBodyWidth); document.getElementById('graph-view').width = Math.round(currentBodyWidth * 0.8); drawGraph(); }
function fillVariables() { a1 = parseFloat(document.getElementById('a1').value); a2 = parseFloat(document.getElementById('a2').value); f1 = parseFloat(document.getElementById('f1').value); f2 = parseFloat(document.getElementById('f2').value); phi1 = parseFloat(document.getElementById('phi1').value); phi2 = parseFloat(document.getElementById('phi2').value); currentT = parseFloat(document.getElementById('t').value); maxX = parseFloat(document.getElementById('abscissa').value); maxY = parseFloat(document.getElementById('ordinates').value);
validateInputs();
canvas = document.getElementById('graph-view'); canvasWidth = canvas.width; canvasHeight = canvas.height; ctx = canvas.getContext("2d"); showGrid = document.getElementById('show-grid-layout').checked; showCoordinates = document.getElementById('show-coordinates').checked;
console.log('Updated variables', a1, a2, f1, f2, phi1, phi2); console.log('Canvas size', canvasHeight, ' x ', canvasWidth); console.log('Show grid', showGrid); }
function drawGraph() { fillVariables(); displayY(); displayT0(); ctx.clearRect(0, 0, canvasWidth, canvasHeight); ctx.strokeStyle = "#000000"; ctx.fillStyle = "#000000"; if (showCoordinates) { // Draw x-axis ctx.beginPath(); ctx.moveTo(0, canvasHeight / 2); ctx.lineTo(canvasWidth, canvasHeight / 2); ctx.stroke();
// Draw y-axis ctx.beginPath(); ctx.moveTo(offset, offset); ctx.lineTo(offset, canvasHeight); ctx.stroke();
// Draw triangle for x-axis ctx.beginPath(); ctx.moveTo(canvasWidth, canvasHeight / 2); ctx.lineTo(canvasWidth - offset, canvasHeight / 2 + 5); ctx.lineTo(canvasWidth - offset, canvasHeight / 2 - 5); ctx.fill();
// Draw triangle for y-axis ctx.beginPath(); ctx.moveTo(offset, 0); ctx.lineTo(offset - 5, offset); ctx.lineTo(offset + 5, offset); ctx.fill(); } // Draw labels and grid var font_size = 15; var width_x = (canvasWidth - 2 * offset) / maxX; ctx.font = font_size + "px Arial";
// Draw vertical lines for (var i = 0; i < maxX; i++) { if (showCoordinates) { ctx.fillText(i, offset - font_size / 2 + width_x * i, canvasHeight / 2 + 15); } if (showGrid) { ctx.beginPath(); ctx.lineWidth = 1; ctx.strokeStyle = "lightgrey"; ctx.moveTo(offset + width_x * (i + 1), 0); ctx.lineTo(offset + width_x * (i + 1), canvasHeight); ctx.stroke(); } }
var width_y = (canvasHeight - 2 * offset) / (maxY * 2); // Called T in Mathematics // Draw horizontal lines for (var i = 2; i >= -2; i -= 0.5) { if (i != 0 || !showCoordinates) { if (showCoordinates) { ctx.fillText(i, offset - font_size - 10, offset + width_y * (i * -1 + maxY)); } if (showGrid) { ctx.beginPath(); ctx.lineWidth = 1; ctx.strokeStyle = "lightgrey"; ctx.moveTo(offset, offset + width_y * (i * -1 + maxY)); ctx.lineTo(canvasWidth - offset, offset + width_y * (i * -1 + maxY)); ctx.stroke(); } }
}
// Draw t0 ctx.beginPath(); ctx.lineWidth = 2; ctx.strokeStyle = "#0000FF"; ctx.moveTo(offset + width_x * getT0(), 0); ctx.lineTo(offset + width_x * getT0(), canvasHeight); ctx.stroke(); // Write t0 label ctx.fillStyle = '#0000FF'; ctx.fillText(getT0() + ' ms', (offset + width_x * getT0()) + 5, 20); ctx.fillStyle = 'black'; // Reset color
var firstResult = periodicalSignal(0, a1, a2, f1, f2, phi1, phi2);
ctx.beginPath(); ctx.lineWidth = 1; ctx.strokeStyle = "#FF0000"; ctx.moveTo(offset, canvasHeight / 2 - firstResult * width_y); for (var t = 0; t < maxX; t += 0.01) { var result = periodicalSignal(t, a1, a2, f1, f2, phi1, phi2); ctx.lineTo(offset + width_x * t, canvasHeight / 2 - result * width_y); } ctx.stroke();
// Draw T0 var result = periodicalSignal(currentT, a1, a2, f1, f2, phi1, phi2); console.log('Current T is ', currentT, result); // Draw dot ctx.beginPath(); ctx.fillStyle = 'red'; ctx.arc(offset + width_x * currentT, canvasHeight / 2 - result * width_y, 3, 0, 2 * Math.PI, true); ctx.fill(); }
function periodicalSignal(t, a1, a2, f1, f2, phi1, phi2) { return a1 * Math.cos(2 * Math.PI * f1 * t - toRadians(phi1)) + a2 * Math.cos(2 * Math.PI * f2 * t - toRadians(phi2)); }
function toRadians(angle) { return angle * (Math.PI / 180); }
function displayY() { var currentT = parseFloat(document.getElementById('t').value); var result = periodicalSignal(currentT, a1, a2, f1, f2, phi1, phi2); var result_rounded = Math.round(result * 1000) / 1000; document.getElementById('y-value').textContent = result_rounded; }
function displayT0() { var result_rounded2 = Math.round(getT0() * 100) / 100; document.getElementById('t0').textContent = result_rounded2; }
function getT0() {
// Get A and B
var A, B, C, Q; // A = smallest frequency, B = Highest frequency; C = GCD; Q = Helper for GCD if (f1 < f2) { A = f1; B = f2; } else { B = f1; A = f2; }
if (f1 === 0) { console.log('T0 is now ', 1 / f2); return 1 / f2; }
if (f2 === 0) { return 1 / f1; }
// Find Greatest common divisor for (var x = 1; x <= 10; x++) { C = A / x; // KHZ Q = B / C;
// if ((1 / C) == 15) { // return 5; // } // if ((1 / C) == 30) { // return 10; // }
if (isInt(Q)) { return 1 / C; } if (x === 10) { return 10; }
}
}
function isInt(n) { // Überprüft ob Zahl gerade ist return n % 1 === 0; }
function validateInputs() { // Upper boundaries if (a1 > 1) { document.getElementById('a1').value = 1; a1 = 1; }
if (a2 > 1) { document.getElementById('a2').value = 1; a2 = 1; }
if (f1 > 10) { document.getElementById('f1').value = 10; f1 = 10; }
if (f2 > 10) { document.getElementById('f2').value = 10; f2 = 10; }
if (phi1 > 180) { document.getElementById('phi1').value = 180; phi1 = 180; }
if (phi2 > 180) { document.getElementById('phi2').value = 180; phi2 = 180; }
// Lower boundaries if (a1 < 0) { document.getElementById('a1').value = 0; a1 = 0; }
if (a2 < 0) { document.getElementById('a2').value = 0; a2 = 0; }
if (f1 < 0) { document.getElementById('f1').value = 0; f1 = 0; }
if (f2 < 0) { document.getElementById('f2').value = 0; f2 = 0; }
if (phi1 < -180) { document.getElementById('phi1').value = -180; phi1 = -180; }
if (phi2 < -180) { document.getElementById('phi2').value = -180; phi2 = -180; }
if (maxX < 1) { document.getElementById('abscissa').value = 1; maxX = 1; }
if (maxY < 0.5) { document.getElementById('ordinates').value = 0.5; maxY = 0.5; } } document.addEventListener('keydown', function (key) { if (key.keyCode === 13) { // Enter pressed console.log('Enter pressed!'); drawGraph(); } });
</script>
</body>
</html>