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

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

Помогите с 3dface

Ответ
Поиск в этой теме
Непрочитано 15.04.2010, 21:47 #1
Помогите с 3dface
klopizh
 
Регистрация: 15.04.2010
Сообщений: 3

Может кто подсказать как построить 3d face ом усеченный конус, шаровой пояс и семигранную пирамиду, пока допер только до пирамиды, цилиндра и шарового сегмента, и перемычки межку цилиндром и пирамидой, а между цилиндром и конусом-полусферой не могу дойти, вообще голова не варит, может кто сможет помоч?
Просмотров: 3421
 
Непрочитано 15.04.2010, 23:07
#2
atollon


 
Регистрация: 26.03.2010
Сообщений: 240


А нарисовать для нас можешь что хочешь получить?
__________________
Толстов Евгений
atollon вне форума  
 
Автор темы   Непрочитано 16.04.2010, 00:20
#3
klopizh


 
Регистрация: 15.04.2010
Сообщений: 3


ну вот пример того что я уже натворил, если в 3d максе перевести модель в меш и показать ребра, то мы увидим как раз ту картину что и надо, т.е. примитив составленный из 3хугольных 3dface ов, я как бы построил пирамиду, цилиндр и шаровой сектор, перемычку пирамиды и цилиндра, закрыл цилиндр, теперь вот пытаюсь понять как можно сделать усеченный конус, 7-ми гранную пирамиду и шаровой пояс + сделать перемычку между ними и цилиндром, просто сил уже нету на этот автолисп, котелок уже просто взрывается, если кто поможет буду очень благодарен

Код:
[Выделить все]
; Вывести пирамиду
; p0 - вершина пирамиды
; hp - высота пирамиды
; rp - радиус вписанной в основание окружности
(defun pyramid(p0 hp rp)
  (pyramid2 
    (move (list 0 0 0) p0)
	(move (list hp rp rp) p0)
	(move (list hp rp (- rp)) p0)
	(move (list hp (- rp) (- rp)) p0)
	(move (list hp (- rp) rp) p0)
  )
)

; Вывести пирамиду по точкам
; p0 - p4 - вершины
(defun pyramid2(p0 p1 p2 p3 p4)
  (3dface p0 p1 p2)
  (3dface p0 p2 p3)
  (3dface p0 p3 p4)
  (3dface p0 p4 p1)  
)

; Вывести цилиндр из нескольких секций
; p0 - вершина
; rc - радиус цилиндра
; hc - высота цилиндра
; stepcount - число секций
(defun cylinder(p0 rc hc stepcount)
  (mapcar 
    '(lambda(i)
	   (cylinder2 (move p0 (list (* i (/ hc stepcount)) 0 0)) rc (/ hc stepcount) 20))
	(range 0 (1- stepcount))))
	
; Вывести цилиндр
; p0 - вершина цилиндра
; rc - радиус цилиндра
; hc - высота цилиндра
; stepcount - число вершин окружности
(defun cylinder2(p0 rc hc stepcount)
  (mapcar
    '(lambda (i)
	  ((lambda (p1 alpha0 alpha1)
	    (3dface
	      (rotation-point-yz p0 rc alpha0)
	      (rotation-point-yz p0 rc alpha1)
		  (rotation-point-yz p1 rc alpha0))
		(3dface
		  (rotation-point-yz p1 rc alpha0)
		  (rotation-point-yz p1 rc alpha1)
		  (rotation-point-yz p0 rc alpha1)))
		(move p0 (list hc 0 0))
		(/ (* (* 2 pi) i) stepcount)
		(/ (* (* 2 pi) (1+ i)) stepcount)))
	(range 0 stepcount)))

; Нарисовать окружность	
; center - координаты центра
; radius - радиус
; stepcount - число концентрических колец
(defun circle(center radius stepcount)
  (mapcar
    '(lambda (i)
	  ((lambda (alpha0 alpha1)
	    (3dface
	      center
	      (rotation-point-yz center radius alpha1)
		  (rotation-point-yz center radius alpha0)))
		(/ (* (* 2 pi) i) stepcount)
		(/ (* (* 2 pi) (1+ i)) stepcount)))
	(range 0 stepcount)))
	
; Нарисовать окружность с вырезанным квадратом
; center - центр окружности
; radius - радиус окружности
; halfside - половина стороны квадрата
; stepcount - число вершин
(defun circle_without_square(center radius halfside stepcount)
  ; Построить основные треугольники "солнышком"
  (mapcar
    '(lambda(i)
	   ((lambda(alpha1 alpha2)
	     ((lambda(toppoint circlepoint1 circlepoint2)
	       (3dface toppoint circlepoint1 circlepoint2))
	      (cond
		    ((is-first-quad alpha1) (move center (list 0 halfside 0)))
			((is-second-quad alpha1) (move center (list 0 0 halfside)))
			((is-third-quad alpha1) (move center (list 0 (- halfside) 0)))
			((is-fourth-quad alpha1) (move center (list 0 0 (- halfside))))
		  )
		  (rotation-point-yz center radius alpha1)
		  (rotation-point-yz center radius alpha2)))
		(/ (* (* 2 pi) i) stepcount)
		(/ (* (* 2 pi) (1+ i)) stepcount)))
	 (range 0 stepcount))
  ; Построить недостающие треугольники 
  (mapcar
    '(lambda(i)
	   ((lambda(prevalpha nextalpha)
	      (cond
		    ((and (is-first-quad prevalpha) (is-second-quad nextalpha)) 
			   (3dquad
			     (rotation-point-yz center radius prevalpha)
			     (move center (list 0 halfside 0))
				 (move center (list 0 0 halfside))
				 (move center (list 0 halfside halfside))))
			((and (is-second-quad prevalpha) (is-third-quad nextalpha))
			  (3dquad
			    (rotation-point-yz center radius prevalpha)
				(move center (list 0 0 halfside))
				(move center (list 0 (- halfside) 0))
				(move center (list 0 (- halfside) halfside))))
			((and (is-third-quad prevalpha) (is-fourth-quad nextalpha))
			  (3dquad
			    (rotation-point-yz center radius prevalpha)
				(move center (list 0 (- halfside) 0))
				(move center (list 0 0 (- halfside)))
				(move center (list 0 (- halfside) (- halfside)))))
			((and (is-fourth-quad prevalpha) (is-first-quad nextalpha))
			  (3dquad
			    (rotation-point-yz center radius prevalpha)
				(move center (list 0 0 (- halfside)))
				(move center (list 0 halfside 0))
				(move center (list 0 halfside (- halfside)))))
		  ))
		(/ (* (* 2 pi) i) stepcount)
		(/ (* (* 2 pi) (1+ i)) stepcount)))
	 (range 0 stepcount))	 
)

; Нарисовать боковую поверхность конуса
;  point - вершина конуса
; radius - радиус основания
; height - высота конуса	 
; stepcount - число шагов
(defun cone(point radius height stepcount)
  (mapcar
    '(lambda(i)
	   (spherical_segment2
	     (list (+ (get-x point) (/ (* height i) (1+ stepcount))) (get-y point) (get-z point))
		 (/ (* radius i) (1+ stepcount))
		 (list (+ (get-x point) (/ (* height (1+ i)) (1+ stepcount))) (get-y point) (get-z point))
		 (/ (* radius (1+ i)) (1+ stepcount))
	     20))
	(range 0 stepcount)))
	 
; Нарисовать шаровой сегмент
; center - центр шара
; radius - радиус шара
; height - высота сегмента	
; stepcount - число шагов
(defun spherical_segment(center radius height stepcount)
  ((lambda(segmentangle)
    (mapcar
      '(lambda(i)
	     ((lambda(alpha1 alpha2)
	        (spherical_segment2 
		      (list (+ (get-x center) (* radius (cos alpha1))) (get-y center) (get-z center))
		  	  (* radius (sin alpha1))
			  (list (+ (get-x center) (* radius (cos alpha2))) (get-y center) (get-z center))
			  (* radius (sin alpha2))
			  20))
		  (/ (* segmentangle i) (1+ stepcount))
		  (/ (* segmentangle (1+ i)) (1+ stepcount))))
	  (range 0 stepcount)))
	(atan (/ (sqrt (- (square radius) (square (- radius height)))) (- radius height)))))

; Нарисовать часть шарового сегмента, соединяющую две окружности
; center1 - центр первой окружности
; radius1 - радиус первой окружности
; center2 - центр второй окружности
; radius2 - радиус второй окружности
; stepcount - число шагов
(defun spherical_segment2(center1 radius1 center2 radius2 stepcount)
  (mapcar
    '(lambda(i)
	   ((lambda(alpha1 alpha2)
	     ((lambda(p0 p1 p2 p3)
		   (3dface p0 p1 p3)
		   (3dface p1 p2 p3))
	       (rotation-point-yz center1 radius1 alpha1)
	       (rotation-point-yz center1 radius1 alpha2)
		   (rotation-point-yz center2 radius2 alpha1)
		   (rotation-point-yz center2 radius2 alpha2)))
		 (/ (* (* 2 pi) i) stepcount)
		 (/ (* (* 2 pi) (1+ i)) stepcount)))
	(range 0 stepcount)))

; Создать четырехугольник по четырем точкам (два треугоьника)
; p0, p1, p2, p3 - вершины	
(defun 3dquad(p0 p1 p2 p3)
  (3dface p0 p1 p3)
  (3dface p0 p2 p3))	
	
; Создать треугольник по трем точкам
; p0, p1, p2 - вершины
(defun 3dface (p0 p1 p2)
  (command "_3DFACE" p0 p1 p2 p2 "" "" "")
)

; Переместить точку на заданный вектор
; point - точка
; shift - вектор сдвига
(defun move (point shift)
  (mapcar '+ point shift)
)

; Сформировать список 
; a, b - диапазон
(defun range(a b)
  (cond
    ((= a b) (list a))
    (T (cons a (range (1+ a) b)))
))

; Получить X-координату точки
; p - список координат
(defun get-x (p)
  (car p)
)

; Получить Y-координату точки
; p - список координат
(defun get-y (p)
  (cadr p)
)

; Получить Z-координату точки
; p - список координат
(defun get-z (p)
  (caddr p)
)

; Результат вращения точки в плоскости YZ
; center - центр окружности
; radius - радиус окружности
; alpha - угол поворота
(defun rotation-point-yz (center radius alpha)
  (list
    (get-x center)
	(+ (get-y center) (* radius (cos alpha)))
	(+ (get-z center) (* radius (sin alpha)))
  )
)

; Вычислить квадрат числа
; number - число
(defun square(number)
  (* number number))

; Проверить, что угол лежит в первой четверти
; alpha - угол
(defun is-first-quad(alpha)
  (or (> alpha (* (/ pi 4) 7)) (< alpha (/ pi 4))))
  
 ; Проверить, что угол лежит во второй четверти
 ; alpha - угол
(defun is-second-quad(alpha)
  (and (> alpha (/ pi 4)) (< alpha (* (/ pi 4) 3))))
  
; Проверить, что угол лежит в третьей четверти
; alpha - угол
(defun is-third-quad(alpha)
  (and (> alpha (* (/ pi 4) 3)) (< alpha (* (/ pi 4) 5))))
  
; Проверить, что угол лежит в четвертой четверти
; alpha - угол
(defun is-fourth-quad(alpha)
  (and (> alpha (* (/ pi 4) 5)) (< alpha (* (/ pi 4) 7))))
написанно на 14 каде

Последний раз редактировалось klopizh, 16.04.2010 в 00:22. Причина: дополнение
klopizh вне форума  
 
Непрочитано 16.04.2010, 20:28
#4
atollon


 
Регистрация: 26.03.2010
Сообщений: 240


Сделать трехмерку в Автокаде и расчленить
И просил картинку модели, а то текстовое описание как то не визуализируется
Вначале нужна реальная модель, потом ее анализ и изучение взаимосвязей и алгоритмов заполнения поверхностями, а уж далее - да, можно и Лисп, если нужен.
Насчет лиспа - делай основную команду как (defun c:имя_команды), чтоб не писать ее в скобках, да и без параметров - делай их ввод последующим запросом в комстроке (можно и со значениями по умолчанию), как и вызов подпрограмм построений.
__________________
Толстов Евгений

Последний раз редактировалось atollon, 16.04.2010 в 21:02.
atollon вне форума  
 
Автор темы   Непрочитано 18.04.2010, 13:51
#5
klopizh


 
Регистрация: 15.04.2010
Сообщений: 3


В архиве все есть,одна прога, скриншот построенной модели в 14 каде, модель в максе и 2010 каде доп 3-х моделей, скриншот из 14 када, модели в каде портированны из макса, так что они только показывают форму, моделька же из 14 када , как раз показывает суть задачи
Вложения
Тип файла: rar WinRAR.rar (183.0 Кб, 71 просмотров)
klopizh вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите с 3dface



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Усиление проема- расчет балки, стойки... помогите студенточке :'( studentochka-87 Конструкции зданий и сооружений 16 23.09.2010 20:46
Помогите найти чертежи православных храмов leonbka Поиск литературы, чертежей, моделей и прочих материалов 5 12.03.2010 11:31
Помогите изменить вычисления в макросе Малявка Программирование 4 09.10.2009 11:56
Помогите pls узнать стоимость полного проекта (стадия AC) при реконструкции в г. Москве SSSerge Прочее. Отраслевые разделы 1 24.07.2009 13:23
ПОМОГИТЕ!! при выводе на печать ПУСТО nikashkoda AutoCAD 11 16.12.2007 19:11