Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

177
Vistas
Javascript - Gráfico, puntos móviles en js puro

Tengo este código, ahora al hacer clic en la línea del gráfico puedo mover el punto en el que hice clic. Se puede mover hacia arriba, abajo, izquierda, derecha y esto es bueno, pero debería poder mover los 20 puntos anteriores y los siguientes 20 puntos para hacerlo.

algo como esto:

pero se parece a esto:

También puede consultar aquí https://jsbin.com/qumihizoje/1/edit?html,js,output

 var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); var cw = canvas.width; var ch = canvas.height; var mouse = {}; var draggable = false; context.lineWidth = 2; context.strokeStyle = "blue"; var coordinates = []; for (let i = 0; i < 300; i++) { coordinates.push({ x: i, y: getRandomInt(80, 85) }); } function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; } canvas.addEventListener("mousedown", function(e) { handleMouseDown(e); }); function handleMouseDown(e) { mouse = oMousePos(canvas, e); for (index = 0; index < coordinates.length; index++) { context.beginPath(); context.arc( coordinates[index].x, coordinates[index].y, 5, 0, 2 * Math.PI ); if (context.isPointInPath(mouse.x, mouse.y)) { draggable = index + 1; break; } } } function drawPolygon() { context.clearRect(0, 0, cw, ch); context.beginPath(); context.moveTo(coordinates[0].x, coordinates[0].y); for (index = 1; index < coordinates.length; index++) { context.lineTo(coordinates[index].x, coordinates[index].y); } context.stroke(); } canvas.addEventListener("mousemove", function(e) { if (draggable) { mouse = oMousePos(canvas, e); coordinates[draggable - 1].x = mouse.x; coordinates[draggable - 1].y = mouse.y; drawPolygon(); } }); canvas.addEventListener("mouseup", function(e) { if (draggable) { draggable = false; } }); function oMousePos(canvas, evt) { var ClientRect = canvas.getBoundingClientRect(); return { x: Math.round(evt.clientX - ClientRect.left), y: Math.round(evt.clientY - ClientRect.top) }; } drawPolygon();
 <canvas id="canvas"></canvas>

Estoy moviendo solo un punto, ¿cómo solucionarlo? Necesito usar js puro.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Esto no es exactamente lo que está buscando, pero debería acercarlo más...
Estoy usando un promedio móvil para mover los 20 puntos anteriores y los siguientes 20 puntos.
Puede usar otras estrategias para mover esos puntos y obtener diferentes tipos de curvas, pero como no ha probado nada, esto le da una idea general de lo que es posible.

El resultado debe verse como:
ingrese la descripción de la imagen aquí

 var canvas = document.getElementById("canvas"); var context = canvas.getContext("2d"); var cw = canvas.width; var ch = canvas.height; var mouse = {}; var draggable = false; context.lineWidth = 2; context.strokeStyle = "blue"; canvas.addEventListener("mousemove", function(e) { if (draggable) { mouse = oMousePos(canvas, e); coordinates[draggable - 1].y = mouse.y; var max = Math.min(draggable + 20, coordinates.length) var min = Math.max(draggable - 20, 0) var ra = [] ra.push(mouse.y) for (index = draggable; index < max; index++) { if (ra.length > 20) ra.shift() ra.push(clone[index].y) coordinates[index].y = ra.reduce((a, b) => a + b, 0)/ra.length } ra = [] ra.push(mouse.y) for (index = (draggable-2); index > min; index--) { if (ra.length > 20) ra.shift() ra.push(clone[index].y) coordinates[index].y = ra.reduce((a, b) => a + b, 0)/ra.length } drawPolygon(); } }); canvas.addEventListener("mousedown", function(e) { handleMouseDown(e); }); canvas.addEventListener("mouseup", function(e) { if (draggable) { draggable = false; } }); var coordinates = []; for (let i = 0; i < 300; i++) { coordinates.push({ x: i, y: getRandomInt(80, 85) }); } var clone = coordinates.map((i) => ({ x: ix, y: iy })) function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; } function handleMouseDown(e) { mouse = oMousePos(canvas, e); for (index = 0; index < coordinates.length; index++) { context.beginPath(); context.arc( coordinates[index].x, coordinates[index].y, 5, 0, 2 * Math.PI ); if (context.isPointInPath(mouse.x, mouse.y)) { draggable = index + 1; break; } } } function drawPolygon() { context.clearRect(0, 0, cw, ch); context.beginPath(); context.moveTo(coordinates[0].x, coordinates[0].y); for (index = 1; index < coordinates.length; index++) { context.lineTo(coordinates[index].x, coordinates[index].y); } context.stroke(); } function oMousePos(canvas, evt) { var ClientRect = canvas.getBoundingClientRect(); return { x: Math.round(evt.clientX - ClientRect.left), y: Math.round(evt.clientY - ClientRect.top) }; } drawPolygon();
 <canvas id="canvas"></canvas>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda