Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
traitimgio

Nhờ Viết Hàm Trong Lisp

Các bài được khuyến nghị

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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. :(

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.))))))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
(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

Chỉnh sửa theo traitimgio

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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 ""))))
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

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. :)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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 ""))
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

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 :)

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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ó :(

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thiếu rau thì bổ sung bát canh chua vậy:

 

(defun b_point  (pt1 pt2 pt3 a b / ag1 ag2 phi len bet)
  (setq ag1 (angle pt2 pt1)
        ag2 (angle pt2 pt3)
        phi (- ag2 ag1)
        bet (atan (/ (* a (sin phi)) (+ (* a (cos phi)) b)))
        len (/ a (sin bet)))
  (polar pt2 (+ ag1 bet) len))
;;----------------------------
(defun c:tt  (/ pt-01 pt-02 pt-03)
 (if (and (setq pt-01 (getpoint "\nNhap toa do diem 01:"))
          (setq pt-02 (getpoint "\nNhap toa do diem 02:" pt-01))
          (setq pt-03 (getpoint "\nNhap toa do diem 03:" pt-02)))
  (command "Line" "none" (b_point pt-01 pt-02 pt-03 900 500) pt-02 ""))
 (princ))

P/s: Thứ tự p1, p2, p3 thuận chiều kim đồng hồ, p2 nằm ở đỉnh.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thiếu rau thì bổ sung bát canh chua vậy:

(defun b_point  (pt1 pt2 pt3 a b / ag1 ag2 phi len bet)
  (setq ag1 (angle pt2 pt1)
        ag2 (angle pt2 pt3)
        phi (- ag2 ag1)
        bet (atan (/ (* a (sin phi)) (+ (* a (cos phi)) b)))
        len (/ a (sin bet)))
  (polar pt2 (+ ag1 bet) len))
;;----------------------------
(defun c:tt  (/ pt-01 pt-02 pt-03)
 (if (and (setq pt-01 (getpoint "\nNhap toa do diem 01:"))
          (setq pt-02 (getpoint "\nNhap toa do diem 02:" pt-01))
          (setq pt-03 (getpoint "\nNhap toa do diem 03:" pt-02)))
  (command "Line" "none" (b_point pt-01 pt-02 pt-03 900 500) pt-02 ""))
 (princ))

P/s: Thứ tự p1, p2, p3 thuận chiều kim đồng hồ, p2 nằm ở đỉnh.

đúng yêu cầu em :).

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×