Đến nội dung


Hình ảnh
- - - - -

Tính diện tích tạo nên từ những vùng giao nhau giữa 2 đường polyline


  • Please log in to reply
26 replies to this topic

#21 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 08 December 2010 - 05:01 PM

Tính 2 loại diện tích nằm giữa 2 polyline đây :

;============================================================================!
;================================PFIEVXD-CADViet.com==============================
(Defun Dscon(TDlist gd1 gd2)
(Vl-remove-if '(lambda(x)(or(<=(car x)(car Gd1))(>=(car x)(car gd2)))) TDlist))
;---------------------------------------------------------------------------------
(Defun c:TDT(/ TDlist TDlist1 TDlist2 pl1 pl2 DT DT1 DT2
TDlist11 TDlist22 i gd1 gd2 gd3 gd4 )
(Setq Pl1 (Car(Entsel"\n Select First Pline :"))
Pl2 (Car(Entsel"\n Select Second Pline :"))
TDlist (Acet-geom-intersectwith Pl1 pl2 0)
TDlist1 (Acet-geom-vertex-list PL1)
TDlist2 (Acet-geom-vertex-list Pl2)
n (Length TDList)
i 0
DT1 0
DT2 0)
(While (< i (- n 1))
(Setq Gd1 (Nth i TDlist)
Gd2 (NTh (1+ i) TDlist)
TDlist11 (Dscon TDlist1 gd1 gd2)
TDlist22 (Dscon TDlist2 gd1 gd2)
TDlist3 (Append (list gd1) TDlist11 (list gd2) (Reverse TDlist22) (list gd1)))
(Acet-pline-make (list TDlist3))
(Command "AREA" "O" (Entlast))
(Setq DT(Getvar "AREA"))
(Command "ERASE" (Entlast)"")
;------------------------------------------------------------------------------
(Setq Midpoint(Acet-geom-midpoint Gd1 Gd2))
(Command "XLINE" "Ver" Midpoint "")
(Setq gd3 (Acet-geom-intersectwith (Entlast) Pl1 0)
gd4 (Acet-geom-intersectwith (Entlast) Pl2 0)
)
(If(>=(Cadr(Car gd3))(Cadr(Car gd4)))
(Setq DT1(+ DT1 DT))
(Setq DT2(+ DT2 DT))
)
(Command "ERASE" (Entlast)"")
(Setq i(1+ i))
)
(Princ (Strcat"\n Dien tich loai 1 = " (Rtos DT1 2 2)))
(Princ (Strcat"\n Dien tich loai 2 = " (Rtos DT2 2 2)))
(Princ))
;================================PFIEVXD-CADViet.com===============================!

  • 1

#22 Happyspringla2007

Happyspringla2007

    biết pan

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

Đã gửi 22 December 2010 - 01:11 PM

Đúng là mình sử dụng các điều kiện để viết lisp với đối tượng của Nova, ý tưởng của bạn cũng là ý tưởng của mình hồi còn làm 1 vài thứ và chưa bít tí gì về lisp, h vẫn chưa làm vì xong mất roài :undecided:
Theo mình thì việc xét loại diện tích có thể xem xét thế này, từ trung điểm của 2 giao điểm vẽ 1 Xline, cắt 2 Polyline (ấy là đang nói đến đối tượng của Nova thui nhé) xét vị trí của 2 điểm ấy sẽ ra được loại diện tích cần tính

Cảm ơn bạn đã có những thông tin bổ ích. Mình đã sử dụng thử Lisp của bạn và nảy sinh vấn đề như sau: Khi đường Pline chọn đầu tiên có hướng từ bên phải qua thì chương trình tính diện tích không đúng nữa. (Đường Pline có tọa độ từ điểm đầu đến đếm cuối, Khi dùng lệnh PEDIT/Editvrtex thì nó sẽ chọn tại đỉnh đầu tiên của Pline, nếu Pline được thể hiện trọn trong khung nhìn)
  • 0

#23 Happyspringla2007

Happyspringla2007

    biết pan

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

Đã gửi 22 December 2010 - 01:33 PM

Tính 2 loại diện tích nằm giữa 2 polyline đây :


;============================================================================!
;================================PFIEVXD-CADViet.com==============================
(Defun Dscon(TDlist gd1 gd2)
(Vl-remove-if '(lambda(x)(or(<=(car x)(car Gd1))(>=(car x)(car gd2)))) TDlist))
;---------------------------------------------------------------------------------
(Defun c:TDT(/ TDlist TDlist1 TDlist2 pl1 pl2 DT DT1 DT2
TDlist11 TDlist22 i gd1 gd2 gd3 gd4 )
(Setq Pl1 (Car(Entsel"\n Select First Pline :"))
Pl2 (Car(Entsel"\n Select Second Pline :"))
TDlist (Acet-geom-intersectwith Pl1 pl2 0)
TDlist1 (Acet-geom-vertex-list PL1)
TDlist2 (Acet-geom-vertex-list Pl2)
n (Length TDList)
i 0
DT1 0
DT2 0)
(While (< i (- n 1))
(Setq Gd1 (Nth i TDlist)
Gd2 (NTh (1+ i) TDlist)
TDlist11 (Dscon TDlist1 gd1 gd2)
TDlist22 (Dscon TDlist2 gd1 gd2)
TDlist3 (Append (list gd1) TDlist11 (list gd2) (Reverse TDlist22) (list gd1)))
(Acet-pline-make (list TDlist3))
(Command "AREA" "O" (Entlast))
(Setq DT(Getvar "AREA"))
(Command "ERASE" (Entlast)"")
;------------------------------------------------------------------------------
(Setq Midpoint(Acet-geom-midpoint Gd1 Gd2))
(Command "XLINE" "Ver" Midpoint "")
(Setq gd3 (Acet-geom-intersectwith (Entlast) Pl1 0)
gd4 (Acet-geom-intersectwith (Entlast) Pl2 0)
)
(If(>=(Cadr(Car gd3))(Cadr(Car gd4)))
(Setq DT1(+ DT1 DT))
(Setq DT2(+ DT2 DT))
)
(Command "ERASE" (Entlast)"")
(Setq i(1+ i))
)
(Princ (Strcat"\n Dien tich loai 1 = " (Rtos DT1 2 2)))
(Princ (Strcat"\n Dien tich loai 2 = " (Rtos DT2 2 2)))
(Princ))
;================================PFIEVXD-CADViet.com===============================!

Xin bổ sung như sau! bạn xem và góp ý nhé!
(Defun C:TDT (/ TDlist TDlist1 TDlist2 pl1 pl2 DT DT1 DT2 TDlist11 TDlist22 i gd1 gd2 gd3 gd4
)
(Defun Dscon (TDlist gd1 gd2)
(Vl-remove-if '(Lambda (X) (Or (<= (Car X) (Car Gd1)) (>= (Car X) (Car gd2)))) TDlist)
)
(Setq Pl1 (Car(Entsel"\n Select First Pline :"))
Pl2 (Car(Entsel"\n Select Second Pline :"))
TDlist (Vl-sort (Acet-geom-intersectwith Pl1 pl2 0) (Function (Lambda (E1 E2) (< (Car E1) (Car E2)))))
TDlist1 (Vl-sort (Acet-geom-vertex-list PL1) (Function (Lambda (E1 E2) (< (Car E1) (Car E2)))))
TDlist2 (Vl-sort (Acet-geom-vertex-list Pl2) (Function (Lambda (E1 E2) (< (Car E1) (Car E2)))))
n (Length TDList)
i 0
DT1 0
DT2 0)
(While (< i (- n 1))
(Setq Gd1 (Nth i TDlist)
Gd2 (NTh (1+ i) TDlist)
TDlist11 (Dscon TDlist1 gd1 gd2)
TDlist22 (Dscon TDlist2 gd1 gd2)
TDlist3 (Append (list gd1) TDlist11 (list gd2) (Reverse TDlist22) (list gd1)))
(Acet-pline-make (list TDlist3))
(Command "AREA" "O" (Entlast))
(Setq DT(Getvar "AREA"))
(Command "ERASE" (Entlast)"")
;------------------------------------------------------------------------------
(Setq Midpoint(Acet-geom-midpoint Gd1 Gd2))
(Command "XLINE" "Ver" Midpoint "")
(Setq gd3 (Acet-geom-intersectwith (Entlast) Pl1 0)
gd4 (Acet-geom-intersectwith (Entlast) Pl2 0)
)
(If(>=(Cadr(Car gd3))(Cadr(Car gd4)))
(Setq DT1(+ DT1 DT))
(Setq DT2(+ DT2 DT))
)
(Command "ERASE" (Entlast)"")
(Setq i(1+ i))
)
(Princ (Strcat"\n Dien tich loai 1 = " (Rtos DT1 2 2)))
(Princ (Strcat"\n Dien tich loai 2 = " (Rtos DT2 2 2)))
(Princ)
)
  • 0

#24 trieubb

trieubb

    biết vẽ ellipse

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

Đã gửi 20 September 2012 - 08:59 AM

Không ổn tí nào bác "pfievxd" và bác "Happyspringla2007" ạ vấn đề bác hãy thử lại nếu nó cắt nhau trên dưới thì nó sai hết bác ạ (bác xem hình 1 nhé)
nhân đây bác sửa dùm em tính cái hình như thế này ạ (hình 2)Hình đã gửiHình đã gửi
  • 0

#25 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 20 September 2012 - 01:24 PM

Với bài toán rõ ràng như thế bạn nên hatch và đọc property Area của Hatch
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#26 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 22 September 2012 - 02:07 PM

Việc tính toán diện tích dựa vào lệnh Area hoặc dựa vào diện tích của đối tượng hatch gặp nhiều rủi ro. Với các hình không chứa các phân đoạn cong thì không nên sử dụng. Có thể coi bài toán trên là bài toán tính diện tích hình đa giác. Chia nhỏ đa giác thành các tam giác nhỏ để tính.
Với nhu cầu thông thường như hình 2 (diện tích giật cấp mái taluy) là tính diện tích 1 đa giác không tự cắt thì bạn có thể sử dụng hàm này của mình. trong đó lst là danh sách tọa độ điểm theo thứ tự đỉnh của đa giác. Hàm trả về giá trị âm nếu danh sách điểm lst theo chiều kim đồng hồ và ngược lại.

(defun Get-Area (lst / dt i)
(setq dt 0.0 i 0 lis (append lis (list (car lst))))
(repeat (1- (length lst))
(setq dt (+ dt (- (* (car (nth i lst)) (cadr (nth (1+ i) lst)))
(* (cadr (nth i lst)) (car (nth (setq i (1+ i)) lst)))))))
(* dt 0.5))
Nếu muốn tính diện tích đa giác tự cắt (như hình 1) thì bạn cần kiểm tra điều kiện tự cắt của đa giác và lấy ra danh sách các điểm tự cắt của nó. tại mỗi điểm tự cắt diện tích các tam giác con sẽ đổi dấu. dựa vào hàm trên bạn có thể tự xây dựng hàm tổng quát cho mình để dùng được cả với đa giác tự cắt.
  • 1

#27 hoangthang_470

hoangthang_470

    Chưa sử dụng CAD

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

Đã gửi 19 November 2015 - 10:45 AM

Các huynh cho hỏi, Trường hợp đặc biệt là có 2 hình tròn hay hình bất kỹ, một cái lớn, một cái bé. cái bé nằm trong cái lớn, vậy có lisp nào tính diện tích khoảng giữa 2 hình đó không nhỉ. VD như tính diện tích thành ống trên mặt cắt ngang chẳng hạn. Thank


  • 0