Đến nội dung


Hình ảnh
- - - - -

Nhờ Viết Hàm Trong Lisp


  • Please log in to reply
30 replies to this topic

#1 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 14 May 2016 - 10:00 PM

Nhờ viết code 1 hàm trong  lisp

Hàm trả về là điểm trong autocad.

Có 2 đường thằng giao nhau tại A.  đường thẳng 1 tạo với trục x góc a, đường thẳng 2 tạo với trục x góc b. tạo 2 đường thường // với đường thẳng 1, 2 cách đều 1 đoạn a (offset xuống phía dưới)

2 đường thẳng này giao nhau tại B. xác định điểm B này.

Theo hình học thì ta có AB tạo với trục x góc (180-a+b)/2 và AB=a/sin((180-a-b)/2 )

Hàm có 4 biến ( điểm A, kc a, góc a, góc b ).  Hình minh họa cho ý tưởng 

ccwqk39h8b00150zg.jpg


  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 14 May 2016 - 10:21 PM

Chỉ cần dùng 1 hàm polar thôi:

(setq B (polar A goc AB)).

Chú ý chuyển từ độ sang radian.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 14 May 2016 - 10:43 PM

Chỉ cần dùng 1 hàm polar thôi:

(setq B (polar A goc AB)).

Chú ý chuyển từ độ sang radian.

em biết làm hàm polar rồi. Nhưng lisp em có rất nhiều điểm A như thế cần xác định điểm B. EM muốn tạo funcion ( A, a, apha, beta) để ghi gọi nó tính ra các điểm B luôn. Em k bik cách lập hàm. :(


  • 0

#4 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 14 May 2016 - 11:26 PM

em biết làm hàm polar rồi. Nhưng lisp em có rất nhiều điểm A như thế cần xác định điểm B. EM muốn tạo funcion ( A, a, apha, beta) để ghi gọi nó tính ra các điểm B luôn. Em k bik cách lập hàm. :(

Test thử nhé!

(defun c:test  (/ a anpha beta pa)
 (setq a 500
       anpha 75
       beta 30)
 (command "Line" (setq pa (getpoint "\nPick point: ")) (b_point pa anpha beta a) ""))
;;----------------
(defun b_point  (pa anpha beta a)
 (polar pa
        (- (* 2 pi) (* pi (/ (* (+ (- 180 anpha) beta) 0.5) 180)))
        (/ a (sin (* pi (/ (* (- 180 (+ anpha beta)) 0.5) 180.))))))

  • 0

#5 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 May 2016 - 12:41 AM

(defun c:test ()
;;;;;;;;;;;;;;;;
(defun tinhtoado ( point a ang1 ang2 / pB)
(setq pB (polar point (/ (+ pi ( - ang2 ang1)) -2) (/ a (sin (/ (- pi ang1 ang2) -2)))))
)
;;;;;;;;;;;;
(setq pt-01 (getpoint "\nNhap toa do diem 01:"))
(setq pt-02 (getpoint "\nNhap toa do diem 02:"))
(setq pt-03 (getpoint "\nNhap toa do diem 03:"))
(setq ang1 (angle pt-01 pt-02))
(setq ang2 (angle pt-02 pt-03))

(COMMAND "line" (b_point pt-02 ang1 ang2 500) pt-02)
)
;;----------------
(defun b_point (pa anpha beta a)
(polar pa
(- (* 2 pi) (* pi (/ (* (+ (- 180 anpha) beta) 0.5) 180)))
(/ a (sin (* pi (/ (* (- 180 (+ anpha beta)) 0.5) 180.))))))

em tự lập hàm với thử hàm của bác đều k ra kết quả chuẩn so với hình học tính. với góc anfa= góc( p-01,p-02)=45do, beta= (p-02,p03)=315do a=500.
đây là hình ảnh so với lisp test. hình như nó liên quan đến góc âm, góc dương với 2kPi j đó. bác test giúp em vs
1r5e7d8ppp9npp7zg.jpg

1r5e7d8ppp9npp7zg.jpg


Bài viết đã được chỉnh sửa nội dung bởi traitimgio: 15 May 2016 - 12:42 AM

  • 0

#6 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 15 May 2016 - 12:52 AM

Hàm của mình, các góc đầu vào là độ, lệnh test của bạn ang1, ang2 lại là radians thì nó sai là phải rồi. => Hoặc phải đổi trong hàm, hoặc phải đổi ang1, ang2 sang độ rồi mới đưa vào hàm được.

Thử thay cái này xem:

(COMMAND "line" (b_point pt-02 (* 180.0 (/ ang1 pi))  (* 180.0 (/ ang2 pi)) 500) pt-02)


  • 0

#7 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 May 2016 - 08:59 AM

Hàm của mình, các góc đầu vào là độ, lệnh test của bạn ang1, ang2 lại là radians thì nó sai là phải rồi. => Hoặc phải đổi trong hàm, hoặc phải đổi ang1, ang2 sang độ rồi mới đưa vào hàm được.

Thử thay cái này xem:

(COMMAND "line" (b_point pt-02 (* 180.0 (/ ang1 pi))  (* 180.0 (/ ang2 pi)) 500) pt-02)

(COMMAND "line" (b_point pt-02 (* 180.0 (/ ang1 pi))  (* 180.0 (/ ang2 pi)) 500) pt-02 "")

em nhập như này cũng ko chuẩn. có vẻ như là góc (180-a+b)/2 là góc đại số, góc hình học thì -(180-a+b)/2 (ngc chiều kim đồng hồ, với giá trị góc tính sin((180-a-b)/2 ) cũng thế. vị trí điểm point bị sai


  • 0

#8 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 15 May 2016 - 09:53 AM

Vẫn hàm cũ, theo thứ tự pick điểm của bạn nhé!

(Chú ý: cách xác định góc của AutoCAD).

(defun c:tt  (/ ang1 ang2 pt-01 pt-02 pt-03 b_point)
 (defun b_point  (pa anpha beta a)
  (polar pa
         (- (* 2 pi) (* pi (/ (* (+ (- 180 anpha) beta) 0.5) 180)))
         (/ a (sin (* pi (/ (* (- 180 (+ anpha beta)) 0.5) 180.))))))
 ;;-------------------------------------------------------
 (if (and (setq pt-01 (getpoint "\nNhap toa do diem 01:"))
          (setq pt-02 (getpoint "\nNhap toa do diem 02:"))
          (setq pt-03 (getpoint "\nNhap toa do diem 03:")))
  (progn (setq ang1 (- (angle pt-02 pt-01) pi))
         (setq ang2 (- (* 2 pi) (angle pt-02 pt-03)))
         (COMMAND "line" (b_point pt-02 (* 180.0 (/ ang1 pi)) (* 180.0 (/ ang2 pi)) 500) pt-02 ""))))

  • 1

#9 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 May 2016 - 10:35 AM

 

Vẫn hàm cũ, theo thứ tự pick điểm của bạn nhé!

(Chú ý: cách xác định góc của AutoCAD).

(defun c:tt  (/ ang1 ang2 pt-01 pt-02 pt-03 b_point)
 (defun b_point  (pa anpha beta a)
  (polar pa
         (- (* 2 pi) (* pi (/ (* (+ (- 180 anpha) beta) 0.5) 180)))
         (/ a (sin (* pi (/ (* (- 180 (+ anpha beta)) 0.5) 180.))))))
 ;;-------------------------------------------------------
 (if (and (setq pt-01 (getpoint "\nNhap toa do diem 01:"))
          (setq pt-02 (getpoint "\nNhap toa do diem 02:"))
          (setq pt-03 (getpoint "\nNhap toa do diem 03:")))
  (progn (setq ang1 (- (angle pt-02 pt-01) pi))
         (setq ang2 (- (* 2 pi) (angle pt-02 pt-03)))
         (COMMAND "line" (b_point pt-02 (* 180.0 (/ ang1 pi)) (* 180.0 (/ ang2 pi)) 500) pt-02 ""))))

lisp này bjo ra kết quả đúng, nhung mình muốn hàm góc anfa, beta nhập vào là radian sẵn rồi, ang1 là góc pt-01 pt-02 với trục x. ang2 là pt-02 pt-03 với trục x thì chỉnh trong hàm như thế nào. vì mình làm nhiều hàm mà mỗi lần setq ang lại phải thêm công trừ pi mất công, nhầm lẫn. :)


  • 0

#10 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 15 May 2016 - 10:54 AM

Có cách này ko cần quan tâm góc.

 
(defun tt (pt-01 pt-02 pt-03 a / ANG1 ANG2 ANG3) 
(if (and pt-01 pt-02 pt-03 a) 
(progn
(setq ang1 (angle pt-01 pt-02)
ang2 (angle pt-01 pt-03)
ang3 (* 0.5 (+ ang1 ang2))
)
(COMMAND "line" (polar pt-01 ang3 (/ a (sin (abs (- ang1 ang3))))) pt-01 "")))
)
(defun c:tt() (tt (getpoint "\nP1:") (getpoint "\nP2:") (getpoint "\nP3:") (getreal "\nOffset:")))

pt_01 là điểm giữa.


  • 1

#11 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 May 2016 - 12:16 PM

Có cách này ko cần quan tâm góc.

 
(defun tt (pt-01 pt-02 pt-03 a / ANG1 ANG2 ANG3) 
(if (and pt-01 pt-02 pt-03 a) 
(progn
(setq ang1 (angle pt-01 pt-02)
ang2 (angle pt-01 pt-03)
ang3 (* 0.5 (+ ang1 ang2))
)
(COMMAND "line" (polar pt-01 ang3 (/ a (sin (abs (- ang1 ang3))))) pt-01 "")))
)
(defun c:tt() (tt (getpoint "\nP1:") (getpoint "\nP2:") (getpoint "\nP3:") (getreal "\nOffset:")))

pt_01 là điểm giữa.

cách này hay. em sửa lại chút để làm chỉ xuất ra tọa độ điểm B. còn lệnh thực hiện với điểm đó k phải line, line chỉ để test thôi.
(defun tt (pt-01 pt-02 pt-03 a / ANG1 ANG2 ANG3) 
(if (and pt-01 pt-02 pt-03 a) 
(progn
(setq ang1 (angle pt-01 pt-02)
ang2 (angle pt-01 pt-03)
ang3 (* 0.5 (+ ang1 ang2)))
(setq pb (polar pt-01 ang3 (/ a (sin (abs (- ang1 ang3))))) ))))
(defun c:tt () 
(COMMAND "line" (tt (getpoint "\nP1:") (getpoint "\nP2:") (getpoint "\nP3:") (getreal "\nOffset:")) pt-01 ""))
 vậy mà  khi gõ lệnh tt nhập điểm xong, báo lỗi ko hiểu lệnh tt

  • 0

#12 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 15 May 2016 - 12:39 PM

Vì trong lệnh tt bạn chưa định nghĩa biến pt-01, phải viết:

(defun c:tt ()
(COMMAND "line" (tt (setq pt-01 (getpoint "\nP1:")) (getpoint "\nP2:") (getpoint "\nP3:") (getreal "\nOffset:")) pt-01 ""))

  • 1

#13 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 May 2016 - 02:13 PM

 

Vì trong lệnh tt bạn chưa định nghĩa biến pt-01, phải viết:

(defun c:tt ()
(COMMAND "line" (tt (setq pt-01 (getpoint "\nP1:")) (getpoint "\nP2:") (getpoint "\nP3:") (getreal "\nOffset:")) pt-01 ""))

làm mình cứ loay hoay mãi. :D

5hmk93n9ksj341vzg.jpg

 

Nhờ bác giúp, bài toán trên, mở rộng chút : vẫn 3 điểm p-01, p02, p-03. cho 2 đường // với p01 p02 và p01 p03 lần lượt khoảng cách là a, b. Giao nhau ở B. Viết hầm xuất ra điểm B :)


  • -1

#14 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 May 2016 - 06:41 PM

làm mình cứ loay hoay mãi. :D

5hmk93n9ksj341vzg.jpg

 

Nhờ bác giúp, bài toán trên, mở rộng chút : vẫn 3 điểm p-01, p02, p-03. cho 2 đường // với p01 p02 và p01 p03 lần lượt khoảng cách là a, b. Giao nhau ở B. Viết hầm xuất ra điểm B :)

Hình như thuật toán giải bài này quá khó :(


  • 0

#15 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 May 2016 - 07:06 PM

Hình như thuật toán giải bài này quá khó :(

Theo Hình học:

AB= a/sina1= b/ sina2

a1+ a2=pi-a-b  góc đại số

Nếu tìm dc ra góc thì tính dc tọa độ B nhưng phức tạp,

Hỏi có thuật toán nào đơn giản hơn k?

477tgap1vaepa3tzg.jpg


  • 0

#16 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 15 May 2016 - 09:10 PM

Hình như thuật toán giải bài này quá khó :(

Bài toán hình học này là bài toán dành cho học sinh trung bình cấp II.

Viết hàm lisp này thì trên forum này cũng đếm được vài trăm.

Nhưng bạn đặt 1 đầu bài hết sức chán nản:

(180-alpha-beta)/2 rồi bảo alpha và beta tính bằng radian. Có ai đem 5 con gà trừ đi 3 bó cải chưa?


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#17 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 315 (khá)

Đã gửi 15 May 2016 - 10:13 PM

Có ai đem 5 con gà trừ đi 3 bó cải chưa?

 

 

Trừ thì chưa thấy, nhưng cộng thì có rồi bác ợ! Thậm chí người ta còn cộng thêm cả 1 chai rượu  ... :D


  • 0

#18 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 May 2016 - 10:15 PM

Bài toán hình học này là bài toán dành cho học sinh trung bình cấp II.

Viết hàm lisp này thì trên forum này cũng đếm được vài trăm.

Nhưng bạn đặt 1 đầu bài hết sức chán nản:

(180-alpha-beta)/2 rồi bảo alpha và beta tính bằng radian. Có ai đem 5 con gà trừ đi 3 bó cải chưa?

vâng. em nói k rõ. Bài toán trc bác tot 77 giúp em xong rồi. Bjo là bài toán mở rộng :( kiến thức hình học có thể có nhưng k biết mã hóa thành code. Bác có lòng giúp em


  • 0

#19 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 15 May 2016 - 10:45 PM

Tôi là người đầu tiên lên tiếng, và tất nhiên là vì muốn giúp bạn. Nhưng nay đã có tới 2 người giúp rồi, nên nhường lại cho 2 anh kia để theo 1 mạch suy nghĩ. Hẹn dịp khác sẽ giúp bạn.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#20 traitimgio

traitimgio

    biết zoom

  • Members
  • Pip
  • 19 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 16 May 2016 - 12:01 AM

Trừ thì chưa thấy, nhưng cộng thì có rồi bác ợ! Thậm chí người ta còn cộng thêm cả 1 chai rượu  ... :D

cải vs gà chắc là nhúng lẩu :), nhưng thế này rau hơi ít mà gà lại nhiều :D
  • 0