6

我想绘制任何(随机)曲线,给定:

  • 起点
  • 终点
  • 曲线长度

我怎么能做这种受画布边界限制的事情,加上曲线不能交叉。我试图找到一些解决方案,但我无法弄清楚。谢谢你的时间。

这是我想要完成的更详细的视图:

这是画在画布上的二次曲线。一切安好。问题是,如何在没有所有点的情况下绘制这个,只需以像素为单位的固定长度、随机点、受画布大小和不交叉的限制。

在此处输入图像描述

代码可能如下所示:

function fixedCurve( A, B, length ){
    for(int i = A; i < B; i++){
        //Calculate random point with propper distance to get first base point, random direction could be calculated before loop.
        //Basicly this loop should calculate integrate of the curve and draw it each step.
    }
}
4

1 回答 1

7

试试这个(小提琴):

function draw() {
  var ctx = document.getElementById('canvas').getContext('2d');

  ctx.fillStyle = "red";

  ctx.beginPath();
  var start = [20, 100];
  var end = [120, 100];
  var above = Math.random()*80+20;
  // find the mid point between the ends, and subtract distance above
  //   from y value (y increases downwards);
  var control = [0.5*(start[0]+end[0]), 0.5*(start[1]+end[1])-above];    
  ctx.moveTo(start[0], start[1]);

  ctx.quadraticCurveTo(control[0], control[1], end[0], end[1]); 
  ctx.stroke();
}

draw();

这是quadraticCurveTo用于绘制二次曲线,给定两个点并计算曲线中点上方 20 到 100 个像素的随机控制点。


如果您希望二次方具有特定的弧长(听起来您可能从问题中),那么我们可以做一些数学运算。二次(抛物线)的弧长为:

x 的函数的弧长的一般积分关系

我们有方程,所以求导数:

二次导数

因此,如果我们将其定义为 u(x),Wolfram alpha 会给出

解决方案

所以对于一个特定的 x1 和 x2,我们可以计算出 u(x) 的等价值,然后是积分。

如您在本教程页面上所见,使用控制点绘制一般二次方程涉及将方程转换为顶点形式。明智的做法是从该方程式开始重复数学运算,并以正确的术语为“ u”获得一个新的方程式。

于 2013-03-21T13:54:35.537 回答