这个问题是为了学习的目的。我写我自己的函数来绘制一个方程。例如:绘制两个变量函数
function e(x) { return sin(x); }
plot(e);
我写了一个函数作为参数的绘图函数。绘图代码很简单,x从某个值运行到某个值,然后小步增加。这是plot()
设法产生的阴谋。
但有问题。它不能表达如下的圆方程:x + y = 1.所以问题是如何绘图和方程函数看起来能够处理两个变量。
注意到我不仅对两个圆方程感兴趣。用两个变量绘制函数的更一般化的方法。
这个问题是为了学习的目的。我写我自己的函数来绘制一个方程。例如:绘制两个变量函数
function e(x) { return sin(x); }
plot(e);
我写了一个函数作为参数的绘图函数。绘图代码很简单,x从某个值运行到某个值,然后小步增加。这是plot()
设法产生的阴谋。
但有问题。它不能表达如下的圆方程:x + y = 1.所以问题是如何绘图和方程函数看起来能够处理两个变量。
注意到我不仅对两个圆方程感兴趣。用两个变量绘制函数的更一般化的方法。
函数的定义:函数f取一个输入x,并返回一个单独的输出f(x)。
现在它意味着任何输入都会有唯一一个唯一的输出。像y = sin(x)
。这是一个功能x
和y
definnes功能。
等于(x*x) + (y*y) = 1
。对于单个值x,有两个可能的值y
,因此它不能被称为函数的有效均衡。
如果你需要绘制它,然后一个可行的办法是积两分的x
一个值,即sqrt(1-(x*x))
等-1*sqrt(1-(x*x))
。绘制这两个值(其中一个将是正值,另一个值是负值,具有相同的绝对值)。
但让我们说这两个变量函数变得更加复杂。像y^3 + y^2 = x^2 + 2 – invisal
您将需要一种方法来解决y的值,以便您可以获得x的所有可能值。那么你将不得不为每个对应点绘制相同的x和不同的y值。 –
可能你可以看到http://algebra.js.org你需要解决的一些方法x,那么你需要绘制这些值 –
嘛积非功能1D式(x,y
变量),你有3种选择:
转化为参数形式
因此,例如x^2 + y^2 = 1
将变为:
x = cos(t);
y = sin(t);
t = <0,2*PI>
因此,将每个函数绘制为1D函数绘图,而将t
用作p arameter。但为此,你需要利用数学身份并替代......这不是容易完成的程序设计。
转换到1D功能
非功能意味着你对某些x
值有超过1
y
值。如果将公式分解为间隔并划分为覆盖整个图的所有情况,则可以改为绘制每个派生函数。
所以你得到y
algebraicaly(我们再次假设单位圆):
x^2 + y^2 = 1
y^2 = 1 - x^2
y = +/- sqrt (1 - x^2)
----------------------
y1 = +sqrt (1 - x^2)
y2 = -sqrt (1 - x^2)
x = <-1,+1>
这也是不容易做到programaticaly,但它是一个数量级比#1容易。
做用方程2D情节一样谓词
只是循环您的观点通过所有像素并呈现只有那些其公式是正确的。如此反复单位圆:
for (x=-1.0;x<=+1.0;x+=0.001)
for (y=-1.0;y<=+1.0;y+=0.001)
if (fabs((x*x)+(y*y)-1.0)<=1e-6)
plot_pixel(x,y,some_color); // x,y should be rescaled and offset to the actual plot view
所以,你只是你的公式转换为隐形式:
x^2 + y^2 = 1
-----------------
x^2 + y^2 - 1 = 0
,并与一些阈值进行比较,以零(为了避免FPU精度问题):
| x^2 + y^2 - 1 | <= threshold_near_zero
阈值是绘图线宽度的一半。因此,通过这种方式,您可以轻松地将绘图宽度更改为任意像素大小......正如您所看到的,这很容易完成,但由于需要遍历绘图视图的所有像素,因此绘图较慢。 x,y
for
循环的步骤应该匹配视图比例的像素大小。
此外,虽然使用方程作为谓词,你应该处理数学奇点,因为盲目探测你很可能会碰到一些像划分零,域错误asin,acos,sqrt
等。
所以对于任意1D非功能使用#3。除非你有一些强大的符号数学引擎#1或#2。
你正在使用哪种编程语言? –
您必须为一个值求解方程。例如:'x²+y²= 1'相当于'y = sqrt(x²+ 1)'。通过简单地插入一个变量的值然后求解方程式,这可能更容易实现。可能更棘手的是,对于一个“x”,方程的大部分部分都有两个“y”值。 – Paul
@SardarUsama,我使用Canvas和Javascript,但我只需要算法或正确的指针来解决问题。 – invisal