Как работает алгоритм Vector3d.GetPerpendicularVector?

Автор Тема: Как работает алгоритм Vector3d.GetPerpendicularVector?  (Прочитано 4934 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вопрос:
Как работает алгоритм Vector3d.GetPerpendicularVector? Ведь в 3D пространстве к вектору можно провести бесконечное количество перпендикуляров?!
Ответ:
Для этого используется так называемый Arbitrary Axis Algorithm. Вот полный код тестовый пример:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using AcRx = Autodesk.AutoCAD.Runtime;
  8. using AcAp = Autodesk.AutoCAD.ApplicationServices;
  9. using AcDb = Autodesk.AutoCAD.DatabaseServices;
  10. using AcGe = Autodesk.AutoCAD.Geometry;
  11. using AcEd = Autodesk.AutoCAD.EditorInput;
  12.  
  13. // This line is not mandatory, but improves loading performances
  14. [assembly: CommandClass(typeof(TestVector.MyCommands))]
  15.  
  16. namespace TestVector
  17. {
  18.  
  19.   public class MyCommands
  20.   {
  21.     /// <summary>
  22.     /// Функция для получения перпендикуляра к вектору согласно
  23.     /// Arbitrary AutoCAD Algorithm  
  24.     /// </summary>
  25.     /// <param name="zAxis"></param>
  26.     /// <returns></returns>
  27.     static AcGe.Vector3d GetArbPerpVector(AcGe.Vector3d zAxis)
  28.     {
  29.       AcGe.Vector3d xAxis;
  30.       const double kArbBound = 0.015625;    //  1/64th
  31.       if ((Math.Abs(zAxis.X) < kArbBound) && (Math.Abs(zAxis.Y) < kArbBound))
  32.         xAxis = AcGe.Vector3d.YAxis.CrossProduct(zAxis);
  33.       else
  34.         xAxis = AcGe.Vector3d.ZAxis.CrossProduct(zAxis);
  35.       return xAxis.GetNormal();
  36.     }
  37.     [CommandMethod("TestVector")]
  38.     public void TestVector()
  39.     {
  40.       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument;
  41.       AcEd.Editor ed = doc.Editor;
  42.       AcEd.PromptPointOptions pr =
  43.         new AcEd.PromptPointOptions("\nУкажите вектор для получения перпендикулярного (ENTER - завершение): ");
  44.       pr.AllowNone = true;
  45.       AcEd.PromptPointResult res;
  46.       while ((res = ed.GetPoint(pr)).Status == AcEd.PromptStatus.OK)
  47.       {
  48.         AcGe.Vector3d v = res.Value.GetAsVector();
  49.         v = v.GetNormal();
  50.         AcGe.Vector3d vPerp1 = v.GetPerpendicularVector(); // Стандартный алгоритм
  51.         AcGe.Vector3d vPerp2 = GetArbPerpVector(v); // Arbitrary алгоритм
  52.         ed.WriteMessage("\nPerp1 = ({0}) Perp2=({1})", vPerp1, vPerp2);
  53.       }
  54.     }
  55.   }
  56. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение