Точка пересечения объектов с нулевой координатой Z
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Точка пересечения объектов с нулевой координатой Z

Точка пересечения объектов с нулевой координатой Z

Ответ
Поиск в этой теме
Непрочитано 12.10.2009, 15:53 #1
Точка пересечения объектов с нулевой координатой Z
Do$
 
AutoCAD/Civil3D LISP/C#
 
Санкт-Петербург
Регистрация: 15.08.2008
Сообщений: 1,701

Первый объект:
Код:
[Выделить все]
((-1 . <Entity name: 7d6e7130>) (0 . "INSERT") (330 . <Entity 
name: 7dd97cf8>) (5 . "116") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . 
"0") (100 . "AcDbBlockReference") (2 . "test") (10 812.964 458.284 0.0) (41 . 
1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) 
(210 0.0 0.0 1.0))
Второй объект:
Код:
[Выделить все]
((-1 . <Entity name: 7d6e71d8>) (0 . "LINE") (330 . <Entity 
name: 7dd97cf8>) (5 . "12B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . 
"0") (100 . "AcDbLine") (10 812.964 458.284 0.0) (11 814.486 457.003 0.0) (210 
0.0 0.0 1.0))
Определяю точку пересечения:
Код:
[Выделить все]
    (vlax-safearray->list
      (vlax-variant-value
	(vla-IntersectWith
	  (vlax-ename->vla-object (car (entsel "\nПервый объект:")))
	  (vlax-ename->vla-object (car (entsel "\nВторой объект:")))
	  acExtendNone
	) ;_ end of vla-IntersectWith
      ) ;_ end of vlax-variant-value
    ) ;_ end of vlax-safearray->list
Результат:
Код:
[Выделить все]
(813.214 458.073 -1.0e-008)
Откуда взялась координата Z???
Файл прикладываю.

Вложения
Тип файла: dwg
DWG 2004
1.dwg (28.6 Кб, 757 просмотров)

Просмотров: 4071
 
Непрочитано 12.10.2009, 16:00
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


1. Это нормальное дело - если сверяешь точки всегда используй допуски (eqaul ....).
2. У тебя в точке вставки блока может ничего и не быть.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 12.10.2009, 16:22
#3
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Мда, и правда: создаешь блок из одного примитива - все нормально, координата Z точки пересечения нулевая. Стоит добавить еще один примитив в блок - координата становится -1.0e-008. Видать какой-то глюк метода...
Что значит может ничего не быть в точке вставки? У блока может не быть точки вставки?
Do$ вне форума  
 
Непрочитано 12.10.2009, 19:18
#4
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


То что у тебя точка вставки блока в нуле еще не о чем не говорит проверь примитивы внутри блока с ними ищется пересечение, а также не забывай про хранение чисел с плавающей запятой в двоичном представлении.
Sleekka вне форума  
 
Автор темы   Непрочитано 13.10.2009, 08:29
#5
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Sleekka Посмотреть сообщение
То что у тебя точка вставки блока в нуле еще не о чем не говорит проверь примитивы внутри блока с ними ищется пересечение
Я тоже об этом в первую очередь подумал, все проверил - все примитивы в плоскости XY. Для проверки еще несколько блоков сделал: ситуация повторяется, когда примитивов в блоке больше одного.

Цитата:
Сообщение от Sleekka Посмотреть сообщение
а также не забывай про хранение чисел с плавающей запятой в двоичном представлении.
Do$ вне форума  
 
Непрочитано 13.10.2009, 10:32
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Да не парься - прими как факт или попробуй сам написать функцию нахождения точки пересечения ну хотя-бы прямой с окружностью - тебе по любому придеться вводить какой-нибудь допуск т.к. число Pi бесконечно, в Autodesk люди хоть и совсем не глупые - но не волшебники.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.10.2009, 11:15
#7
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Да не парься - прими как факт или попробуй сам написать функцию нахождения точки пересечения ну хотя-бы прямой с окружностью - тебе по любому придеться вводить какой-нибудь допуск т.к. число Pi бесконечно, в Autodesk люди хоть и совсем не глупые - но не волшебники.
Вот это факт - вла-интерсект работает вообще непойми как (по крайней мере я не уловил). Лучше написать свою функцию основываясь на аналитической геометрии чем спотыкаться о подводные камни этого творения автодеска.
Цитата:
а также не забывай про хранение чисел с плавающей запятой в двоичном представлении.
А по поводу этого нужно открыть какие нибудь основы компьютеров я смотрел курсы по java от TeachPro (я просто не программист по образованию). Смысл в том что число в десятичной системе с дробной частью к примеру 2.345 нельзя точно перевести в двоичную систему - будет типа такого xx.xxxxxxxxxxxxxxxxxx (после точки числа идут до бесконечности т.е. число в двоичной системе становится иррациональным) в итоге при обратном переводе мы уже не получим 2.345 а получим что-то типа 2.3449999999999...
На вот поразгребай что у меня валяется по векторной алгебре. Копирайты там вроде все в лиспах.
PS посмотри сайт Евгения - он большой специалист в этой области. http://elpanov.com/index.php?id=34
Вложения
Тип файла: rar Vector_algebra.rar (207.4 Кб, 105 просмотров)

Последний раз редактировалось Sleekka, 13.10.2009 в 11:22. Причина: добавил файлы и PS
Sleekka вне форума  
 
Автор темы   Непрочитано 13.10.2009, 11:47
#8
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


На самом деле, вопрос из практического перешел в разряд теоретических. Была мысль найти точку пересечения блока и прямой, чтобы обрезать эту прямую по блоку, а оказывается, что точка пересечения определяется не по крайнему примитиву в составе блока, а по прямоугольной рамке вокруг блока. Придется, наверное, взрывать блок и определять точку пересечения с каждым примитивом в отдельности, а потом находить наиболее крайнюю... пока не знаю и готового решения не нашел.
По теме: еще с универа помню - если у всех точек линии, окружности, эллипса и пр... координата Z нулевая, то она в расчетах вообще не участвует - задача из трехмерной превращается в двухмерную.
Вот еще такое наблюдение: Определяю по отдельности точки пересечения примитива LINE с примитивами CIRCLE и LWPOLYLINE - Z координаты точек пересечения 0.0. Объединяю CIRCLE и LWPOLYLINE в блок - Z координата точки пересечения -1.0e-008. Так что, думаю, что число "пи" и числа с плавающей точкой здесь ни при чем.

Цитата:
На вот поразгребай что у меня валяется по векторной алгебре. Копирайты там вроде все в лиспах.
PS посмотри сайт Евгения - он большой специалист в этой области. http://elpanov.com/index.php?id=34
Спасибо!
Do$ вне форума  
 
Непрочитано 13.10.2009, 12:03
#9
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Объединяю CIRCLE и LWPOLYLINE в блок - Z координата точки пересечения -1.0e-008. Так что, думаю, что число "пи" и числа с плавающей точкой здесь ни при чем.
Вообще-то причем. координата z участвует в любом случае потому что матобоснование одно и рассматривает все объекты как трехмерные. просто некоторые координаты равны нулю. Ну вобщем то хватит об этом. Решения по обрезке блоком линии существуют и есть в открытом коде. Надо искать.
Sleekka вне форума  
 
Непрочитано 13.10.2009, 15:07
#10
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>координата Z нулевая, то она в расчетах вообще не участвует - задача из трехмерной превращается в двухмерную.

учавствует, просто она нулевая))

>>Так что, думаю, что число "пи" и числа с плавающей точкой здесь ни при чем.
какраз при чем, ровно ноль при расчетах с плавающей точкой редко когда получится. И сравнивать числа с плавающей точкой с нулем (или между собой) нельзя, всегда нужно учитывать эту погрешность.

не x=0, a abs(x)<eps
не x=y, a abs(x-y)<eps

то что погрешность получилась довольно большая, говорит о том что в расчетах учавствовал увадратный корень, обычно eps берется порядка 1e-15
zamtmn вне форума  
 
Автор темы   Непрочитано 14.10.2009, 08:47
#11
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™



не x=0, a abs(x)<eps
Вот то, что мне не хватало для понимания
Дима_, Sleekka, zamtmn спасибо!
Do$ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Точка пересечения объектов с нулевой координатой Z



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Линия пересекает 3DГрань. Точка пересечения? Bdod AutoCAD 22 09.01.2025 11:05
Развертка линии пересечения 3D объектов alextv Программирование 3 14.06.2009 19:30
Нахождение точек пересечения объектов с заданной погрешностью на VBA helpstud Программирование 3 07.05.2009 17:28
точка пересечения на полилинии Mazai Программирование 2 19.05.2008 17:42
Линия пересечения объектов в 3d, где она? fefe AutoCAD 3 01.02.2007 11:10