1 const canvas = document.getElementsByTagName("canvas")[0];
2 const ctx = canvas.getContext("2d");
5 let centerF = [0.5, 0.5];
13 const coordinateToScreen = (x, y) => {
15 center[0] + x * scale,
16 center[1] + y * scale,
20 const screenToCoordinate = (x, y) => {
22 (x - center[0]) / scale,
23 (y - center[1]) / scale,
27 const evalPos = (a, b, c, x) => {
28 return a + (b + c * x) * x;
31 const lagrange = _ => {
35 for (let i = 0; i < positions.length; i++) {
36 let prod = positions[i][1];
38 for (let j = 0; j < positions.length; j++)
40 prod *= (x - positions[j][0]) / (positions[i][0] - positions[j][0]);
50 ctx.clearRect(0, 0, innerWidth, innerHeight);
52 for (let x = center[0] % scale; x < innerWidth; x += scale) {
53 ctx.lineWidth = x == center[0] ? 2 : 1;
56 ctx.lineTo(x, innerHeight);
60 for (let y = center[1] % scale; y < innerHeight; y += scale) {
61 ctx.lineWidth = y == center[1] ? 2 : 1;
64 ctx.lineTo(innerWidth, y);
73 for (let x = 0; x < innerWidth; x++) {
74 let y = Math.max(Math.min(center[1] + func((x - center[0]) / scale) * scale, +1e+37), -1e+37);
83 ctx.fillStyle = "blue";
85 for (let circle of positions) {
86 const [x, y] = coordinateToScreen(circle[0], circle[1]);
88 ctx.arc(x, y, scale * 0.1, 0, Math.PI * 2);
93 const addPosition = pos => {
99 const calculateCenter = _ => {
101 centerF[0] * innerWidth,
102 centerF[1] * innerHeight,
108 const resize = _ => {
109 canvas.width = innerWidth;
110 canvas.height = innerHeight;
115 const enableDrag = evt => {
116 dragPos = [evt.clientX / innerWidth, evt.clientY / innerHeight];
119 const disableDrag = _ => {
123 canvas.style.cursor = "auto";
131 canvas.addEventListener("mousedown", evt => {
137 for (let i = 0; i < positions.length; i++) {
138 const [x, y] = coordinateToScreen(positions[i][0], positions[i][1]);
140 if (Math.sqrt(Math.pow(evt.clientX - x, 2) + Math.pow(evt.clientY - y, 2)) < scale * 0.1) {
147 canvas.addEventListener("mousemove", evt => {
151 const oldDragPos = dragPos;
158 if (dragIndex == -1) {
159 canvas.style.cursor = "move";
162 centerF[0] + dragPos[0] - oldDragPos[0],
163 centerF[1] + dragPos[1] - oldDragPos[1],
168 canvas.style.cursor = "grabbing";
170 positions[dragIndex] = screenToCoordinate(dragPos[0] * innerWidth, dragPos[1] * innerHeight);
178 canvas.addEventListener("mouseup", evt => {
183 addPosition(screenToCoordinate(evt.clientX, evt.clientY));
188 canvas.addEventListener("mouseleave", evt => {
195 canvas.addEventListener("wheel", evt => {
196 scale -= evt.deltaY * 0.05;
197 scale = Math.max(7, scale);
202 addEventListener("resize", _ => {