Как построить 3D-график, начиная с набора точек в качестве основания XY - PullRequest
3 голосов
/ 24 января 2012

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

Цель

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

Проблема

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

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

Как мне достичь этого в Mathematica?

Небольшая заметка

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

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

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

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

1 Ответ

6 голосов
/ 24 января 2012

Это можно сделать с помощью 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 graphics

...