Используйте сегменты для рисования трехмерных осей с тиковыми метками с использованием WPF и C#
В этом примере используются методы, описанные в post Нарисуйте улучшенные 3D-сегменты, используя WPF и C# , чтобы нарисовать 3D-оси с тиковыми метками. Вы можете сделать знаки tic несколькими способами. Вы можете использовать маленькие сферы, кубы, линейные сегменты, коробки. В этом примере используется плоский ящик. (Изобразите ось как полюс с тиковыми метками, представленными коробками для пиццы, расположенными вдоль полюса.)
В следующем коде показан метод расширения AddAxis, который добавляет ось в объект MeshGeometry3D.
// Создаем ось с тиковыми метками. public static void AddAxis(this MeshGeometry3D mesh, Point3D point1, Point3D point2, Vector3D up, double tic_diameter, double tic_separation) { // Сделайте вал. AddSegment(mesh, point1, point2, 0.05, true); // Получим единичный вектор в направлении сегмента. Vector3D v = point2 - point1; double length = v.Length; v.Normalize(); // Найдите позицию первой тиковой метки. Point3D tic_point1 = point1 + v * (tic_separation - 0.025); // Делаем отметки tic. int num_tics = (int)(length / tic_separation) - 1; for (int i = 0; i < num_tics; i++) { Point3D tic_point2 = tic_point1 + v * 0.05; AddSegment(mesh, tic_point1, tic_point2, tic_diameter); tic_point1 += v * tic_separation; } }
Сначала метод вызывает AddSegment для создания оси оси.
Далее код создает вектор с длиной 1 в направлении оси. В первую точку оси он добавляет вектор вдоль оси, длина которой tic_spacing минус половина толщины tic-метки (в этом примере 0,005, но вы можете сделать это параметром). Это дает местоположение первой тиковой метки. (В этом примере не нарисована метка tic на любом из концов оси, но вы можете изменить это, если хотите.)
Теперь код вычисляет количество знаков, которые он должен нарисовать. Он заканчивается путем прокрутки тиковых меток для их создания. Он делает каждую тиковую метку толщиной 0,05 единицы (опять же, вы можете сделать это параметром). Между tic-метками он перемещается вдоль оси на расстояние tic_spacing.
Следующий код показывает, как основная программа делает свою ось X. Аналогично делают другие оси.
// X = красный. MeshGeometry3D x_axis_mesh = new MeshGeometry3D(); x_axis_mesh.AddAxis(origin, new Point3D(axis_length, 0, 0), new Vector3D(0, 1, 0), tic_diameter, 1.0); DiffuseMaterial x_axis_material = new DiffuseMaterial(Brushes.Red); XAxis = new GeometryModel3D(x_axis_mesh, x_axis_material); model_group.Children.Add(XAxis);
Этот код создает новый объект MeshGeometry3D. Он вызывает метод расширения mesh AddAxis, создает для него красный материал и использует сетку и материал для создания объекта GeometryModel3D. Наконец, он добавляет модель в коллекцию Children основной группы модели.