如何使用Racket绘制三维图形

时间:2016-10-23 22:47:08

标签: plot graph 3d lisp racket

我正在使用Racket和Dr. Racket。有一个很棒的图书馆叫做情节,可以让你用2D或3D绘制图形。

导入包后:

(require plot)

我可以将f(x,y) = 3 * x之类的图表绘制成:

(plot3d (surface3d (lambda (x y) (* x 3)) (- 10) 10 (- 10) 10))

enter image description here

然而,当我尝试绘制这个等式时:

f (x,y,z) = 2(x-2)^2 + (y-1)^2+(z-3)^2 - 10

(plot3d (surface3d (lambda (x y z) (+ (* 2 (expt (- x 2) 2))
                                      (expt (- y 1) 2)
                                      (expt (- z 3) 2)
                                      -10))
                                      (- 10) 10 (- 10) 10))

我收到一条错误消息,我无法理解:

surface3d: contract violation
  expected: a procedure that accepts 2 non-keyword argument
  given: #<procedure:...top/graficos.rkt:14:19>
  in: the 1st argument of
      (->*
       ((-> any/c any/c Real))
       ((or/c Real #f)
        (or/c Real #f)
        (or/c Real #f)
        (or/c Real #f)
        #:alpha
        Nonnegative-Real
        #:color
        (or/c
         Integer
         Symbol
         String
         (recursive-contract g147 #:impersonator)
         (cons/c
          Real
          (cons/c Real (cons/c Real '()))))
        #:label
        (or/c #f String)
        #:line-color
        (or/c
         Integer
         Symbol
         String
         (recursive-contract g147 #:impersonator)
         (cons/c
          Real
          (cons/c Real (cons/c Real '()))))
        #:line-style
        (or/c
         Integer
         'transparent
         'solid
         'dot
         'long-dash
         'short-dash
         'dot-dash)
        #:line-width
        Nonnegative-Real
        #:samples
        Positive-Integer
        #:style
        (or/c
         Integer
         'transparent
         'solid
         'bdiagonal-hatch
         'crossdiag-hatch
         'fdiagonal-hatch
         'cross-hatch
         'horizontal-hatch
         'vertical-hatch)
        #:z-max
        (or/c Real #f)
        #:z-min
        (or/c Real #f))
       any)
  contract from: 
      <pkgs>/plot-lib/plot/private/plot3d/surface.rkt
  blaming: /home/pedro/Desktop/graficos.rkt
   (assuming the contract is correct)
  at: <pkgs>/plot-lib/plot/private/plot3d/surface.rkt:49.9

绝对有可能对此进行图表化。我是在Wolfram Alpha上做到的:

enter image description here

1 个答案:

答案 0 :(得分:2)

无论Racket实现的细节如何,您尝试做的事情都没有意义。您正在尝试绘制一个从R ^ 3映射到R的函数,并且您不能将其作为3维表面图:您需要4。

所以,就这个问题的答案而言,重新思考你想要做的事情。一种方法是调整你的函数,这样你就可以将它绘制成一个参数的固定值:(plot3d (surface3d (curryr (lambda (x y z) ...) 3.0) ...))将为z = 3.0绘制它。