Đến nội dung


Hình ảnh
- - - - -

[Đã xong] lisp vẽ lỗ khoan


  • Please log in to reply
5 replies to this topic

#1 tamhoncuada10313

tamhoncuada10313

    biết zoom

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

Đã gửi 02 August 2007 - 11:54 AM

(defun c:lokhoan (/ c1 d d1 d2 d3 d4 c2 p1 p2 p3 p4 )
(setq c1 (getpoint "\n Nhap toa do ve:")
d (getreal "\n khoang cach giua 2 tam:")
d1 (getreal "\n duong kinh duong tron 1:")
d2 (getreal "\n duong kinh duong tron 2:")
d3 (getreal "\n duong kinh duong tron nho 1:")
d4 (getreal "\n duong kinh duong tron nho 2:")
)
(setq c2 (polar c1 0 d)
p1 (polar c1 (/ pi 2) (/ d1 2))
p2 (polar c2 (/ pi 2) (/ d2 2))

p3 (polar c1 0 (/ d1 2))
p4 (polar c2 0 (-(/ d2 2)))
)
(command "circle" c1 "d" d1
"circle" c2 "d" d2
"circle" c1 "d" d3
"circle" c2 "d" d4
"line" p1 p2 ""
"select" "last" ""
"mirror" "last" "" c1 c2 "N"
".trim" "p" "last" "" p3 p4 ""
)
)

Tui muốn vẽ hình như thế này
Hình đã gửi
Nhưng không hiếu sai ở đâu mà chạy không đc.Mong các bác sửa giùm
  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 02 August 2007 - 12:06 PM

* Lisp của bạn chạy tốt, thuật toán sai.
Vì thế chịu, phải viết lại thôi.

* Đây là bài toán hình học không hề đơn giản. Mấu chốt bài toán là làm sao để vẽ được đường bao của nó. còn hai vòng tròn nhỏ bên trong thì chỉ là mắt muỗi thôi.

* tạm thời, đặt tên hình như sau:
Hình đã gửi

* Ta phải xác định được các toạ độ p3, p4, p5, p6, p7, p8 từ các toạ độ p1, p2 và hai bán kính r1 và r2. Để từ đó lần lượt vẽ các đoạn thẳng p3-p4, p5-p6 và các cung tròn p3-p7-p5 và p4-p8-p6.

* Để xác định điểm các điểm này, ta sẽ xác định thông qua khoảng cách tương đối với các điểm gốc p1, p2 và các góc tương đối giữa vectơ tạo bởi chúng và hai điểm này với trục x. Tóm lại, chúng ta sẽ xác định toạ độ của chúng thông qua các hệ toạ độ cực với tâm toạ độ lần lượt là p1 và p2.

* Để xác định p3:
- cần xác định góc p1,p3.
- Để xác định góc p1,p3 ta thấy góc này bằng góc tuyệt đối giữa p1, p2 cộng thêm góc p2-p1-p3 (tạm đặt tên là g).
- g=arctan(b/a).
- a = r1-r2.
- b = căn bậc hai của bình phương cạnh huyền l trừ đi bình phương của a.
- l là khoảng cách giữa p1 và p2

* Tương tự như vậy với các đỉnh còn lại.

* Và như vậy, mã lệnh lisp sẽ là:

(defun c:lokhoan()
(setq p1 (getpoint "\nTam 1: ")
r1 (getdist p1 "\nBan kinh 1: ")
p2 (getpoint "\nTam 2: ")
r2 (getdist p2 "\nBan kinh 2: ")
l (distance p1 p2)
a (abs (- r1 r2))
b (sqrt (- (* l l) (* a a)))
g (atan b a)
p3 (polar p1 (+ (angle p1 p2) g) r1)
p4 (polar p2 (+ (angle p1 p2) g) r2)
p5 (polar p1 (- (angle p1 p2) g) r1)
p6 (polar p2 (- (angle p1 p2) g) r2)
p7 (polar p1 (+ (angle p1 p2) pi) r1)
p8 (polar p2 (+ (angle p2 p1) pi) r2)
)
(luuos)
(setvar "osmode" 0)
(command ".line" p3 p4 "")
(command ".line" p5 p6 "")
(command ".arc" p3 p7 p5)
(command ".arc" p4 p8 p6)
(traos)
(princ "\nVao ban kinh duong tron thu nhat:")
(command ".circle" p1 pause)
(princ "\nVao ban kinh duong tron thu hai:")
(command ".circle" p2 pause)
(princ)
)
(defun luuos ()
(setq
HOANH_OSMODE (getvar "OSMODE")
HOANH_AUTOSNAP (getvar "AUTOSNAP")
)
)
(defun traos ()
(if HOANH_OSMODE
(setvar "OSMODE" HOANH_OSMODE)
)
(if HOANH_AUTOSNAP
(setvar "AUTOSNAP" HOANH_AUTOSNAP)
)
)

  • 0

#3 DCL

DCL

    biết vẽ circle

  • Members
  • PipPip
  • 32 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 02 August 2007 - 03:05 PM

* Lisp của bạn chạy tốt, thuật toán sai.
Vì thế chịu, phải viết lại thôi.

* Đây là bài toán hình học không hề đơn giản. Mấu chốt bài toán là làm sao để vẽ được đường bao của nó. còn hai vòng tròn nhỏ bên trong thì chỉ là mắt muỗi thôi.

* tạm thời, đặt tên hình như sau:
Hình đã gửi

* Ta phải xác định được các toạ độ p3, p4, p5, p6, p7, p8 từ các toạ độ p1, p2 và hai bán kính r1 và r2. Để từ đó lần lượt vẽ các đoạn thẳng p3-p4, p5-p6 và các cung tròn p3-p7-p5 và p4-p8-p6.

* Để xác định điểm các điểm này, ta sẽ xác định thông qua khoảng cách tương đối với các điểm gốc p1, p2 và các góc tương đối giữa vectơ tạo bởi chúng và hai điểm này với trục x. Tóm lại, chúng ta sẽ xác định toạ độ của chúng thông qua các hệ toạ độ cực với tâm toạ độ lần lượt là p1 và p2.

* Để xác định p3:
- cần xác định góc p1,p3.
- Để xác định góc p1,p3 ta thấy góc này bằng góc tuyệt đối giữa p1, p2 cộng thêm góc p2-p1-p3 (tạm đặt tên là g).
- g=arctan(b/a).
- a = r1-r2.
- b = căn bậc hai của bình phương cạnh huyền l trừ đi bình phương của a.
- l là khoảng cách giữa p1 và p2

* Tương tự như vậy với các đỉnh còn lại.

* Và như vậy, mã lệnh lisp sẽ là:


(defun c:lokhoan()
(setq p1 (getpoint "\nTam 1: ")
r1 (getdist p1 "\nBan kinh 1: ")
p2 (getpoint "\nTam 2: ")
r2 (getdist p2 "\nBan kinh 2: ")
l (distance p1 p2)
a (abs (- r1 r2))
b (sqrt (- (* l l) (* a a)))
g (atan b a)
p3 (polar p1 (+ (angle p1 p2) g) r1)
p4 (polar p2 (+ (angle p1 p2) g) r2)
p5 (polar p1 (- (angle p1 p2) g) r1)
p6 (polar p2 (- (angle p1 p2) g) r2)
p7 (polar p1 (+ (angle p1 p2) pi) r1)
p8 (polar p2 (+ (angle p2 p1) pi) r2)
)
(luuos)
(setvar "osmode" 0)
(command ".line" p3 p4 "")
(command ".line" p5 p6 "")
(command ".arc" p3 p7 p5)
(command ".arc" p4 p8 p6)
(traos)
(princ "\nVao ban kinh duong tron thu nhat:")
(command ".circle" p1 pause)
(princ "\nVao ban kinh duong tron thu hai:")
(command ".circle" p2 pause)
(princ)
)
(defun luuos ()
(setq
HOANH_OSMODE (getvar "OSMODE")
HOANH_AUTOSNAP (getvar "AUTOSNAP")
)
)
(defun traos ()
(if HOANH_OSMODE
(setvar "OSMODE" HOANH_OSMODE)
)
(if HOANH_AUTOSNAP
(setvar "AUTOSNAP" HOANH_AUTOSNAP)
)
)



Đây là bài toán nghiêng về tính toán hình học hơn là viết lisp. Bác Hoành ơi đoạn lisp của bác chỉ đúng với một nửa thôi. Có nghĩa là nếu cho đường kính vòng tròn bên trái nhỏ hơn thì sẽ ra hình khác : 2 cạnh bên lúc này không phải tiếp tuyến với đường tròn nữa. Có lẽ phải phân biệt vòng tròn nào lớn hơn đặt ở đâu mới có công thức tính thích hợp.
  • 0

#4 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 02 August 2007 - 03:18 PM

Đây là bài toán nghiêng về tính toán hình học hơn là viết lisp. Bác Hoành ơi đoạn lisp của bác chỉ đúng với một nửa thôi. Có nghĩa là nếu cho đường kính vòng tròn bên trái nhỏ hơn thì sẽ ra hình khác : 2 cạnh bên lúc này không phải tiếp tuyến với đường tròn nữa. Có lẽ phải phân biệt vòng tròn nào lớn hơn đặt ở đâu mới có công thức tính thích hợp.

Vẫn đúng mà!

DCL thử chưa?
  • 0

#5 DCL

DCL

    biết vẽ circle

  • Members
  • PipPip
  • 32 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 02 August 2007 - 03:34 PM

Vẫn đúng mà!

DCL thử chưa?


Dcl đã thử rồi! Cụ thể đường kính vòng tròn 1 nhỏ hơn đường kính vòng tròn 2 thì không đúng. Định đưa hình lên cho rõ nhưng không được, xin hỏi bác thông thường đưa hình lên bằng cách nào?
  • 0

#6 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 02 August 2007 - 03:41 PM

Dcl đã thử rồi! Cụ thể đường kính vòng tròn 1 nhỏ hơn đường kính vòng tròn 2 thì không đúng. Định đưa hình lên cho rõ nhưng không được, xin hỏi bác thông thường đưa hình lên bằng cách nào?

sorry!

tôi nhầm!
Đoạn lisp trên cần sửa lại một chút.
Mã lệnh (abs (- r1 r2)) cần phải sửa thành (- r1 r2) tức là bỏ hàm abs đi. Như vậy thì sẽ đúng trong mọi trường hợp.

Mã lệnh mới như sau:

(defun c:lokhoan()
(setq p1 (getpoint "\nTam 1: ")
r1 (getdist p1 "\nBan kinh 1: ")
p2 (getpoint "\nTam 2: ")
r2 (getdist p2 "\nBan kinh 2: ")
l (distance p1 p2)
[b]a (- r1 r2)[/b]
b (sqrt (- (* l l) (* a a)))
g (atan b a)
p3 (polar p1 (+ (angle p1 p2) g) r1)
p4 (polar p2 (+ (angle p1 p2) g) r2)
p5 (polar p1 (- (angle p1 p2) g) r1)
p6 (polar p2 (- (angle p1 p2) g) r2)
p7 (polar p1 (+ (angle p1 p2) pi) r1)
p8 (polar p2 (+ (angle p2 p1) pi) r2)
)
(luuos)
(setvar "osmode" 0)
(command ".line" p3 p4 "")
(command ".line" p5 p6 "")
(command ".arc" p3 p7 p5)
(command ".arc" p4 p8 p6)
(traos)
(princ "\nVao ban kinh duong tron thu nhat:")
(command ".circle" p1 pause)
(princ "\nVao ban kinh duong tron thu hai:")
(command ".circle" p2 pause)
(princ)
)
(defun luuos ()
(setq
HOANH_OSMODE (getvar "OSMODE")
HOANH_AUTOSNAP (getvar "AUTOSNAP")
)
)
(defun traos ()
(if HOANH_OSMODE
(setvar "OSMODE" HOANH_OSMODE)
)
(if HOANH_AUTOSNAP
(setvar "AUTOSNAP" HOANH_AUTOSNAP)
)
)

  • 0