Đến nội dung


Hình ảnh
- - - - -

[Thảo luận] Biện pháp tăng tốc độ trong các chương trình Lisp


  • Please log in to reply
44 replies to this topic

#21 Skywings

Skywings

    biết lệnh erase

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

Đã gửi 16 September 2013 - 04:33 PM

ok, got it. Xin lỗi nhé, mình có phần vội vàng, chủ quan và góp phần làm loãng topic :). Đền bù cái thanks nhé ^^.


  • 0

#22 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 16 September 2013 - 04:36 PM

1). Đời có khi xui, mặc dầu xác xuất là 1/100500 lần >> Bạn phải set closestPnt cho thằng (ssname ss 0) nữa.

2). Cái của bạn chạy nhanh hơn vì nó chỉ xử lý list một lần.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#23 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 16 September 2013 - 04:47 PM

Gửi anh em hàm "phun" ngẫu nhiên 1 số Point để test.
Và đây là 1 cách mà Hà cho là lâu nhất (duyệt qua toàn bộ selection).

Hề hề hề,
1/- Các bác ơi, cái ý tưởng ban đầu của mình thực ra là chưa trọn vẹn vì như các bác đã thấy, khoảng cách giửa tâm vùng tới điểm xét chưa thể chứng minh trong vùng có chứa điểm có khoảng cách tới điểm đang xét là nhỏ nhất hay lớn nhất. Ý tưởng phân vùng ban đầu chỉ nhằm loại bớt các đối tượng Tuy nhiên có thể nó chưa thực hợp lý về cách xét để lấy vùng chọn có chứa điểm gần nhất. Mình cũng đã thử nhưng chưa tìm được cách xét nào cho đúng nhất,
2/- Có một ý tưởng khác về cách loại bỏ bớt các điểm ngoại lai mình đã làm thử và thấy có vẻ ổn như sau:
Xác định một vùng chọn từ điểm đả cho tới điểm đầu tiên của tập chọn 
Xét số lượng điểm trong vùng chọn này Nếu khác 0 sẽ lấy vùng chọn tiếp theo từ điểm đã cho tới trung điểm của đoạn nối điểm đã cho với điểm đầu của tập chọn.
Nếu số lượng điểm lớn hơn 0 sẽ tiếp tục như vậy cho tới khi tập chọn rỗng. Lúc này áp dụng lisp của bác Gia bạch hay bác Skywing với tập chọn cuối cùng không rỗng sẽ rút ngắn khá nhiều thời gian. 
Nhược điểm của cách làm này là khi điểm đã cho nằm đủ xa với vị trí của tập chọn thì bước lặp loại trừ sẽ cực ngắn và bước lặp tìm khoảng cách sẽ không giảm được bao nhiêu. 
Các bác hãy thử xem nhé.
http://www.cadviet.c...5194_mindis.lsp
 
Các bác nhớ hộ rằng cái này mình chưa xét tới tập hợp các điểm 3D.  Với tập các điểm 3D có nhẽ việc chọn vùng chọn sẽ phức tạp hơn nhiều chứ không thể chỉ dựa vào hàm ssget đượ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.

#24 Skywings

Skywings

    biết lệnh erase

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

Đã gửi 16 September 2013 - 04:48 PM

1). Đời có khi xui, mặc dầu xác xuất là 1/100500 lần >> Bạn phải set closestPnt cho thằng (ssname ss 0) nữa.

2). Cái của bạn chạy nhanh hơn vì nó chỉ xử lý list một lần.

 

Bingo! Thiệt tình là quên điểm này. Mình sẽ bổ sung vào code trên. Cám ơn bác nhắc nhở :).


  • 0

#25 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 September 2013 - 06:12 PM

Mình có nói bỏ luôn Z đâu, chỉ quy về mp XY trong việc chia vùng chọn.

 

 

 

Mình đã test rùi, tham số "W" và "C" chắc chắn được, "WP" và "CP" chắc chắn ... ko được ^^. Đoạn code đơn giản để test, bác có thể thử phun vài điểm point lên màn hình và thay đổi Z cho chúng.

 

(defun c:t1 (/ N P1 P2 PNT PNTLST)
  (setq	p1 (3dPnt->2dPnt (getpoint "1st point"))
	p2 (3dPnt->2dPnt (getpoint "2nd point"))
  )
  (setq
;;;    pntLst (ssget "_W" p1 p2)
    pntLst
     (ssget "_C" p1 p2)
  )
  (setq n 0)
  (if pntLst
    (repeat (sslength pntLst)
      (setq pnt (cdr (assoc 10 (entget (ssname pntLst n)))))
      (print pnt)
      (setq n (1+ n))
    )
  )
  (princ)
)
(defun 3dPnt->2dPnt (3dpt)
  (list (float (car 3dpt)) (float (cadr 3dpt)))
)

 

(ssget "_C" p1 p2) chỉ chọn được đối tượng point nằm trên p1, p2 mà thôi......


  • 0

#26 Skywings

Skywings

    biết lệnh erase

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

Đã gửi 16 September 2013 - 07:12 PM

(ssget "_C" p1 p2) chỉ chọn được đối tượng point nằm trên p1, p2 mà thôi......

Bác đã test chưa!? Mình test vẫn chọn được điểm với Z>=0 hay Z<0 :) !!


  • 0

#27 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 September 2013 - 07:20 PM

Bác đã test chưa!? Mình test vẫn chọn được điểm với Z>=0 hay Z<0 :) !!

 

Đã test rồi, test hồi hôm qua cơ, rồi mới hồi âm ngay từ bài viết thứ 2 (bài viết của bác Bình)

 

P/S : Tìm ra rồi, do bạn test trên 2D, Tue_NV test trên không gian 3D. (SW Iso metric)

Và bài toán tổng quát là trong không gian -> nên phải test trên không gian 3D


  • 0

#28 Skywings

Skywings

    biết lệnh erase

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

Đã gửi 16 September 2013 - 08:18 PM

Lạ nhỉ :huh: , mình vẫn chọn được, cho dù SW Iso metric hay một góc view 3D bất kỳ, SSGET với tham số "C" hoặc "W" vẫn chọn được tất cả điểm 3D trong vùng chọn của nó.


  • 0

#29 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 16 September 2013 - 09:13 PM

Tôi test thì kết quả thế này: bất kể Z là gì, miễn nó nằm trong vùng chọn thì sẽ được chọn hết.

Đây là bản vẽ để test.

http://www.cadviet.c...t_select_3d.dwg

Bác Tue_NV test khác thì gởi bản vẽ ấy lên cho mọi người ngâm cứu với.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#30 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 17 September 2013 - 02:28 AM

Vậy là rõ rồi, nó phụ thuộc vào khung nhìn VIEW, trong view này thì chọn được, trong view kia thì không chọn được

Tỉ dụ : có 3 toạ độ: 0(0 0 0), A(0 20 0) , B (0 10 10)

Trong mp Oxy bạn chọn theo hàm ssget với tham số "c" điểm 0 và A thì chắc chắn điểm B được chọn

Nhưng trong không gian Oxyz  ssget với tham số "c" điểm 0 và A thì điểm B sẽ không được chọn nữa

Kiểu như trong file Bac HA, mình xoay khung nhìn (Orbit) đi thì cũng với 2 điểm chọn đó -> kết quả chọn sẽ khác liền.....

=> Nó phụ thuộc vào khung nhìn 


  • 0

#31 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 17 September 2013 - 06:07 AM

Vậy là rõ rồi, nó phụ thuộc vào khung nhìn VIEW, trong view này thì chọn được, trong view kia thì không chọn được

Tỉ dụ : có 3 toạ độ: 0(0 0 0), A(0 20 0) , B (0 10 10)

Trong mp Oxy bạn chọn theo hàm ssget với tham số "c" điểm 0 và A thì chắc chắn điểm B được chọn

Nhưng trong không gian Oxyz  ssget với tham số "c" điểm 0 và A thì điểm B sẽ không được chọn nữa

Kiểu như trong file Bac HA, mình xoay khung nhìn (Orbit) đi thì cũng với 2 điểm chọn đó -> kết quả chọn sẽ khác liền.....

=> Nó phụ thuộc vào khung nhìn 

Đỏ: khung này không tạo thành hình chữ nhật?


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#32 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 17 September 2013 - 07:10 AM

Đỏ: khung này không tạo thành hình chữ nhật?

 

Là 3 điểm trong không gian......


  • 0

#33 Skywings

Skywings

    biết lệnh erase

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

Đã gửi 17 September 2013 - 07:43 PM

Mình thấy vấn đề này đã bắt đầu đi khá xa topic rùi. Mình và bác Hà chỉ muốn chứng minh là trong vùng chọn tạo bởi 2 điểm thì SSGET "C" có thể chọn được các điểm 3d, không nhất thiết phải là đồng phẳng hay nằm "trên" 2 điểm góc đó. Trường hợp file của bác Hà, với 2 điểm cố định, thì khi xoay view, vùng chọn có thể bị nhỏ đi và một số điểm lọt ra ngoài. Vấn đề xác định 2 điểm góc ứng với từng view để có thể bao hết các điểm đã là vấn đề khác.

 

Với Lisp của bác Bình mình test thử thấy chưa ổn định lắm, với 105000 điểm tạo ra từ lisp bác Gia_Bach, khi chọn điểm ở vùng góc trái dưới có trường hợp rơi vào vòng lặp vô hạn, và một số điểm cho kết quả không chính xác (điểm 2d).


  • 1

#34 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 17 September 2013 - 08:34 PM

Mình thấy vấn đề này đã bắt đầu đi khá xa topic rùi. Mình và bác Hà chỉ muốn chứng minh là trong vùng chọn tạo bởi 2 điểm thì SSGET "C" có thể chọn được các điểm 3d, không nhất thiết phải là đồng phẳng hay nằm "trên" 2 điểm góc đó. Trường hợp file của bác Hà, với 2 điểm cố định, thì khi xoay view, vùng chọn có thể bị nhỏ đi và một số điểm lọt ra ngoài. Vấn đề xác định 2 điểm góc ứng với từng view để có thể bao hết các điểm đã là vấn đề khác.

 

Với Lisp của bác Bình mình test thử thấy chưa ổn định lắm, với 105000 điểm tạo ra từ lisp bác Gia_Bach, khi chọn điểm ở vùng góc trái dưới có trường hợp rơi vào vòng lặp vô hạn, và một số điểm cho kết quả không chính xác (điểm 2d).

Hề hề hề,

Thực tình mình cũng chưa test hết các trường hợp. Song mình trộm nghĩ khả năng vòng lặp chạy vô hạn là rất ít bởi vùng chọn sẽ được thu hẹp dần và nhất định sẽ tới lúc vùng chọn không chứa điểm nào, tức là tập ss bằng nil.

Nếu vòng lặp chạy vô hạn tức có nghĩ là điểm cho trước trùng với một hay nhiều điểm trong tập hợp điểm này. Khi đó không cần xét cũng khẳng định được rằng khoảng cách nhỏ nhất sẽ là 0.

Về việc điểm tìm được chưa chính xác thì mình nghĩ là có nhẽ cách chọn vùng như của mình chưa hợp lý chăng???

Theo thiển ý của mình, nếu điểm cho trước nằm ngoài vùng chọn của tập hợp các điểm đã cho thì kết quả có thể chuẩn xác. Song nếu điểm cho trước nằm trong vùng chọn chứa tập hợp điểm này thì có nhẽ sẽ có sai số do việc lấy tập hợp điểm dể xét chưa phải là bao đủ góc 360 độ quanh điểm cho trước.

Như vậy nều ta thay đổi cách lấy vùng chọn có nhẽ sẽ cho kết quả chuẩn xác hơn.

Mình sẽ thử viết lại theo hướng này.

Mong các bác đèn giời soi xét.

Và đây là kết quả:

Với cùng một bản vẽ fun điểm từ lisp của bác giabach, nếu sử dụng lisp test của bác giabach thì thời gian sẽ hết khoảng 13.000ms Còn nếu sử dụng lisp dưới đây sẽ cho thời gian hết khoảng 1.000 ms và kết quả hầu như trùng nhau.

Các bác thử xem nhé.

http://www.cadviet.c...94_mindis_1.lsp


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#35 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 18 September 2013 - 10:25 AM

Mặc dù level lisp chủa mình vẫn còn rất thấp, nhưng mình mạo muội góp ý như thế này:

- Mình thấy cái lisp của bác Bình có thể cho kết quả sai trong trường hợp đặc biệt mình nêu sau:

Giã sử, điểm đầu tiên trong tập chọn ss là điểm B và tập ss gồm chỉ 2 điểm A & B (hình dưới)

>>> tập ss1 chỉ có B >>> PB được kẻ ra >>> sai

80156_abp.jpg

- Đề nghị bác một hướng như sau (vì level chưa đạt nên ko thể biến ý tưởng thành lisp đc, mong bác thông cảm)

+ Dùng vòng lặp + hàm polar ---> tạo polygon n cạnh >>> gần giống đường tròn, để tạo hàm ssget "CP" theo bán kính (ý tưởng bác Gia_bạch) Số cạnh có thể để người dùng tuỳ chọn hoặc là bác cân nhắc, tuỳ vào độ chính xác yêu cầu d_ trong hình (vì n lớn thì độ chính xác cao song lisp sẽ chạy chậm)

80156_p.jpg

+ Bán kính đầu tiên nhập vào có thể lấy bằng k/c từ p đến điểm đầu như Bác đã làm.

+ Để khắc phục cái nhược điểm bác đã nêu (khi điểm chọn đủ xa thì giường như ko loại đc điểm nào ra khỏi tập ss ban đầu)

có thể làm như sau:

* Với lần chon thứ nhất (R = k/c điểm đầu trong tập ss đến p):

1. Nếu sslength>0 >>> gán R = R/2,

2. Nếu sslength = 0 (thường chỉ xảy ra khi chọn sai số lớn & lọt vào trường hợp như hình dưới, khi điểm A là điểm đầu tiên trong tập ss & A nằm lệch vị trí các đỉnh của polygon chọn) ---> kết luận luôn điểm A gần nhất, thoát chương trình.

80156_a.jpg

* Với các lần chọn sau:

1. Nếu sslength>0 >>> gán R = R/2

2. Nếu sslength = 0 >>> gán R = (R + R last) / 2 .

Và nếu sau m lần lặp bán kính liên tục mà sslength của tập chọn >0 & ko đổi >>> kết thúc vòng lặp R (hoặc là ấn định bước nhảy min cho vòng lặp R để thoát khỏi vòng lặp)

>>>>>>>>>>lấy ss cuối để xét


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#36 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 18 September 2013 - 05:24 PM

Mặc dù level lisp chủa mình vẫn còn rất thấp, nhưng mình mạo muội góp ý như thế này:

- Mình thấy cái lisp của bác Bình có thể cho kết quả sai trong trường hợp đặc biệt mình nêu sau:

Giã sử, điểm đầu tiên trong tập chọn ss là điểm B và tập ss gồm chỉ 2 điểm A & B (hình dưới)

>>> tập ss1 chỉ có B >>> PB được kẻ ra >>> sai

80156_abp.jpg

- Đề nghị bác một hướng như sau (vì level chưa đạt nên ko thể biến ý tưởng thành lisp đc, mong bác thông cảm)

+ Dùng vòng lặp + hàm polar ---> tạo polygon n cạnh >>> gần giống đường tròn, để tạo hàm ssget "CP" theo bán kính (ý tưởng bác Gia_bạch) Số cạnh có thể để người dùng tuỳ chọn hoặc là bác cân nhắc, tuỳ vào độ chính xác yêu cầu d_ trong hình (vì n lớn thì độ chính xác cao song lisp sẽ chạy chậm)

80156_huong.jpg

+ Bán kính đầu tiên nhập vào có thể lấy bằng k/c từ p đến điểm đầu như Bác đã làm.

+ Để khắc phục cái nhược điểm bác đã nêu (khi điểm chọn đủ xa thì giường như ko loại đc điểm nào ra khỏi tập ss ban đầu)

có thể làm như sau:

* Với lần chon thứ nhất (R = k/c điểm đầu trong tập ss đến p):

1. Nếu sslength>0 >>> gán R = R/2,

2. Nếu sslength = 0 (thường chỉ xảy ra khi chọn sai số lớn & lọt vào trường hợp như hình dưới, khi điểm A là điểm đầu tiên trong tập ss & A nằm lệch vị trí các đỉnh của polygon chọn) ---> kết luận luôn điểm A gần nhất, thoát chương trình.

80156_111.jpg

* Với các lần chọn sau:

1. Nếu sslength>0 >>> gán R = R/2

2. Nếu sslength = 0 >>> gán R = (R + R last) / 2 .

Và nếu sau m lần lặp bán kính liên tục mà sslength của tập chọn >0 & ko đổi >>> kết thúc vòng lặp R (hoặc là ấn định bước nhảy min cho vòng lặp R để thoát khỏi vòng lặp)

>>>>>>>>>>lấy ss cuối để xét

Hề hề hề,

Rất tiếc là không nhìn thấy cái hình vẽ của bác, nên mình cũng chưa hình dung ra lỗi. Bởi vì theo mình nghĩ thì trong ví dụ bác đưa ra khi Kc PB > PA. Như vậy với việc chọn tập SS dựa trên vùng chọn là một hình vuông có tâm là p thì rõ ràng điểm A phải xuất hiện ngay trong tập ss ở bước lặp đầu tiên rồi. Sang  bước lặp thứ hai giả sử điểm A không năm trong tập ss mới tức là tập ss là nil. Khi đó ta phải xét khoảng cách PA và PB vì tập ss1 lúc này có hai phần tử cơ mà.

vậy thì sẽ không có chuyện lisp sẽ nối ngay PB được.

Có thể mình chưa hiểu rõ ý bác song mình cứ suy luận mò như vậy. trúng trất mong bác chỉ rõ thêm.....

Còn về góp ý của bác, mình nghĩ kết quả có nhẽ không khác bao nhiêu vì cái vùng chọn hình vuông của mình lớn hơn cái vùng chọn là polygon hay thậm chì là hình tròn bán kính PB bác ạ. Bởi cái hình tròn này là nội tiếp trong hình vuông mà mình dùng để chọn. Hình vuông này có tâm là P và mỗi cạnh dài là 2d 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.

#37 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 18 September 2013 - 11:26 PM

Góp vui với các bác một tí:

Capture1-1_zps242ce447.png

Bộ này dù rất cũ nhưng thông tin thì còn nhiều thứ phải học, link tải ở đây.

Nhờ có mấy bác mà mình mới lục lại 2 quyển sách này, bỏ xó em nó lâu quá rồi, giờ mới thấy có nhiều thứ mình phải đọc lại...

 

@DVH: tập 1 có nói về thuật toán tìm kiếm nhị phân đó.


  • 6
Clear sky!

MF Rock collection.

#38 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 19 September 2013 - 08:12 AM

@Bác PTB: Srr, mình nhầm :D .

Ah, còn cái đề nghị khi length ss1 = 0 thì chọn ra ngoài như ý của mình thì sao ?! Có dùng đc ko ?


  • -1

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#39 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 19 September 2013 - 10:03 AM

@Bác PTB: Srr, mình nhầm :D .

Ah, còn cái đề nghị khi length ss1 = 0 thì chọn ra ngoài như ý của mình thì sao ?! Có dùng đc ko ?

Hề hề hề,

Sorry bác, mình kích nhầm nút trừ mất rồi, chả biết phục hồi thế nào nữa.

Vì mình sử dụng hàm ssget với tham số "c" nên chắc chắn lần đầu tiên của vòng lặp sẽ khó có chuyện nó là nil bác ạ  Còn nếu (sslength ss) là 1 thì chắc chắn bước lặp thứ 2 sẽ là 0 và ta chỉ cần lấy 1 khoảng cách để mà so sánh thôi và kết quả sẽ ra là duy nhất.

Do tập ss1 luôn là tập ss chứa các điểm cuối cùng trước khi tập này trở thành nil ở bước lặp cuối nên tập ss1 không thể có (sslength ss1) = 0 được 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.

#40 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 19 September 2013 - 10:45 AM

ý mình là khi tập ss nil, bác có thể chưa vội gán ss1 = ss last mà bác hãy cho nó mở rộng vùng chọn ra ngoài với phạm vi bằng 1/2 tổng vùng chọn ss ko nil & vùng chọn nil


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson