画布中的利萨如曲线

时间:2018-05-26 12:00:48

标签: javascript html canvas

Sup人我需要在js中编写代码以在lissajous曲线中在画布中移动图像。 在小帮助下,我设法编写了一个代码,这些代码在这些曲线中移动了一个小点,但实际上不知道如何用图像(任何图像)替换它。 这是我的代码:



function start() {
  var ctx, WIDTH, HEIGHT, x, y, dx, dy, angle, timeout;

  function init(data) {
    var canvas = document.getElementById("canvas");
    ctx = canvas.getContext("2d");
    WIDTH = 500;
    HEIGHT = 300;
    x = WIDTH / 2;
    y = HEIGHT / 2;
    dx = x * Math.sin(0);
    dy = x * Math.sin(0);
    angle = 0;
    draw((m1 = 1), (m2 = 2), (speed = 0.009));
  }

  function line(x, y, dx, dy, r) {
    ctx.beginPath();
    ctx.moveTo(x, y);
    ctx.lineTo(dx, dy);
    ctx.lineWidth = 5; // adding here to make it more visible
    ctx.stroke();
  }
  function clear() {
    ctx.clearRect(0, 0, WIDTH, HEIGHT);
  }

  function draw() {
    timeout = setTimeout(draw, 1);
    clear();
    nx = (x - 5) * Math.sin(angle * m1);
    ny = (y - 5) * Math.sin(angle * m2);
    line(x + dx, y + dy, x + nx, y + ny);
    dx = nx;
    dy = ny;
    angle += speed;
  }
  init();
}
start();

<canvas id="canvas" width="500" height="300"></canvas>
&#13;
&#13;
&#13;

真的感谢任何帮助,因为我现在卡住了。我完全是新手 并且需要这个用于学校。感谢!!!

2 个答案:

答案 0 :(得分:0)

查看CanvasRenderingContext2D.drawImage()

我在这里添加了一个代码示例,并对您的代码的某些部分进行了注释,以便您可以看到编辑内容:)

function start() {
  var ctx, WIDTH, HEIGHT, x, y, dx, dy, angle, phaseAngle, timeout;
  var image = document.getElementById("img");

  function init(data) {
    var canvas = document.getElementById("canvas");
    ctx = canvas.getContext("2d");
    //WIDTH = 500;
    //HEIGHT = 300;
    WIDTH = canvas.width;
    HEIGHT = canvas.height;
    PI = 3.14159265;
    x = WIDTH / 2;
    y = HEIGHT / 2;
    angle = 0;
    phaseAngle = PI/2;
    //dx = x * Math.sin(0);
    //dy = x * Math.sin(0);
    dx = (x - 50) * Math.sin(angle);
    dy = (y - 50) * Math.sin(angle+phaseAngle);
    //angle = 0;
    draw((m1 = 1), (m2 = 2), (speed = 0.009));
  }

  function line(x, y, dx, dy, r) {
    ctx.drawImage(image, x, y);
    // ctx.beginPath();
    // ctx.moveTo(x, y);
    // ctx.lineTo(dx, dy);
    // ctx.lineWidth = 5; // adding here to make it more visible
    // ctx.stroke();
  }
  function clear() {
    ctx.clearRect(0, 0, WIDTH, HEIGHT);
  }

  function draw() {
    timeout = setTimeout(draw, 1);
    clear();
    //nx = (x - 5) * Math.sin(angle * m1);
    //ny = (y - 5) * Math.sin(angle * m2);
    nx = (x - 50) * Math.sin(angle * m1);
    ny = (y - 50) * Math.sin(angle * m2 + phaseAngle);
    line(x + dx, y + dy, x + nx, y + ny);
    dx = nx;
    dy = ny;
    angle += speed;
  }
  init();
}
start();
<canvas id="canvas" width="500" height="300"></canvas>
<img id="img" src="https://i.stack.imgur.com/cRMrk.png" hidden> <!-- hide image, we need it only inside canvas -->

修改:更改了曲线的公式。增加的相位角使曲线以90度角运行(270度角将产生相同的曲线)。

  

Lissajous图,也称为BOWDITCH CURVE,由两条正弦曲线的交点产生的图案,两条正弦曲线的轴彼此成直角。   请参阅:https://www.britannica.com/science/Lissajous-figure

答案 1 :(得分:0)

您可以使用THREE.js吗?对于这种东西来说,它非常棒。从长远来看,我认为你会发现它更具可扩展性。

Here's a fiddle我为你所说的做了什么。 JsFiddle不允许跨源请求,因此我无法为您实际加载图像,只需将“path / to / image”替换为图像URL所在的位置。

function start() {
  var renderer, scene, camera, mesh;
  var width = window.innerWidth;
  var height = window.innerHeight;
  var m1 = 1;
  var m2 = 2;
  var speed = 0.009;
  var angle = 0;
  var x = width/2;
  var y = height/2;

  function init(data) {
    var canvas = document.getElementById("canvas");
    renderer = new THREE.WebGLRenderer({canvas: canvas, antialias: true});
    renderer.setSize( window.innerWidth, window.innerHeight );
    scene = new THREE.Scene();
    camera = new THREE.OrthographicCamera(width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );
    camera.position.set(x, y, 50);

    var g = new THREE.PlaneBufferGeometry(30, 30);
    var mat = new THREE.MeshBasicMaterial({color: "pink"});
    mesh = new THREE.Mesh(g, mat)
    mesh.position.set(x, y, 0);
    scene.add(mesh);

    var loader = new THREE.TextureLoader();
    loader.load("path/to/image", function(img) {
      mat.map = img;
      mat.needsUpdate = true;
    });
  }

  function update() {
    var nx = (x - 5) * Math.sin(angle * m1);
    var ny = (y - 5) * Math.sin(angle * m2);

    mesh.position.set(x + nx, y + ny, 0);
    angle += speed;

    renderer.render(scene, camera);
    requestAnimationFrame(update);
  }

  init();
  update();
}
start();