Статья по теме:
Демо JavaScript:
масштаб
сдвиг по x
сдвиг по y
наклон
// x = (1 + cos(t)) * cos(t) // y = (1 + cos(t)) * sin(t) // t принадлежит промежутку [0; 2п] var t, x, y, nX, nY, oldX, oldqY; let scl, DX, DY, Rotate; var canvas = document.getElementById('cvs'); var ctx = canvas.getContext('2d'); // отрисовка графика function Init() { scl = Number(document.getElementById('scale').value); // масштаб DX = Number(document.getElementById('shiftX').value); // сдвиг по х DY = Number(document.getElementById('shiftY').value); // сдвиг по у Rotate = Number(document.getElementById('rotate').value); // наклон Rotate = (Math.PI / 180) * Rotate; ctx.clearRect(0, 0, 500, 500); nX = (1 + Math.cos(0)) * Math.cos(0) * scl; nY = (1 + Math.cos(0)) * Math.sin(0) * scl; // получение координат oldX = nX * Math.cos(Rotate) - nY * Math.sin(Rotate); oldY = nX * Math.sin(Rotate) + nY * Math.cos(Rotate); // отрисовка for(t = 0; t < 10 * Math.PI; t += 0.01){ // вычисление начальных координат точек х и у nX = (1 + Math.cos(t)) * Math.cos(t) * scl; nY = (1 + Math.cos(t)) * Math.sin(t) * scl; // вычисление текущих координат с учётом поворота x = nX * Math.cos(Rotate) - nY * Math.sin(Rotate); y = nX * Math.sin(Rotate) + nY * Math.cos(Rotate); ctx.beginPath(); ctx.moveTo(oldX + DX, oldY + DY); ctx.lineTo(x + DX, y + DY); ctx.stroke(); oldX = x; oldY = y; } } // выравнивание графика function Start() { // получение координат и заполнение по ним var tmpX = (1 + Math.cos(0)) * Math.cos(0); var minX = tmpX, maxX = tmpX; var tmpY = (1 + Math.cos(0)) * Math.sin(0); var minY = tmpY, maxY = tmpY; for(t = 0; t < 10 * Math.PI; t += 0.01){ y = (1 + Math.cos(t)) * Math.cos(t); x = (1 + Math.cos(t)) * Math.sin(t); // сохранение значений координат if(x > maxX) { maxX = x; } if(x < minX) { minX = x; } if(y > maxY) { maxY = y; } if(y < minY) { minY = y; } } // подгоняет под размер экрана tmpX = 500 / (maxX - minX); tmpY = 500 / (maxY - minY); if(tmpX < tmpY) { scl = tmpX; } else { scl = tmpY; } DX = 250; DY = 250; Rotate = 0; // передача новых значений document.getElementById("scale").value = scl; document.getElementById("shiftX").value = DX; document.getElementById("shiftY").value = DY; document.getElementById("rotate").value = Rotate; ctx.clearRect(0, 0, 500, 500); // получение координат oldX = (1 + Math.cos(0)) * Math.cos(0) * scl; oldY = (1 + Math.cos(0)) * Math.sin(0) * scl; for(t = 0; t < 10 * Math.PI; t += 0.01){ // вычисление координат для графика x = (1 + Math.cos(t)) * Math.cos(t) * scl; y = (1 + Math.cos(t)) * Math.sin(t) * scl; ctx.beginPath(); ctx.moveTo(oldX + DX, oldY + DY); ctx.lineTo(x + DX, y + DY); ctx.stroke(); oldX = x; oldY = y; } }
Прикрепленный файл | Размер |
---|---|
2. Построение параметрических графиков функций с масштабированием и поворотом.zip | 5.53 кб |