Нарисуйте блокированные тетраэдры в клетке «сегментов линии», используя WPF и C#
В этом примере используются два взаимосвязанных тетраэдра, окруженных кубической клеткой сегментов линии. К сожалению, заметное упущение из 3D-инструментов WPF - это любой способ отрисовки сегментов линии. Это означает, что вы не можете рисовать каркасные модели, показывать нормали поверхности или рисовать другие линейные функции. Вы можете использовать инструментарий CodePlex
Инструментарий CodePlex рисует трехмерные сегменты линии, рисуя тощие прямоугольники. Это работает, но если угол обзора расположен вдоль края прямоугольника, он исчезает. Другим подходом было бы нарисовать два тощих перпендикулярных прямоугольника, которые блокируются. Затем вы можете видеть что-то под любым углом (кроме конца).
Вместо того, чтобы принимать эти подходы, я решил представить сегменты линии с тонкими прямоугольными призмами (ящиками). Следующий код показывает, как метод AddSegment добавляет призму для представления сегмента линии, соединяющего две точки.
// Сделайте тонкую прямоугольную призму между двумя точками. private void AddSegment(MeshGeometry3D mesh, Point3D point1, Point3D point2, Vector3D up) { const double thickness = 0.01; // Получить вектор сегмента. Vector3D v = point2 - point1; // Получаем увеличенный вектор. Vector3D n1 = ScaleVector(up, thickness / 2.0); // Получим еще один масштабированный перпендикулярный вектор. Vector3D n2 = Vector3D.CrossProduct(v, n1); n2 = ScaleVector(n2, thickness / 2.0); // Создаем тощую коробку. // p1pm означает point1 PLUS n1 MINUS n2. Point3D p1pp = point1 + n1 + n2; Point3D p1mp = point1 - n1 + n2; Point3D p1pm = point1 + n1 - n2; Point3D p1mm = point1 - n1 - n2; Point3D p2pp = point2 + n1 + n2; Point3D p2mp = point2 - n1 + n2; Point3D p2pm = point2 + n1 - n2; Point3D p2mm = point2 - n1 - n2; // Стороны. AddTriangle(mesh, p1pp, p1mp, p2mp); AddTriangle(mesh, p1pp, p2mp, p2pp); AddTriangle(mesh, p1pp, p2pp, p2pm); AddTriangle(mesh, p1pp, p2pm, p1pm); AddTriangle(mesh, p1pm, p2pm, p2mm); AddTriangle(mesh, p1pm, p2mm, p1mm); AddTriangle(mesh, p1mm, p2mm, p2mp); AddTriangle(mesh, p1mm, p2mp, p1mp); // Конец. AddTriangle(mesh, p1pp, p1pm, p1mm); AddTriangle(mesh, p1pp, p1mm, p1mp); AddTriangle(mesh, p2pp, p2mp, p2mm); AddTriangle(mesh, p2pp, p2mm, p2pm); }
Сначала код получает Vector3D, представляющий вектор между начальной и конечной точками. Затем он использует метод ScaleVector (который является прямым) для создания вектора n1 в направлении «вверх», длина которого равна половине толщины призмы. Он использует метод Vactor3D класса CrossProduct класса, чтобы получить новый вектор n2, перпендикулярный двум другим. (Если вы не знаете, что такое векторный кросс-продукт, см.
Затем метод добавляет комбинации векторов n1 и n2 к конечным точкам сегмента, чтобы получить углы призмы. Он использует эти точки для добавления необходимых треугольников в MeshGeometry3D для создания призмы.