2017-03-17 66 views
3

我正在尝试开发一个隐式绘图仪。例如,如果我想绘制一个比喻,x将会变化,并且y会被计算为相应的x值。如何绘制隐式函数?

var canvas = document.getElementById("canvas"); 
var ctx = canvas.getContext("2d"); 

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


ctx.beginPath(); 

// y = (x-5)*(x-5) 

var iPoints=20, 
nY=0; 

for (var x=-10; x<=iPoints; x++) { 
    nY = ((x-5)*(x-5)); 
    ctx.lineTo(200-x, 300-nY); 
} 
ctx.stroke(); 

或者看到这里https://jsfiddle.net/a0gLqrvr/ 但我怎么可以绘制隐函数?例如:
x^3 + y^3 = 3*x*y^2 - x - 1
我该如何同时改变x和y?
你可以通过一个例子来说明我的一些观点吗(也许在jsfiddle中)?
在此先感谢。

回答

1

不是最好的办法,也不是最快的办法。但把它做一个简单的方法:

// x^2 + y^2 = 25^2 
for (var x=-30; x<=+30; x+=0.01) { 
    var smallest=1e10; 
    var best_y=0; 
    for (var y=-30; y<=+30; y+=0.01) { 
    var v=Math.abs(x*x+y*y-625); 
    if(v<smallest) {smallest=v;best_y=y;} 
    } 
    if(smallest<0.1) { 
    ctx.fillRect(100+x, 100-best_y,1,1); 
    } 
} 

,你会得到这样的事情:

Implicit Circle

你可以看到的jsfiddle here

+1

感谢您的回答。它同时改变x和y。也许不是“fillRect”,我会使用“moveTo”和“lineTo”。 – user3815508

3

要绘制f(x,y)=0,使用marching squares方法:

  • 将您的区域为小细胞

  • 的网格计算的f符号在每个单元的顶点

  • 找到曲线在哪里穿过一个单元格:在具有不同符号的边缘上。使用线性插值查找交叉点并将其与线段连接在一起。

+0

另请参阅https://www.mattkeeter.com/projects/contours/例如。 – lhf

+0

感谢您的回答。是的,可悲的是,在“隐式函数”的情况下,如果没有“线性插值”和“行进方块”,通常绘制的曲线将会变成虚线。 – user3815508

+0

我仍然在编程“隐式函数”。但可悲的是没成功。在我看来,你有一个线索。你能否请详细描述你的解决方案。也许你想看看我的方法,失败了。 http://stackoverflow.com/questions/43072126/how-to-find-y-for-corresponding-x-values-implicit-function-complex-number/43072826?noredirect=1也在这里http:// stackoverflow。 com/questions/43080688/algorithm-which-adapt-solve-the-complex-equations-implicit-function-fx-y预先感谢您。 – user3815508