Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: enot от 07-02-2019, 17:01:41

Название: Проекция точки на плоскость
Отправлено: enot от 07-02-2019, 17:01:41
Как спроецировать точку на плоскость (по линии нормали плоскости до прямой)?

я пробовал использовать
http://adn-cis.org/ploskosti-proekczii-i-vyibrannyie-tochki.html
то что то не выходит спроецировать точку на вертикальную плоскость, точка как будто "не доходит" до этой плоскости. Может есть какой другой путь..

не уверен, но может это подойдет для моего случая (но как пользоваться, не понял)
http://www.revitapidocs.com/2018.1/9426acbb-e021-d7b4-06ec-98a902420273.htm
Название: Re: Проекция точки на плоскость
Отправлено: Александр Игнатович от 07-02-2019, 17:08:45
https://google.gik-team.com/?q=project+point+to+plane
Название: Re: Проекция точки на плоскость
Отправлено: Александр Игнатович от 07-02-2019, 17:12:38
Ну а с использованием RevitAPI удобно, например так:
1) Создать Plane, например, по нормали и origin-у
2) Используя plane.VecX, VecY, normal и Origin собрать Transform
3) найти Transform.Inverse.OfPoint искомой точки, обнулить координату Z - это точка проекции на плоскость, величина Z - расстояние до плоскости, при том со знаком, указывающим, в каком направлении от плоскости находится точка
Название: Re: Проекция точки на плоскость
Отправлено: enot от 07-02-2019, 17:22:25
2) Используя plane.VecX, VecY, normal и Origin собрать Transform
3) найти Transform.Inverse.OfPoint искомой точки, обнулить координату Z - это точка проекции на плоскость, величина Z - расстояние до плоскости, при том со знаком, указывающим, в каком направлении от плоскости находится точка
Можно пример?

VecX, VecY - это получается местная система координат плоскости?

Transform.Inverse.OfPoint - что означает это операция?
Название: Re: Проекция точки на плоскость
Отправлено: Александр Пекшев aka Modis от 07-02-2019, 17:25:22
я пробовал использовать
http://adn-cis.org/ploskosti-proekczii-i-vyibrannyie-tochki.html
то что то не выходит спроецировать точку на вертикальную плоскость, точка как будто "не доходит" до этой плоскости. Может есть какой другой путь..
В том коде есть ошибка. Смотрите код в оригинальной статье - https://thebuildingcoder.typepad.com/blog/2014/09/planes-projections-and-picking-points.html. Там уже исправлено
Название: Re: Проекция точки на плоскость
Отправлено: Александр Ривилис от 07-02-2019, 18:03:17
В том коде есть ошибка. Смотрите код в оригинальной статье - https://thebuildingcoder.typepad.com/blog/2014/09/planes-projections-and-picking-points.html. Там уже исправлено
Код - C# [Выбрать]
  1. //XYZ q = p + d * plane.Normal; // wrong according to Ruslan Hanza and Alexander Pekshev in their comments http://thebuildingcoder.typepad.com/blog/2014/09/planes-projections-and-picking-points.html#comment-3765750464
  2. XYZ q = p - d * plane.Normal;

 :)
Название: Re: Проекция точки на плоскость
Отправлено: enot от 10-02-2019, 10:07:53
В том коде есть ошибка. Смотрите код в оригинальной статье - https://thebuildingcoder.typepad.com/blog/2014/09/planes-projections-and-picking-points.html. Там уже исправлено
Спасибо, теперь все ок
Название: Re: Проекция точки на плоскость
Отправлено: enot от 24-03-2019, 20:14:17
Прошу пояснить почему там все таки знак минус.
Мне кажется в общем случае там может быть как минус , так и плюс в зависимости где находится проецируемая точка pt или pt2 относительно начала координат pt(0,0,0) и плоскости Plane .  Скалярное произведение в любом случае нам даст модуль числа....

(https://i.postimg.cc/dZ2QrPqt/Dot-Product.png) (https://postimg.cc/dZ2QrPqt)
Название: Re: Проекция точки на плоскость
Отправлено: Александр Ривилис от 24-03-2019, 22:09:43
Скалярное произведение в любом случае нам даст модуль числа....
Нет: https://ru.wikipedia.org/wiki/Скалярное_произведение (https://ru.wikipedia.org/wiki/Скалярное_произведение)
Цитировать
в формуле (https://farm8.staticflickr.com/7803/47458321811_32903f826c_o.png) знак определяется только косинусом угла (нормы векторов всегда положительны). Поэтому скалярное произведение > 0, если угол между векторами острый, и < 0, если угол между векторами тупой.
Название: Re: Проекция точки на плоскость
Отправлено: enot от 24-03-2019, 23:17:34
в формуле  знак определяется только косинусом угла (нормы векторов всегда положительны). Поэтому скалярное произведение > 0, если угол между векторами острый, и < 0, если угол между векторами тупой.
В таком случае расстояние dist для pt(XYZ) будет положительным , т.е смещение точки производится по направлению нормали плоскости
http://adn-cis.org/forum/index.php?topic=9080.0

а для pt2(XYZ) отрицательным ...

тогда проекция получается должна вычисляться через "плюс": XYZ q = p + d * plane.Normal;  :-[
Название: Re: Проекция точки на плоскость
Отправлено: Александр Ривилис от 24-03-2019, 23:22:14
В таком случае расстояние dist для pt(XYZ) будет положительным , а для pt2(XYZ) отрицательным ...
С точностью до наоборот...
Название: Re: Проекция точки на плоскость
Отправлено: enot от 24-03-2019, 23:39:16
Смотрите - угол между вектором C и Plane.Normal - острый:

(https://i.postimg.cc/7frHcBs4/Dot-Product-2.png) (https://postimg.cc/7frHcBs4)
Название: Re: Проекция точки на плоскость
Отправлено: Александр Ривилис от 25-03-2019, 00:12:59
Смотрите - угол между вектором C и Plane.Normal - острый:
И что из этого следует? У тебя вектор C смотрит в противоположную сторону. Должно быть так:
(https://farm8.staticflickr.com/7879/47459231761_7ff5a741d7_o.png)


Название: Re: Проекция точки на плоскость
Отправлено: enot от 25-03-2019, 09:45:42
Да, это я напутал с направлением при вычитании векторов. Спасибо )