- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须使用 OCaml 语言实现一个简单的 2D 函数绘图仪。我大致了解了。到目前为止,策略是有一个函数,我们称之为绘图,它最终将给定的输入函数 f 映射到 f 的可视化。到目前为止,我认为可视化是一条曲线,它是一组顶点,其 x 和 y 坐标如下,x 沿水平轴变化,y 是 f(x) 的值。第一步是计算顶点的 并将其存储在某处,然后继续绘制每个点。只是,出于可视化目的,这是需要计算大量信息的方法,并会引发几个问题:我们将使用什么比率,x 可以有多少个值,将计算多少顶点以及我们需要绘制多少顶点实际曲线?所以我对绘制函数曲线的适当策略有点迷失。有人可以给我一些想法或简单的模板,以便我可以详细说明吗?或者给定函数的示例,例如 x^2。
这是我使用 lablgl 和 GLUT 生成的一些代码,因为我也打算实现 3D 绘图仪,它绘制函数 f(x) = sin(x*10)/(1+x^2)。
open Gl;;
open GlMat;;
open GlDraw;;
open GlClear;;
open Glut;;
(* Transform RGB values in [0.0 - 1.0] to use it with OpenGL *)
let oc = function
x -> float x /. 255.
;;
(* The function to be graphed *)
let expression = function
x -> sin (10. *. x) /. (1. +. x *. x)
;;
(* The rendering function drawing 2000 points in 400x400 canvas *)
let display () =
GlClear.color (oc 255, oc 255,oc 255);
clear [`color];
load_identity ();
begins `lines;
GlDraw.color (oc 0, oc 0, oc 0);
List.iter vertex2 [-1.,0.; 1.,0.];
List.iter vertex2 [0.,-1.;0.,1.];
ends ();
begins `points;
for i=0 to 2000 do
let x = (float i -. 1000.) /. 400. in
let y = expression (x) in
vertex2 (x,y);
done;
ends ();
swapBuffers ();
flush();
;;
(* general stuff and main loop *)
let () =
ignore (init Sys.argv);
initWindowSize ~w:400 ~h:400;
initDisplayMode ~double_buffer:true ();
ignore (createWindow ~title:"Sin(x*10)/(1+x^2)");
mode `modelview;
displayFunc ~cb:display;
idleFunc ~cb:(Some postRedisplay);
keyboardFunc ~cb:(fun ~key ~x ~y -> if key=27 then exit 0);
mainLoop ()
;;
提前谢谢大家!
最佳答案
没有简单的方法来自动选择 X 和 Y 的范围,因为这强烈依赖于函数,并且需要真正理解函数行为。 (这在很大程度上也是主观的。)
因此,最简单的方法是将其保留为用户可调整的参数,并具有合适的默认值(例如 [-5,5]x[-5,5])。
一个重要的问题是纵横比:您将在称为视口(viewport)的矩形中绘图;如果该矩形边的比率与函数(称为窗口)的 X 和 Y 范围的比率不匹配,则曲线将变形。圆形将显示为椭圆形。
根据具体情况,确保长宽比相等是否重要。您应该将其保留为用户选项。如果是,您的软件应该调整窗口限制以适应。
关于点密度,可以使用以下策略:水平选择固定数量的点(比如 100)。通过这样的步骤,线段就清晰可辨了。然后,您可以使用递归分割过程来获得平滑的绘图:考虑一条线段,计算端点的中间点并评估真实曲线点到线段的距离。如果超过阈值,则将该段分成两半,并对两半重复。请务必在转换为视口(viewport)坐标后执行计算,以便所有值都以像素为单位。
关于graphics - 如何实现函数绘图仪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383932/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!