Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.08.2022, 17:47
Аспирант
Отправить личное сообщение для IZUM Посмотреть профиль Найти все сообщения от IZUM
 
Регистрация: 21.08.2022
Сообщений: 57

Как в JawaScript Canvas нарисовать различные графики на разных участках числовой оси
Как в JawaScript Canvas нарисовать различные графики на разных участках числовой оси Х в Декартовой системе координат ?
Ответить с цитированием
  #2 (permalink)  
Старый 23.08.2022, 18:27
Аспирант
Отправить личное сообщение для IZUM Посмотреть профиль Найти все сообщения от IZUM
 
Регистрация: 21.08.2022
Сообщений: 57

Обычно, в JS на всей числовой оси X строиться график одной функции, например y(x) = x^2, на участке от 0 до 10, тоже например. А, надо построить графики нескольких функций на нескольких участках: y1(x) = x+1 на участке от 0 до 2; y2(x) = x^2+4 на участке от 2 до 5;y3(x) = x^2+2*x+1 на участке от 5 до 10; Фукции и интервалы выбраны совершенно произвольно.
Ответить с цитированием
  #3 (permalink)  
Старый 23.08.2022, 19:37
Аспирант
Отправить личное сообщение для IZUM Посмотреть профиль Найти все сообщения от IZUM
 
Регистрация: 21.08.2022
Сообщений: 57

Следует добавить, что это всё надо сделать на одной числовой оси Х
Ответить с цитированием
  #4 (permalink)  
Старый 23.08.2022, 20:25
Аватар для Alikberov
Кандидат Javascript-наук
Отправить личное сообщение для Alikberov Посмотреть профиль Найти все сообщения от Alikberov
 
Регистрация: 16.08.2018
Сообщений: 109

<html><head>
<script>
function DrawFn() {
	var	ctx = document.querySelector("canvas").getContext("2d");
	var	drawer = ctx.moveTo.bind(ctx);
	var	i, x0, x1, x2, x, y, el, fn, range;
	ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
	for(i = 1; i <= 3; ++ i) {
		el = document.getElementById("Fn" + i);	// Обращаемся к одному из input-элементов
		fn = el.value.split(/:/)[1];		// Выражение функции справа от двоеточия
		range = el.value.split(/:/)[0].split("..");	// Интервал участка задаётся форматом "от..до" слева от двоеточия
		x1 = parseInt(range[0]);
		x2 = parseInt(range[1])
		ctx.strokeStyle = el.style.color;	// Цвет линии графика соответствует цвету input-текста
		ctx.beginPath();
		for(x0 = 0; x0 < ctx.canvas.width; ++ x0) {
			x = x0 / ctx.canvas.width * (x2 - x1) - x1;
			try {
				with(Math) {
					drawer(x0, ctx.canvas.height - eval(fn));
				}
			} catch(err) {
				break;
			}
			drawer = ctx.lineTo.bind(ctx);
		}
		ctx.stroke();
	}
}
</script>
</head>

<body onload='DrawFn()'>
Y1(x)=<input type=text id=Fn1 value='0..10:x**2' onchange='DrawFn()' style=color:magenta><br>
Y2(x)=<input type=text id=Fn1 value='0..2:x+1' onchange='DrawFn()' style=color:red><br>
Y3(x)=<input type=text id=Fn2 value='2..5:x**2+4' onchange='DrawFn()' style=color:orange><br>
Y4(x)=<input type=text id=Fn3 value='5..10:x**2+2*x+1' onchange='DrawFn()' style=color:blue><br>
<canvas width=800px height=600px></canvas>
</body>

Последний раз редактировалось Alikberov, 23.08.2022 в 22:22.
Ответить с цитированием
  #5 (permalink)  
Старый 23.08.2022, 21:56
Аспирант
Отправить личное сообщение для IZUM Посмотреть профиль Найти все сообщения от IZUM
 
Регистрация: 21.08.2022
Сообщений: 57

Правильно ли, я понял, что графики выходят из отной точки - 0 ? Если, это так, то извините - это не совсем то, что требуется. В дествительности каждый из трёх графиков должен быть построен на указанном ему интервале на одной числовой оси Х
Ответить с цитированием
  #6 (permalink)  
Старый 23.08.2022, 22:15
Аспирант
Отправить личное сообщение для IZUM Посмотреть профиль Найти все сообщения от IZUM
 
Регистрация: 21.08.2022
Сообщений: 57

Думаю, надо добавить то, что это просто линии, так как не показаны координатные оси с разметкой и числовыми значениями по осям Х и Y
Изображения:
Тип файла: jpg Screenshot_1.jpg (15.3 Кб, 3 просмотров)
Ответить с цитированием
  #7 (permalink)  
Старый 23.08.2022, 23:02
Аспирант
Отправить личное сообщение для IZUM Посмотреть профиль Найти все сообщения от IZUM
 
Регистрация: 21.08.2022
Сообщений: 57

Высылаю файлы JS и HTML, где построен только один график. Может быть при использовании этих файлов можно решить мою проблему: надо построить графики нескольких функций на нескольких участках: y1(x) = x+1 на участке от 0 до 2; y2(x) = x^2+4 на участке от 2 до 5;y3(x) = x^2-2*x+1 на участке от 5 до 10; Функции и интервалы выбраны совершенно произвольно. а это всё надо сделать на одной числовой оси Х.
Ответить с цитированием
  #8 (permalink)  
Старый 23.08.2022, 23:09
Аспирант
Отправить личное сообщение для IZUM Посмотреть профиль Найти все сообщения от IZUM
 
Регистрация: 21.08.2022
Сообщений: 57

К сожалению, не получилось, или я не знаю, как в сообщение вложить
файлы JS и HTML
const canvasPlot = document.getElementById(`canvas_plot`);
const ctx = canvasPlot.getContext(`2d`);

//Рисуем сетку
const canvasPlotWidth = canvasPlot.clientWidth;
const canvasPlotHeight = canvasPlot.clientHeight;

const scaleX = 30; //расстояние между элементами сетки по Х
const scaleY = 30; //расстояние между элементами сетки по Y

//Рисуем главные оси
       // Обычное расположение осей     
//const xAxis = canvasPlotWidth / 2; 
//const yAxis = canvasPlotHeight / 2;
       // Уточнённое расположение осей за счёт сдвига осей
const xAxis = Math.round(canvasPlotWidth / scaleX / 2) * scaleX; 
const yAxis = Math.round(canvasPlotHeight / scaleY / 2) * scaleY;

// Выбор шрифта и его вид, размер

ctx.font = `${Math.round(scaleX / 2)}px Arial`;
ctx.textAlign = `left`;
ctx.textBaseline = `top`;

ctx.beginPath();
ctx.strokeStyle = `#f5f0e8`;


var zz = 5; //Зазор между осями и числами нумерации чисел

for (let i = 0; i <= canvasPlotWidth; i = i + scaleX) {
	ctx.moveTo(i, 0);
	ctx.lineTo(i, canvasPlotHeight); // нанесение вертикальных линий разметки
	
	ctx.fillText((i - xAxis) / scaleX, i + zz, yAxis + zz); //нанесение числовых значений на ось Х
}

for (let i = 0; i <= canvasPlotHeight; i = i + scaleY) {
	ctx.moveTo(0, i);
	ctx.lineTo(canvasPlotWidth, i); // нанесение горизонтальных линий разметки
	
	ctx.fillText((yAxis - i) / scaleY, xAxis + zz, i + zz); //нанесение числовых значений на ось Y
}
ctx.stroke();
ctx.closePath(); //закрыть путь, чтобы рисовать новые линии другим цветом


var zxy = 20; //Зазор между осями и обозначением этих осей  x,y 
ctx.beginPath();
ctx.strokeStyle = `#000000`;
	ctx.moveTo(xAxis, 0);
	ctx.lineTo(xAxis, canvasPlotHeight);
	ctx.fillText(`y`, xAxis - zxy, 0 ); // означение оси Y
	ctx.moveTo(0, yAxis);
	ctx.lineTo(canvasPlotWidth, yAxis);
	ctx.fillText(`x`, canvasPlotWidth - zxy, yAxis - zxy ); // означение оси X
ctx.stroke();
ctx.closePath(); //закрыть путь, чтобы рисовать новые линии другим цветом

//ПРЕОБРАЗОВАНИЕ CANVAS СИСТЕМУ КООРДИНАТ В ДЕКАРТОВУ СИСТЕМУ КООРДИНАТ
// Рисуем график функции
ctx.fillStyle = `#ff0000`; // цвет графика чёрный
//ctx.lineWidth = 0.5  //толщина линии
for (let i = 0; i <= canvasPlotWidth; i++) {
	const x = (i - xAxis) / scaleX;
	const y = Math.pow(x, 2); 
	ctx.fillRect(x * scaleX + xAxis, yAxis - scaleY * y, 4, 4);
Ответить с цитированием
  #9 (permalink)  
Старый 23.08.2022, 23:14
Аспирант
Отправить личное сообщение для IZUM Посмотреть профиль Найти все сообщения от IZUM
 
Регистрация: 21.08.2022
Сообщений: 57

<!DOCTYPE html> 
<html> 
<head> 
 <meta charset="utf-8"> 
 <link href="./Graf.css" rel="stylesheet">
</head> 
<body style= "margin": 0;> 
 <canvas id="canvas_plot" width="700" height="500"></canvas>
 <script src="./Graf.js"></script>
</body> 

</html>
Ответить с цитированием
  #10 (permalink)  
Старый 23.08.2022, 23:16
Аспирант
Отправить личное сообщение для IZUM Посмотреть профиль Найти все сообщения от IZUM
 
Регистрация: 21.08.2022
Сообщений: 57

Ссылка на график file:///C:/Users/%D0%98%D0%97%D0%9E/Desktop/JS1/Graf.html
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Как нарисовать Солнце средствами HTML 5 Canvas? Antohsa Элементы интерфейса 2 18.09.2013 01:19
Как в canvas нарисовать одно изображение на другом? Dimaz Общие вопросы Javascript 0 29.07.2013 20:11
Как нарисовать один canvas в другом BorodinKO Общие вопросы Javascript 0 06.04.2012 18:20