Как построить трехмерный график, начиная с набора точек в качестве наземной базы XY

Этот вопрос может показаться немного странным, но для меня это не так уж и безумно. Это легко, но мне нужно, чтобы ты последовал за мной.

Цель

Моя цель построить трехмерный график.

Проблема

Проблема в том материале, который у меня есть в руках, чтобы начать строить этот график. На самом деле у меня есть набор точек в 2D-пространстве (таким образом, кортежи из двух реальных упорядоченных значений). Подумайте о том, чтобы сохранить этот набор точек в массив, а теперь подумайте о том, чтобы нанести их на двумерную диаграмму. Вы просто будете иметь хороший разреженный вид на эти точки.

Что ж, второй шаг таков: рассмотрим поверхность с этими точками и создадим третью ось, ортогональную плоскости, где эти точки нарисованы. Цель состоит в том, чтобы присвоить каждой точке числовое скалярное значение (используя функцию, которая принимает пару и возвращает числовое значение). Таким образом, на графике должны отображаться столбцы, начинающиеся с каждой точки и имеющие определенное значение в соответствии с функцией присваивания.

Как я могу добиться этого в Mathematica?

Небольшое примечание

В основном мои точки в 2D-пространстве также связаны графиком. Можно ли соединить верхнюю часть стержней с вершинами других стержней, базовые точки которых соединены вместе на двумерном графике?

Некоторые другие заметки

Мой график не обязательно должен быть поверхностью, а просто набором столбцов, размещенных на плоскости точно в том месте, где находится соответствующая точка, на которую они ссылаются. Но если у вас есть хорошая подсказка, как нарисовать поверхность, отличную от стержней, она будет принята с радостью.

Надеюсь, я был понятен. Я хотел бы отметить, что у меня Mathematica 8, поэтому все функции доступны. Спасибо.


person Andry    schedule 24.01.2012    source источник


Ответы (1)


Это можно сделать с помощью Graphics3D примитивов. Начнем с некоторых данных

(* a list of 2D coordinates *)
points2D = RandomReal[{0, Pi}, {50, 2}];

(* some edges as a list of pairs of vertex indices *)
edges = Union[Flatten[MapIndexed[Sort /@ Thread[{#2[[1]], 
     Nearest[points2D -> Automatic, #, 4]}] &, points2D], 1]];

(* constructing list of 3D coordinates *)
f[{x_, y_}] := 2 + Sin[x y]
points3D = {##, f[{##}]} & @@@ points2D;

Фактический график может быть построен следующим образом (ширина равна половине ширины столбцов):

With[{width = .02},
  Graphics3D[{{LightBlue, EdgeForm[None],
    Cuboid[{#1, #2, 0} - width {1, 1, 0}, {##} + width {1, 1, 0}] & @@@ points3D},
   {Orange,
    GraphicsComplex[points3D, Line[edges]]}}, 
  Lighting -> "Neutral", 
  BoxRatios -> {1, 1, .6}]]

Графика Mathematica

person Heike    schedule 24.01.2012
comment
Я пытаюсь это... однако, кажется, это идеальное решение :) - person Andry; 24.01.2012