Đến nội dung


Hình ảnh
- - - - -

Tìm đoạn thẳng gần điểm nhất


  • Please log in to reply
28 replies to this topic

#21 tdvn

tdvn

    biết lệnh rotate

  • Members
  • PipPipPip
  • 134 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 20 March 2009 - 09:40 PM

Famis cũng chỉ chạy cho từng thửa, nghĩa là bạn pick vào tung centroID, cmap thì có option cho chạy cả tờ bản ðồ nhýng tốc ðộ chậm. mình không quảng cáo mà cũng kế thừa từ famis hay cmap ðển tránh các lỗi ðó, tất nhiên chạy xong vẫn cần phải kiểm tra lại một chút nhýng vì cả 1000 thửa ðó tôi ném vào 1 file, mỗi thửa nằm trên 1 layer nên khi in rất nhanh (làm thêm 1 cái lisp ðể in theo từng layer). Việc phai sửa nhiều nhất của user chỉ khi nào có lấy yếu tố thửa liền kề (tên các số thửa liền kề, tên chủ) nếu ko lấy thì kết quả ðạt rất cao.

Vấn ðề chính là phải trình bày các thửa liền kề và các nội dung liên quan. Ðó là lý do tôi muốn tìm vị trí trống nhất trong ða giác. Khi in HSKT, các thửa liền kề (cả giao thông và thủy hệ) ðã bị hình vuông cắt ði thành cái ða giác bất kỳ, xác ðịnh ðýợc cái ða giác này ðôi khi cũng rất khó. Nếu xác ðịnh ðýợc nó rồi thì có thể tìm vị trí trống nhất ðể ðặt cái nhóm số thửa, loại ðất, diện tích, hay tên ðýờng, tên sông vào.... Ngoài ra còn việc trình bày cự li, số hiệu ðiểm góc ranh sao cho chúng không ðè lên nhau khi thửa có khá nhiều cạnh cũng không hề ðõn giản. Nếu bạn làm tất cả những chuyện ðó mà với tốc ðộ nhý trên thì quá nhanh.
À, tôi không rõ bằng cái cách gì mà bạn có thể tung 1000 thửa vào một file nhỉ. Bạn chèn vào sau khi chúng ðã thành file (mỗi file một thửa) ? Nếu ngay trong thời ðiểm ðang xuất HSKT mà bạn có thể ném chúng vào một file thì tôi chýa nghĩ ra.
  • 0

#22 tdvn

tdvn

    biết lệnh rotate

  • Members
  • PipPipPip
  • 134 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 21 March 2009 - 12:36 AM

Bài toán "Tìm ðoạn thẳng gần ðiểm nhất", sau khi suy nghĩ thêm, có thể nói rõ ý nhý vậy :
1. Lýu tọa ðộ và handle tất cả các line (tạm thời không nói ðến pline) vào CSDL. Lýu nhý thế nào cho tối ýu cũng là vấn ðề ?
2. Ngýời sử dụng cung cấp một ðiểm. Bằng cách nào ðó, trả về tọa ðộ ðýờng bao nhỏ nhất (hoặc tập hợp các line mà ðýờng bao ði qua) quanh ðiểm ðó.

Cách giải của mình về vấn ðề này nhý sau :
1. Lýu x1,y1,x2,y2, id vào một kiểu dữ liệu nào ðó
2. Khi ngýời dùng cung cấp ðiểm có tọa ðộ x,y. Thao tác x, y với CSDL trên, việc tìm ra những line có tọa ðộ 2 ðầu mút gần x, y là dễ dàng. Tuy nhiên, cách làm này không tìm ra ðýợc những line có khoảng cách gần ðiểm nhýng tọa ðộ 2 ðầu mút xa ðiểm; từ ðó, nếu rõi vào trýờng hợp này, ta không tìm ðýợc ðýờng bao ðúng vì ðiểm ðã nằm ngoài ðýờng bao.
Nếu sử dụng hàm ssget của cad, không xảy ra sai sót này nhýng ssget chạy trên thực thể nhìn thấy chứ không chạy trên dữ liệu
Hình minh họa :
http://www.cadviet.com/upfiles/TAM.jpg
Ðiểm do ngýời dùng nhập là O.
Nếu dùng (ssget "c" ) của cad với cửa sổ nào ðó, ta ðýợc tập hợp chọn là những ðoạn thẳng AB, CD, CE hoặc có thể thấy ngay AB và ðýờng bao tìm ðýợc là ABGF (ðúng)
Còn cách làm của tôi chỉ ðýợc CD, CE. và ðýờng bao tìm ðýợc là ABECD không chứa ðiểm O (sai). Làm sao thấy ðýợc trong ðó còn có AB một cách ðõn giản nhất, nhanh nhất ðể tím ðýờng bao chính xác
Tất nhiên, chúng ta phải xét là dữ liệu line rất lớn và các ðoạn thẳng dài ngắn khác nhau
  • 0

#23 tdvn

tdvn

    biết lệnh rotate

  • Members
  • PipPipPip
  • 134 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 21 March 2009 - 07:54 AM

Sau khi suy nghĩ thêm và theo gợi ý của bác Nguyen Hoanh, tôi thấy sáng thêm và goí gọn chủ ðề này bao gồm 3 býớc chính :
1- Quản lý dữ liệu line theo cách thức nào ðó.
2- Trên dữ liệu ðó, tìm tập hợp (càng ít càng tốt) các ðoạn thẳng gần ðiểm (ðiểm do ngýời dùng cung cẩp)
3- Từ ðó tìm ra ðoạn thẳng xuất phát cho ðýờng boundary
Mong ðýợc các bạn tham gia hỗ trợ những ý týởng hay.
  • 0

#24 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 21 March 2009 - 07:42 PM

Sau khi suy nghĩ thêm và theo gợi ý của bác Nguyen Hoanh, tôi thấy sáng thêm và goí gọn chủ ðề này bao gồm 3 býớc chính :
1- Quản lý dữ liệu line theo cách thức nào ðó.
2- Trên dữ liệu ðó, tìm tập hợp (càng ít càng tốt) các ðoạn thẳng gần ðiểm (ðiểm do ngýời dùng cung cẩp)
3- Từ ðó tìm ra ðoạn thẳng xuất phát cho ðýờng boundary
Mong ðýợc các bạn tham gia hỗ trợ những ý týởng hay.

Tôi không rõ khó khăn thực sự của bạn nằm ở đâu?

Thứ nhất, nếu tìm đối tượng line nằm gần điểm đã cho nhất, chưa chắc line đó đã nằm trên boudary. VD:
Hình đã gửi

Thứ hai, nếu chắc chắn các đối tượng đã được vẽ thành các miền kín, thì không cần phải tìm điểm gần nhất mà vẫn có thể tìm được line nằm trên boudary bằng thuật toán khác.

Bạn có thể upload 1 file dwg ví dụ lên diễn đàn và giải thích rõ hơn về khó khăn của bạn?
  • 0

#25 tdvn

tdvn

    biết lệnh rotate

  • Members
  • PipPipPip
  • 134 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 22 March 2009 - 12:49 AM

Tôi không rõ khó khăn thực sự của bạn nằm ở đâu?

Thứ nhất, nếu tìm đối tượng line nằm gần điểm đã cho nhất, chưa chắc line đó đã nằm trên boudary. VD:
Hình đã gửi

Thứ hai, nếu chắc chắn các đối tượng đã được vẽ thành các miền kín, thì không cần phải tìm điểm gần nhất mà vẫn có thể tìm được line nằm trên boudary bằng thuật toán khác.

Bạn có thể upload 1 file dwg ví dụ lên diễn đàn và giải thích rõ hơn về khó khăn của bạn?

Tôi kèm một cái file mẫu cho bạn. Tôi chọn file vừa đủ lớn cho thấy sự phức tạp của nó và cũng đã xóa bớt các nội dung khác (đầy đủ khoảng 19M)
http://www.cadviet.c...files/mau_1.dwg
Tôi nói sơ qua về cái file này cho bạn rõ :
Đây là một file bản đồ địa chính. Tất cả ranh giới thửa đất nằm trong các layer có phần đầu cố định là "Zranh", phần tiếp sau để diễn tra nét đặc trưng của nó. Ví dụ : "Zranhrach" : ranh giáp rạch. "Zranhduong" : ranh giáp đường ...
Ở trong một thửa (là khái niệm địa chính chỉ một vùng khép kín, một số phần mềm cho hẳn nó là một cái polyline), tôi có một dấu "*" (nó đơn giản là text) để định vị, để xác định đường bao khi cần và cũng để tôi gởi cái thuộc tính như : Họ tên, địa chỉ ... vào trong đó, tất cả có khoảng 6000 thửa. Và bạn thấy đấy, trên bản vẽ của tôi không có một cái polyline nào.
Khi cần tính diện tích, tôi pick vào trong một thửa, chương trình (do tôi viết) căn cứ vào tọa độ vừa pick, tìm đoạn thẳng gần nhất, xác định vị trí của điểm và 2 đầu mút và tìm ra đường đi qua các line khép kín theo chiều ngược kim đồng hồ, vẽ cho tôi thấy hình ảnh của nó và trả về diện tích. Khi muốn tính diện tích tự động, tôi chọn những cái dấu "*", lấy tọa độ của nó cung cấp cho chương trình như trên. Nếu chương trình đang chạy mà gặp cái ngõ cụt, như minh hỏa của bạn, chương trình sẽ lùi lại tìm đường khác để đi, nếu đi không được nó báo "Không khép" và dừng lại. Trong khi chạy, chương trình không tạo ra một cái polyline nào, nó chỉ tìm các tọa độ liên tiếp qua các line khép kín mà thôi. Việc tìm đường bao và tính diện tích của tôi không sử dụng tiện ích boudary hay cadmap vì tối còn có những ý định khác nữa.

Trong chương trình của tôi có hàm tìm đoạn thẳng gần nhất để làm hướng xuât phát, trong đó có dùng hàm (ssget "c" ....)
Cái khó khăn nằm ở chỗ này. bạn biết đất, hàm ssget chạy trên thục thể nhìn thấy. nếu ở độ zoom không phù hợp, không có đối tượng cần tìm trên màn hình, hàm ssget trả về nil và dẫn đến chương trình chạy sai. Nếu zoom all, khi công việc của tôi thay đổi vị trí và tầm nhìn liên tục, việc tái tạo màn hình với dữ liệu lơn như vậy sẽ mất rất nhiêu thời gian.
Mặc khác, tôi muốn việc tìm hướng xuất phát diễn ra trên dữ liệu mà việc này đòi hỏi phải có hàm tìm ra các đoạn thẳng (thông qua tọa độ của nó đã được quản lý) gần điểm trước giống như hàm ssget.
  • 0

#26 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 22 March 2009 - 08:49 AM

Bạn hãy thử tốc độ của lisp dưới đây.

Hàm TIMB tìm LINE nằm trên boundary chứa điểm bạn nhập vào. LINE này không phải là line gần nhất nhưng chắc chắn là line nằm trên boundary.
Cú pháp: (TimB p)
P là điểm bạn cần tìm boundary.
Hàm TimB trả về ename của đối tượng Line thoả mãn.
Vi du:
(timB (list 590124.2 1181241.3 0.00))
Ket qua: Entity name: 7ef664a0>

Hãy sử dụng lệnh TIM dưới đây để thử nghiệm hàm TIMB. Bạn nen unlock các layer boundary để lệnh TIM có thể highlight đối tượng được tìm thấy cho bạn dễ nhìn.

(defun timb(p)
(command ".zoom" "e")
(setq p3 (list (- (car (getvar "VIEWCTR")) (* 1.0 (getvar "VIEWSIZE")))
(cadr p)

)
p4 (list (+ (car (getvar "VIEWCTR")) (* 1.0 (getvar "VIEWSIZE")))
(cadr p)

)
ss (ssget "f" (list p3 p4))
sl (if ss
(sslength ss)
0
)
index 0
xmin (car p4)
p4 (append p4 (list 0.0))
p (list (car p) (cadr p) 0.0)
)
(while (< index sl)
(setq ent (ssname ss index)
tt (entget ent)
index (1+ index)
)
(if (= "LINE" (cdr (assoc 0 tt)))
(progn
(setq p1 (cdr (assoc 10 tt))
p2 (cdr (assoc 11 tt))
pgiao (inters p1 p2 p p4)
)
(if (and pgiao (> xmin (car pgiao)))
(setq
xmin (car pgiao)
entmin ent
)
)
)
)
)
(command ".zoom" "p")
entmin
)

(defun c:tim ()
(setq p (getpoint "\nVao diem: "))
(setq entlinecantim (timb p))
(sssetfirst (ssadd entlinecantim) (ssadd entlinecantim))
(princ)
)

  • 0

#27 tdvn

tdvn

    biết lệnh rotate

  • Members
  • PipPipPip
  • 134 Bài viết
Điểm đánh giá: 53 (tàm tạm)

Đã gửi 22 March 2009 - 10:31 AM

Bạn hãy thử tốc ðộ của lisp dýới ðây.

Cám õn bạn. Hàm của bạn rất hay. Tốc ðộ nhanh. Lisp bạn vẫn dùng (zoom "e") và (zoom "p") nên không biết khi ðýa vào chýõng trình của tôi nó chạy nhý thế nào. ðể tôi ghép vào rồi sẽ thử xem.
Tuy nhiên, do bạn dùng (ssget "f") nên nếu line là nét ðứt và nếu point nằm giữa khoảng ðứt ðó thì hàm (ssget "f") trả về nil (bạn xem file kèm theo).
http://www.cadviet.c...pfiles/mau2.dwg
Tôi vừa mới chợt nghĩ ra ðây thôi.
Nhờ cái cách tìm line của bạn mà tôi ðã nghĩ ra cách tìm line cần thiết mà không dùng ðến ssget rồi. Cám õn bạn. Diễn ðàn thật là hữu ích.
Sẽ còn nhiều chủ ðề khác phải nhờ ðến sự hỗ trợ của bạn.
  • 0

#28 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 22 March 2009 - 12:03 PM

Cám õn bạn. Hàm của bạn rất hay. Tốc ðộ nhanh. Lisp bạn vẫn dùng (zoom "e") và (zoom "p") nên không biết khi ðýa vào chýõng trình của tôi nó chạy nhý thế nào. ðể tôi ghép vào rồi sẽ thử xem.
Tuy nhiên, do bạn dùng (ssget "f") nên nếu line là nét ðứt và nếu point nằm giữa khoảng ðứt ðó thì hàm (ssget "f") trả về nil (bạn xem file kèm theo).
http://www.cadviet.c...pfiles/mau2.dwg
Tôi vừa mới chợt nghĩ ra ðây thôi.
Nhờ cái cách tìm line của bạn mà tôi ðã nghĩ ra cách tìm line cần thiết mà không dùng ðến ssget rồi. Cám õn bạn. Diễn ðàn thật là hữu ích.
Sẽ còn nhiều chủ ðề khác phải nhờ ðến sự hỗ trợ của bạn.

Trường hợp cá biệt này bạn xử lý được.

Ví dụ tôi đưa lên chỉ để minh họa rằng có nhiều cách để giải quyết một vấn đề. Và chừng nào vấn đề còn chưa được giải quyết thấu đáo thì chúng ta không nên áp đặt bất cứ một phương pháp tiếp cận cụ thể nào. Ví dụ trong bài toán của bạn, chỉ vì bạn áp đặt rằng phải line gần nhất thì mới là line xuất phát để tìm boundary, dẫn đến bạn húc phải một hòn đá tảng.

Chắc chắn bạn sẽ tìm được các phương pháp hay hơn nhiều để xử lý vấn đề của bạn vì bạn rất tâm huyết với nó.
  • 0

#29 elleHCSC

elleHCSC

    biết lệnh copy

  • Members
  • PipPipPip
  • 119 Bài viết
Điểm đánh giá: 98 (tàm tạm)

Đã gửi 23 March 2009 - 02:01 PM

Nếu như bằng phương pháp tự động tìm thửa của bạn mà hoàn thành thì có thể gọi đó là một lệnh Bpoly_pro mới cho cad đấy, sẽ là rất tiện dụng cho người vẽ bản đồ. Bản thân tôi cũng biết dùng tính năng topo của cadmap là khó khăn đối với user ko phân lớp tốt khi vẽ hoặc kỹ năng dùng cad của họ ko tốt hay như file nó quá rối. Thực ra với các file có vài nghìn thửa gặp ko nhiều...tôi cũng như bạn ghép tất cả các tờ bản đồ vào (vd bđ của cả 1 phường) để chạy thử là chính và kiểm tra tốc độ hay tính chính xác. Trong bđ địa chính người ta đã phải cắt tờ rồi nên việc tạo hskt cho từng tờ 1 cũng không phải là quá lâu.

Khi in HSKT, các thửa liền kề (cả giao thông và thủy hệ) ðã bị hình vuông cắt ði thành cái ða giác bất kỳ, xác ðịnh ðýợc cái ða giác này ðôi khi cũng rất khó. Nếu xác ðịnh ðýợc nó rồi thì có thể tìm vị trí trống nhất ðể ðặt cái nhóm số thửa, loại ðất, diện tích, hay tên ðýờng, tên sông vào....

Chính vì cái khó khăn đó mà tôi chọn giải pháp đóng thửa trước (tạo Closed_polyline) để chính nhờ các Closed_polyline này mà có thể xác định được xem nên đặt các yếu tố liền kề vào vị trí nào cho hợp lý.

À, tôi không rõ bằng cái cách gì mà bạn có thể tung 1000 thửa vào một file nhỉ. Bạn chèn vào sau khi chúng ðã thành file (mỗi file một thửa) ? Nếu ngay trong thời ðiểm ðang xuất HSKT mà bạn có thể ném chúng vào một file thì tôi chýa nghĩ ra.

Tôi chèn tất cả các thửa vào 1 file trong quá trình tool chạy chứ không tạo mỗi thửa 1 file rồi sau đó ghép vào sau. Tôi ko viết bằng lisp nên việc tạo 1000 thửa vào 1 file ko gặp khó khăn lắm. Cmap hay famis (nếu ghi ra file) đều chạy ra mỗi thửa 1 file... làm cách này khi in hay khi cần chỉnh sửa cho các thửa trước khi in khá bất tiện vì fải mở từng file một...lâu lắm.
  • 1
Share for all, all will share !

--------------------
HTTP://WWW.HCSC.VN
HTTP://WWW.HCSC.COM.VN