Постройте простые векторы, которые идут от начала плоскости до заданной точки в трехмерном пространстве.

Я хочу иметь возможность строить простые векторы (не векторные поля или что-то более причудливое) в трехмерном пространстве, например, некоторые линии, каждая со стрелкой, идущие от начала плоскости к любой другой заданной точке.

Чем проще его использовать (ввод векторов, метки, настройка и т. д.), тем лучше, поскольку этот инструмент предназначен для использования в образовании с широким диапазоном возрастов и уровней опыта.

Я пробовал и Matlab, и Octave, и через quiver3 я могу делать такие вещи:

векторы графика с примером октавы

Это нормально, но есть некоторые проблемы:

  1. С гибкостью этих инструментов также связаны некоторые затраты на сложность. В некоторых возрастных диапазонах и на некоторых уровнях опыта я потеряю слишком много времени и внимания, используя их.

  2. В Octave я не могу заставить ось пройти через начало координат! Это можно сделать в Matlab со сторонней библиотекой, но Matlab недешев, и в этой задаче графики в любом случае выглядят как в Octave.

Я ищу что-то более простое для настройки и работы, мне не нужна гибкость (мне нужны очень простые настройки, такие как положения осей, метки, цвета и т. д.), мне не нужно выполнять расчеты (нужен только сюжет).

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

Итак, какие есть варианты/альтернативы? Что вы используете для учебы, работы, лаборатории?

Ответы (2)

GeoGebra

Снимок экрана GeoGebra, показывающий панель 3D-графики и уже введенный вектор a = (1, 2, 3)^T.  Кроме того, панель ввода содержит «b = Vector((-3, 2, 1))», который уже отображается на панели 3D-графики.  Вектор "a" также окрашен в зеленый цвет и пунктирную линию.

Ваши требования:

  • Простой в использовании, я получил приведенный выше снимок экрана, выполнив следующие действия:

    • Запустить GeoGebra
    • Выберите в меню Вид -> 3D Графика
    • В строке ввода введите a = Vector((1, 2, 3)), например, .
      Вы также можете ввести начальную и конечную точки для векторов направления: Vector((1, 1, 1), (2, 2, 2)). Как правило, ввод любой команды уже показывает ее возможные параметры и перегрузки в стиле IntelliSense.
  • Метки можно создать с помощью Textкоманды: Text("hello", (1,1,1)).
    Затем обязательно щелкните правой кнопкой мыши объект на панели алгебры, выберите «Свойства», «Дополнительно» и активируйте «3D-графика» в разделе «Расположение» в соответствии с этим ответом .

  • Настраиваемость: щелкнув правой кнопкой мыши любой объект и выбрав «Свойства», вы можете изменить многочисленные настройки, например размер шрифта, цвет и стиль линии.

Общие характеристики:

  • Бесплатно и с открытым исходным кодом
  • Кроссплатформенность
  • Может экспортировать изображения в различные форматы (PNG, EPS и некоторые коды LaTeX)
  • Имеет поддержку сценариев JavaScript.
  • Поддерживает «переменные ползунки» (подумайте, <input type="range">если вы знаете HTML) и их анимацию / автоматический режим увеличения и уменьшения каждые XX миллисекунд.

Я регулярно использую его для быстрого наброска вещей или получения интуитивного понимания некоторых формул. Однако одним недостатком является то, что панель ввода / система CAS иногда не может понять некоторые глубоко вложенные команды, которые зависят от переменных ползунка.

Такого рода вещи идеально подходят для Python и одной из библиотек для построения графиков, таких как MatPlotLib или Bokeh .

  • Бесплатно, бесплатно и с открытым исходным кодом
  • Кроссплатформенность (будет работать на Windows, Mac или Linux и на RaspberryPi и выше)
  • Небольшая установка
  • Гибкий
  • Графики можно сохранять и экспортировать в виде файлов PDF или изображений.

Несколько примеров MatPlotLib из галереи 3D-графики :

3D колчан:

==============
3D quiver plot
==============

Demonstrates plotting directional arrows at points on a 3d meshgrid.

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')

# Make the grid
x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.2),
                      np.arange(-0.8, 1, 0.2),
                      np.arange(-0.8, 1, 0.8))

# Make the direction data for the arrows
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *
     np.sin(np.pi * z))

ax.quiver(x, y, z, u, v, w, length=0.1, normalize=True)

plt.show()

Дает:введите описание изображения здесь

3D-текст

'''
======================
Text annotations in 3D
======================

Demonstrates the placement of text annotations on a 3D plot.

Functionality shown:
- Using the text function with three types of 'zdir' values: None,
  an axis name (ex. 'x'), or a direction tuple (ex. (1, 1, 0)).
- Using the text function with the color keyword.
- Using the text2D function to place text on a fixed position on the ax object.
'''

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt


fig = plt.figure()
ax = fig.gca(projection='3d')

# Demo 1: zdir
zdirs = (None, 'x', 'y', 'z', (1, 1, 0), (1, 1, 1))
xs = (1, 4, 4, 9, 4, 1)
ys = (2, 5, 8, 10, 1, 2)
zs = (10, 3, 8, 9, 1, 8)

for zdir, x, y, z in zip(zdirs, xs, ys, zs):
    label = '(%d, %d, %d), dir=%s' % (x, y, z, zdir)
    ax.text(x, y, z, label, zdir)

# Demo 2: color
ax.text(9, 0, 0, "red", color='red')

# Demo 3: text2D
# Placement 0, 0 would be the bottom left, 1, 1 would be the top right.
ax.text2D(0.05, 0.95, "2D Text", transform=ax.transAxes)

# Tweaking display region and labels
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_zlim(0, 10)
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')

plt.show()

Дает:введите описание изображения здесь

Я также настоятельно рекомендую взглянуть на Jupyter + ядро ​​VPython , так как это открывает больше возможностей:

  • Бесплатно, бесплатно и с открытым исходным кодом
  • Кроссплатформенность (работает на Windows, OS-X и Linux)
  • Интерфейс через веб-браузер
  • Более интерактивный
  • Анимация
  • Более визуально захватывающий

Я бы также посоветовал взглянуть на сайт GlowScript , который широко использует VPython:введите описание изображения здесь

GlowScript 2.6 VPython

# Written by Bruce Sherwood, licensed under Creative Commons 4.0.
# All uses permitted, but you must not claim that you wrote it, and
# you must include this license information in any copies you make.
# For details see http://creativecommons.org/licenses/by/4.0

# Angular momentum of a binary star
scene.background = color.white
scene.y = 0
scene.width = 600
scene.height = 600
G = 6.7e-11
d = 1.5e11
star1 = sphere(pos=vector(d,0,0), radius=5e9, color=color.magenta, make_trail=True, retain=200, interval=10)
star1.mass = 1e30
star2 = sphere(pos=vector(0,0,0), radius=1e10, color=color.blue, make_trail=True, retain=200, interval=10)
star2.mass = 2*star1.mass

# make elliptical orbit in xz plane
ev = (2*pi*d/(365*24*60*60)) 
star1.p = vector(0, star1.mass*ev, 0)
star2.p = -star1.p
dt = 12*60*60

scene.center = vector(-0.2*d,0.3*d,0)
scene.range = 1.8*d # set size of window in meters
scene.forward = vector(0,1,-1) # tip camera angle
scene.lights = []
distant_light(direction=vector(0,-1,0.2))

# A in the xz plane
locationA = vector(-0.4*d, 0, 0) 

Lscale = 3.7e-35
pscale = 4e-24
offset = 2*star1.radius
h = star1.radius
Larr1 = arrow(pos=locationA-vector(offset,0,0), shaftwidth=star1.radius, axis=vector(0,0,0), color=star1.color)
rarr1 = arrow(pos=locationA, shaftwidth=star1.radius, axis=vector(0,0,0), color=color.cyan)
parr1 = arrow(pos=star1.pos, shaftwidth=star1.radius, axis=vector(0,0,0), color=color.red)
Larr2 = arrow(pos=locationA+vector(offset,0,0), shaftwidth=star1.radius, axis=vector(0,0,0), color=star2.color)
rarr2 = arrow(pos=locationA, shaftwidth=star1.radius, axis=vector(0,0,0), color=color.cyan)
parr2 = arrow(pos=star2.pos, shaftwidth=star1.radius, axis=vector(0,0,0), color=color.red)
Larr = arrow(pos=locationA, shaftwidth=star1.radius, axis=vector(0,0,0), color=vector(.7,.5,0))
Llabel1 = label(pos=locationA, text='L1', box=0, opacity=0, color=color.black)
Llabel2 = label(pos=locationA, text='L2', box=0, opacity=0, color=color.black)
Llabel = label(pos=locationA, text='L1+L2', box=0, opacity=0, color=color.black)

while True:
    rate(200)
    r = star2.pos-star1.pos
    F = -(G*star2.mass*star1.mass/mag(r)**2)*norm(r)
    star2.p = star2.p + F*dt
    star2.pos = star2.pos + (star2.p/star2.mass)*dt
    star1.p = star1.p - F*dt
    star1.pos = star1.pos + (star1.p/star1.mass)*dt
    parr2.pos = star2.pos
    parr2.axis = star2.p*pscale
    parr1.pos = star1.pos
    parr1.axis = star1.p*pscale
    rA1 = star1.pos-locationA
    rarr1.axis = rA1
    L1 = cross(rA1,star1.p)
    Larr1.axis = L1*Lscale
    rA2 = star2.pos-locationA
    rarr2.axis = rA2
    L2 = cross(rA2,star2.p)
    Larr2.axis = L2*Lscale
    Larr.axis = (L1+L2)*Lscale
    Llabel1.pos = Larr1.pos+Larr1.axis+vector(0,h,0)
    Llabel2.pos = Larr2.pos+Larr2.axis+vector(0,h,0)
    Llabel.pos = Larr.pos+Larr.axis+vector(0,h,0)