Đế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

#1 haimed

haimed

    biết vẽ circle

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

Đã gửi 13 November 2010 - 09:25 AM

Mình đang muốn tính diện tích tạo nên bởi những vùng giao nhau giữa 2 polyline: khi chọn 2 polyline bất kỳ nếu chúng giao nhau tạo nên những vùng kín thì lisp sẽ hatch những vùng đấy và tính diện tích các vùng đó. Có bác nào giúp mình với.
Thanks nhiều.
  • 0

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 November 2010 - 09:55 AM

Mình đang muốn tính diện tích tạo nên bởi những vùng giao nhau giữa 2 polyline: khi chọn 2 polyline bất kỳ nếu chúng giao nhau tạo nên những vùng kín thì lisp sẽ hatch những vùng đấy và tính diện tích các vùng đó. Có bác nào giúp mình với.
Thanks nhiều.

Bạn có thể làm theo các bước :
1. chọn 2 polyline kín
2. Chuyển 2 polyline thành Region -> Lấy vùng giao (Intersect) 2 Region này.
3. hatch những vùng đấy và tính diện tích các vùng đó
  • 0

#3 haimed

haimed

    biết vẽ circle

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

Đã gửi 13 November 2010 - 10:26 AM

Bạn có thể làm theo các bước :
1. chọn 2 polyline kín
2. Chuyển 2 polyline thành Region -> Lấy vùng giao (Intersect) 2 Region này.
3. hatch những vùng đấy và tính diện tích các vùng đó

Ý mình là 2 polyline bất kỳ, nếu là pl hở thì không tạo đc region và intersect đúng k. Tue_nv có phương pháp nào khác không. Thanks bạn đã quan tâm.
  • 0

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 November 2010 - 10:34 AM

Ý mình là 2 polyline bất kỳ, nếu là pl hở thì không tạo đc region và intersect đúng k. Tue_nv có phương pháp nào khác không. Thanks bạn đã quan tâm.

Với các Pline hở thì Break tại các điểm giao nhau rồi mới tạo Region
Tính diện tích của các Region được tạo ra này.

Trên diễn đàn đã có Lisp của anh gia_bach, bác DuongTrungHuy và của bạn PhamngocTu viết về cách tạo Region hay Boundary nhưng đều có 1 khuyết điểm nhất định. Bạn chịu khó tìm nhé. Trong topic Viết Lisp theo yêu cầu phần 2 <_<

Để không bị mất đối tượng nguồn Polyline thì bạn nên copy đối tượng nguồn tại vị trí của chính nó rồi thao tác trên đối tượng mới vừa copy ra nầy
  • 1

#5 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 13 November 2010 - 10:45 AM

Ý mình là 2 polyline bất kỳ, nếu là pl hở thì không tạo đc region và intersect đúng k. Tue_nv có phương pháp nào khác không. Thanks bạn đã quan tâm.

Hề hề hề,
Chào bạn haimed,
Cái vụ này theo mình nhớ thì trên diễn đàn có lisp rồi mà. Bạn chịu khó tìm kiếm xem sao....
Nếu bạn có thể thì theo mình cái lisp này cũng không quá phức tạp.
Bạn có thể thử làm xem.
1/- Pick vào vùng giao nhau để tạo boundary (lưu ý là trên màn hình phải chứa chọn vùng giao nhau đó.
2/- dùng lệnh AREA để lấy diện tích và chu vi của boundary.
3/- Dùng (getvar "area") sẽ cho bạn cái diện tích đó thôi.

Cách làm này có thể khác với suy nghĩ của bạn là chọn hai polyline, song theo mình nó có vẻ tiện dụng hơn là việc chọn polyline vì các polyline có thể khá lớn nằm ngoài màn hình và khi đó sẽ không lấy boundary được mặc dầu thực tế là vẫn có bạn ạ. Hơn nữa nó cũng giúp bạn kiểm soát được các vùng đã tính diện tích mà không sợ bị trùng do trên bản vẽ có thể có nhiều polyline và chúng cắt nhau theo các vùng chồng lên nhau bạn ạ.
Hề hề hề, đó là thiển ý của mình, nếu không trúng với ý của bạn mong bạn dừng chấp nhé.
Hế hề hề....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 November 2010 - 10:54 AM

Hề hề hề,
Chào bạn haimed,
Cái vụ này theo mình nhớ thì trên diễn đàn có lisp rồi mà. Bạn chịu khó tìm kiếm xem sao....
Nếu bạn có thể thì theo mình cái lisp này cũng không quá phức tạp.
Bạn có thể thử làm xem.
1/- Pick vào vùng giao nhau để tạo boundary (lưu ý là trên màn hình phải chứa chọn vùng giao nhau đó.
2/- dùng lệnh AREA để lấy diện tích và chu vi của boundary.
3/- Dùng (getvar "area") sẽ cho bạn cái diện tích đó thôi.

Cách làm này có thể khác với suy nghĩ của bạn là chọn hai polyline, song theo mình nó có vẻ tiện dụng hơn là việc chọn polyline vì các polyline có thể khá lớn nằm ngoài màn hình và khi đó sẽ không lấy boundary được mặc dầu thực tế là vẫn có bạn ạ. Hơn nữa nó cũng giúp bạn kiểm soát được các vùng đã tính diện tích mà không sợ bị trùng do trên bản vẽ có thể có nhiều polyline và chúng cắt nhau theo các vùng chồng lên nhau bạn ạ.
Hề hề hề, đó là thiển ý của mình, nếu không trúng với ý của bạn mong bạn dừng chấp nhé.
Hế hề hề....

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

Hế hề hề....
Bác Bình cứ nghĩ đơn giản quá. Bác đã tính đến trường hợp 2 polyline hở giao nhau bởi nhiều vùng chưa?.
  • 1

#7 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 13 November 2010 - 12:08 PM

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

Hế hề hề....
Bác Bình cứ nghĩ đơn giản quá. Bác đã tính đến trường hợp 2 polyline hở giao nhau bởi nhiều vùng chưa?.

Hề hề hề,
Chưa bác ạ, vậy nên mình mới nghĩ ra cái củ chuối là pick từng chú cho chắc, khỏi sợ nhầm lẫn hay sót xiếc gì bác ạ.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#8 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 14 November 2010 - 11:14 AM

Cùng chung thắc mắc với Haimed ( H aime D ? ^^) : Thuật toán của mình từ lúc băn khoăn, cũng cả tháng trước roài, nhưng chưa thử thực hiện vì chưa thạo code lắm, là như thế này :
1 Xác định các điểm giao của 2 đường
Từ điểm giao đầu đến điểm giao 2 tạo 1 vùng kinh, từ 3-4,5-6...
2.Tạo danh sách điểm của các vùng kín bằng việc lấy tọa độ các đỉnh của 2 đường nằm giữa 2 giao điểm, sắp xếp sao cho đúng thứ tự
3. Tính diện tích các vùng kín đó bằng cách chia nhỏ thành các tam giác
4.Cộng các diện tích lại là ok
Vướng mắc ở chỗ là : đối với vùng kín là đa giác lồi thì thuật toán chia nhỏ thành tam giác là ok, còn với các đa giác lõm thì chưa biết xử lý thế nào
;-----------------------------------
Mình đã cải tiến được Lisp tính diện tích của công ty (hoặc có khi của Cadviet nhà mình cũng nên) khá ưng ý, nhưng muốn tự động hóa công việc tính toán lên mức cao nhất thì đúng là phải nghiên cứu đến việc tính diện tích vùng giao giữa 2 đường
  • 0

#9 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 14 November 2010 - 03:29 PM

Cùng chung thắc mắc với Haimed ( H aime D ? ^^) : Thuật toán của mình từ lúc băn khoăn, cũng cả tháng trước roài, nhưng chưa thử thực hiện vì chưa thạo code lắm, là như thế này :
1 Xác định các điểm giao của 2 đường
Từ điểm giao đầu đến điểm giao 2 tạo 1 vùng kinh, từ 3-4,5-6...
2.Tạo danh sách điểm của các vùng kín bằng việc lấy tọa độ các đỉnh của 2 đường nằm giữa 2 giao điểm, sắp xếp sao cho đúng thứ tự
3. Tính diện tích các vùng kín đó bằng cách chia nhỏ thành các tam giác
4.Cộng các diện tích lại là ok
Vướng mắc ở chỗ là : đối với vùng kín là đa giác lồi thì thuật toán chia nhỏ thành tam giác là ok, còn với các đa giác lõm thì chưa biết xử lý thế nào
;-----------------------------------
Mình đã cải tiến được Lisp tính diện tích của công ty (hoặc có khi của Cadviet nhà mình cũng nên) khá ưng ý, nhưng muốn tự động hóa công việc tính toán lên mức cao nhất thì đúng là phải nghiên cứu đến việc tính diện tích vùng giao giữa 2 đường

Bạn đã tính tới trường hợp PLINE chứa Arc chưa?
Bài toán ra đề là Pline bất kì????
  • 1

#10 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 14 November 2010 - 04:56 PM

Hì, đề là polyline mà, tính đến spline và arc thì cái thuật toán của em phá sản roài
  • 0

#11 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 14 November 2010 - 06:39 PM

Hì, đề là polyline mà, tính đến spline và arc thì cái thuật toán của em phá sản roài

Bài tham khảo:

Chào thanhduan2407
Do bạn biết lập trình, tui chỉ cung cấp giải pháp cho bạn triển khai.

B1. Xác định tọa độ của các đỉnh hình chử nhật bao quanh "vùng kín"
- có thể dùng hàm getBoundingBox : http://s.cadviet.com/m
B2. array đối tượng trong phạm vi hình chử nhật này.
- quá dễ :iluvyousmiley:
B3. xóa các đối tượng phía ngòai "vùng kín"
- tham khảo Lisp xóa tất cả đối tượng nằm ngoài curve. : http://s.cadviet.com/n

Chú ý : làm việc với "vùng kín" lúc nào cũng rắc rối và phức tạp. Tuy nhiên nếu thành công thì có nhiều thú vị đang chờ bạn đấy.
Cố lên! :D


  • 1

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#12 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 15 November 2010 - 08:12 AM

Nói thật là vẫn chưa hiểu rõ ý của câu trả lời của bác đâu :iluvyousmiley:
  • 0

#13 haimed

haimed

    biết vẽ circle

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

Đã gửi 15 November 2010 - 01:25 PM

1 Xác định các điểm giao của 2 đường
Từ điểm giao đầu đến điểm giao 2 tạo 1 vùng kinh, từ 3-4,5-6...
2.Tạo danh sách điểm của các vùng kín bằng việc lấy tọa độ các đỉnh của 2 đường nằm giữa 2 giao điểm, sắp xếp sao cho đúng thứ tự

-Mình đang khó ở vấn để này, bạn có giải quyết được thì giúp mình với.

3. Tính diện tích các vùng kín đó bằng cách chia nhỏ thành các tam giác

-Nếu giải quyết được vấn đề trên thì việc tính diện tích vùng kín đó bằng cách vẽ 1 đường pl theo danh sách điểm bạn tạo được, dùng lệnh area tính dt pl đó là xong, kể cả đa giác lõm cũng tính được.

-haimed = H aime D , sao bạn biết vậy? Mỗi tội đây là kỉ niệm buồn của mình :iluvyousmiley:
  • 0

#14 haimed

haimed

    biết vẽ circle

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

Đã gửi 15 November 2010 - 01:45 PM

Với các Pline hở thì Break tại các điểm giao nhau rồi mới tạo Region

Phương án break của bạn cũng rất hay, nhưng mình gặp phải vấn đề thế này:
+ Khi break polyline thì nó tạo thành 2 đối tượng mới, dùng entlast thì get đc name 1 đối tượng còn đối tượng thứ 2 mình không biết cach select thế nào
+ Giả sử get name được cả 2 đối tượng mới tạo thành thì cũng không biết xác định đối tượng nào dùng để tạo region.
Bạn giúp mình giải quyết vấn đề này với.

@phamthanhbinh: yêu cầu đề bài của mình là chỉ chọn 2 polyline, mình không được pick hay làm gì nữa, các thao tác còn lại đều do lisp thực hiện và tính toán.
  • 0

#15 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 15 November 2010 - 02:52 PM

@HaimeD : Uh, cũng hợp lý đấy, theo mình thì thế này :
Ta xác định được các giao điểm của 2 pline bằng hàm acet-geom-intersecwith
Sắp xếp thì trước hết làm 1 cái chương trình con lấy các đỉnh pline nằm giữa 2 điểm giao nhau (hehe, thực ra mình làm rồi, nhưng bài toán của mình rất đơn giản là các đỉnh vốn dĩ nó đã sắp sẵn theo thứ tự tăng dần của hoành độ X nên nếu hợp ý bạn thì mình post lên). Giả sử sau đó ta có được 2 danh sách lst1 và lst2 là các đỉnh của pline 1 và pline2 nằm giữa giao1 và giao2 :
=> Danh sách sắp xếp là : giao1 + lst1 + giao 2 + (reverse lst2) : hi, ok chưa ? đã đủ các đỉnh của đa giác rồi đấy, có thể thêm giao1 vào cuối danh sách tùy bạn
;-------------------------------------------------------------------
Normallement, je parle francais
  • 0

#16 haimed

haimed

    biết vẽ circle

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

Đã gửi 16 November 2010 - 01:47 PM

các đỉnh vốn dĩ nó đã sắp sẵn theo thứ tự tăng dần của hoành độ X

Nếu các đỉnh sắp xếp thì có thể làm như cách của bạn. Mình có cách làm đơn giản hơn nhưng chỉ áp dụng cho trường hợp 2 polyline chỉ giao nhau tại 2 điểm và tạo nên 1 vùng kín
(defun c:tdt()
(setq pl1 (car(entsel))
pl2 (car(entsel))
)
;(command "copy" pl1 "" (vlax-curve-getStartPoint pl1) (vlax-curve-getStartPoint pl1) "")
;(setq pl3 (entlast))
;(command "copy" pl2 "" (vlax-curve-getStartPoint pl2) (vlax-curve-getStartPoint pl2) "")
;(setq pl4 (entlast))

(setq gd1 (car(giaodt pl1 pl2))
gd2 (cadr(giaodt pl1 pl2))
p (vlax-curve-getStartPoint pl2)
)


(command "trim" pl1 "" (vlax-curve-getEndPoint pl2) (vlax-curve-getStartPoint pl2) "")
(command "trim" pl2 "" (vlax-curve-getEndPoint pl1) (vlax-curve-getStartPoint pl1) "")
(command "region" pl1 pl2 "")
(setq reg (entlast))
(command "area" "o" reg)
(setq dientich (getvar "area"))

)


Normallement, je parle francais

Chắc học cầu đường pháp xây dựng ah
  • 2

#17 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 18 November 2010 - 03:07 PM

Mấy nay bận quá, chưa check cái lisp của bạn HaimeD, nhưng thông thường thực tế mình cũng thường chỉ quan tâm để trường hợp như trên, 2 Pline 1 vùng kín, Mình học PFIEV nhìn cái username là đoán được roài mà .hì
  • 0

#18 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 25 November 2010 - 08:46 PM

Hehe, ngồi mấy ngày viết một cái lisp cho công việc, xong roài, thích cái lisp của HaimeD ở cái lệnh "TRIM", đây là cách giải quyết vấn đề theo thuật toán của mình Lisp tính diện tích giữa 2 Pline
(Defun Dscon(TDlist gd1 gd2)(Vl-remove-if '(lambda(x)(or(<=(car x)(car Gd1))(>=(car x)(car gd2)))) TDlist))
(Defun c:TDT()
(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
DT 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")DT))
(Princ(Strcat"\n Tong dien tich hien tai la : "(Rtos DT 2 2)))
(Command "ERASE" (Entlast)"")
(Setq i(1+ i))
)
(Princ (Strcat"\n Tong dien tich nam giua 2 duong Pline = " (Rtos DT 2 2)))
(Princ))

Đã check thử vài lần, thấy cũng tạm, có gì mọi người góp ý luôn nhé :leluoi:
  • 1

#19 Happyspringla2007

Happyspringla2007

    biết pan

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

Đã gửi 03 December 2010 - 01:50 PM

Tiện đây các bạn cho mình hỏi tí. Có phải bạn tính diện tích giữa hai đường pline để phục vụ cho chươg trình tương tự như Nova , Roadplan phải không. Mình từng có ý nghĩ tính diện tích giữa hai đường Pline. Nhưng lúc trước mình đặt ra yêu cầu hơi khác. Tính diện tích giữa hai đường Pline bất kỳ và phân ra 2 loại diện tích. Khi Pline1 nằm trên Pline2 thì cho diện tích loại 1, khi pline1 nằm dưới Pline2 thì cho diện tích loại 2. Khi chúng cắt nhau (lên, xuống) sẽ có đồng thời 2 loại diện tích. Khi dùng một đường thẳng đứng di chuyển từ trái qua phải, nếu nó không cắt đồng thời 2 pline thì 2 loại diện tích đều bằng 0
  • 0

#20 pfievxd

pfievxd

    biết vẽ spline

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

Đã gửi 04 December 2010 - 09:28 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
  • 0