gpt4 book ai didi

graphics - 如何实现函数绘图仪

转载 作者:行者123 更新时间:2023-12-02 19:18:51 25 4
gpt4 key购买 nike

我必须使用 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)坐标后执行计算,以便所有值都以像素为单位。

enter image description here

关于graphics - 如何实现函数绘图仪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com