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

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

Помогите с алгоритмом

Ответ
Поиск в этой теме
Непрочитано 18.05.2008, 14:51 #1
Помогите с алгоритмом
Дима_
 
Продуман
 
Питер
Регистрация: 22.02.2007
Сообщений: 2,840

Решил создать тему для вопросов по алгоритмам:
Кто в математике силен, а то я "тупик поймал" - есть координаты трех точек в пространстве - A B C не лежащих на одной прямой, через точки A B проложен вектор в направлении B надо получить X который может принимать значаение +1 и -1 в зависимости от, того над или под вектором находится C? Решение для правильного указания значения "бубликовидности" отрезка полилинии (cons 42).

Миниатюры
Нажмите на изображение для увеличения
Название: пример.jpg
Просмотров: 133
Размер:	8.3 Кб
ID:	6545  

__________________
Когда в руках молоток все вокруг кажется гвоздями.
Просмотров: 3270
 
Автор темы   Непрочитано 18.05.2008, 17:26
#2
Дима_

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


Все нашел, можно просто сравнить угол между AB и AC - иногда, чтоб понять, надо немного отвлечься.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 18.05.2008, 20:22
#3
zamtmn

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


посчитай векторное произвебение ab и ac, по знаку z полученного вектора ясно с какой стороны точка
zamtmn вне форума  
 
Непрочитано 19.05.2008, 10:23
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


zamtmn, Немного не так. Надо рассматривать нормаль к плоскости, заданной точками A,B,C, предварительно приведя все вектора к единичным. Ф-ции работы с векторами gile <Gilles Chanteau>
Код:
[Выделить все]
;;; VUNIT
;;; Returns the single unit vector of a vector
;;; Единичный вектор
;;;
;;; Argument = a vector
(defun vunit (v)
  ((lambda (l)
     (if (/= 0 l)
       (mapcar (function (lambda (x) (/ x l))) v)
     )
   )
    (distance '(0 0 0) v)
  )
)

;;; VEC1
;;; Returns the single unit vector from p1 to p2
;;; Единичный вектор из p1 в p2
;;;
;;; Arguments = two points
(defun vec1 (p1 p2)
  (vunit (mapcar '- p2 p1))
)

;;; V^V
;;; Returns the cross product of two vectors
;;; Векторное проихведение векторов
;;;
;;; Arguments = 2 vectors
(defun v^v (v1 v2)
  (list    (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
    (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
    (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
  )
)

;;; NORM_3PTS
;;; Returns the normal vector of a 3 points defined plane (respects the right hand rule)
;;;
;;; Arguments = 3 points
(defun norm_3pts (p0 p1 p2)
  (vec1    '(0 0 0)
    (v^v (vec1 p0 p1) (vec1 p0 p2))
  )
)

(defun C:TEST()
  (and
    (or (initget 1) t)
    (setq ptA (getpoint "\nТочка A:"))
    (or (initget 1) t)
    (setq ptB (getpoint ptA "\nТочка B:"))
    (or (initget 1) t)
    (setq ptC (getpoint ptA "\nТочка C:"))
    (setq Z1 (last (norm_3pts ptA ptB ptC)))
    (or
    (if (minusp Z1)
      (alert "Если смотреть из точки A в точку B\nТо точка C справа")
      (alert "Если смотреть из точки A в точку B\nТо точка C слева")
      )
    t
    )
    )
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 19.05.2008 в 12:35.
VVA вне форума  
 
Автор темы   Непрочитано 19.05.2008, 11:52
#5
Дима_

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


Спасибо, у меня чуть попроще т.к. точки только двухмерные.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 19.05.2008, 12:36
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


А разница в чем? Добавь третьей координатой 0, и все.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 19.05.2008, 12:59
#7
Bull

Конструктор по сути (машиностроитель)
 
Регистрация: 10.10.2005
Набережные Челны (это где КамАЗ)
Сообщений: 11,391


VVA, тут хотел бы анекдот какой вспомнить, да не приходит в голову. Короче, зачем в сложном что-то обнулять, когда можно намного проще задачу решить?
__________________
Век живи, век учись - ...
Bull вне форума  
 
Непрочитано 19.05.2008, 13:54
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Так и здесь вроде сложного ничего нет. Нормаль к плоскости в правой системе координат. Знак Z говорит о том, по часовой или против идем от точки А к В и далее к С.
Все функции выше
Код:
[Выделить все]
(defun get_X ( ptA ptB ptC )(last (norm_3pts ptA ptB ptC)))
;;;Использование
(get_X  (getpoint "\nТочка A:")(getpoint "\nТочка B:")(getpoint "\nТочка C:"))
Можно вопрос о том по часовой или нет обходятся точки А,В,С решить по другому
Код:
[Выделить все]
;;;T - по часовой nil - против
(defun clockwise-p (p1 p2 p3)
  (< (sin (- (angle p1 p3) (angle p1 p2))) -1e-14)
)
;;;Использование
 (clockwise-p (getpoint "\nТочка A:")(getpoint "\nТочка B:")(getpoint "\nТочка C:"))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 19.05.2008, 18:49
#9
zamtmn

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


>>VVA
нормаль к плоскости и есть векторное произведение. в даноом случае ничего нормолизовать ненадо
>>Дима_
углами - не проще, векторное произведение быстрее
zamtmn вне форума  
 
Непрочитано 19.05.2008, 18:59
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


zamtmn, Это понятно, просто если привести к единичным векторам, то Z будет принимать значение +1 или -1, как и просил
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 19.05.2008, 19:21
#11
zamtmn

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


>>VVA
быстрее нормолизовать один результат, чем два исходных вектора. еще быстрее просто z результата c 0 сравнить
zamtmn вне форума  
 
Непрочитано 19.05.2008, 21:35
#12
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
углами - не проще, векторное произведение быстрее
По логике, т.е. по количеству и сложности действий, ты прав! Но это не относится к акаду...
В акаде быстрее через углы.
Елпанов Евгений вне форума  
 
Непрочитано 19.05.2008, 22:11
#13
zamtmn

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


>>Елпанов Евгений
я в автолиспе не силен, наверно выражение с векторным произведением будет громоздко выглядеть, но автокад\не автокад, а процессор всеравно складывает\умножает быстрее чем считает тригонометрию
zamtmn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите с алгоритмом

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите Пожалуйста найти и скачать книгу Ф. А. Байтемиров, В. М. Головина, Э. М. Улицкая Расчет кон DenIZ Поиск литературы, чертежей, моделей и прочих материалов 0 27.12.2007 22:45
ANSYS 10 Помогите разобраться. Aндрeй ANSYS 6 12.12.2007 00:03
Помогите лестницу Ж/Б спроектировать, за денги есно Simply Архитектура 4 30.03.2005 12:48