Đến nội dung


Hình ảnh
* * * * - 7 Bình chọn

[Hỏi]Đố vui với LISP


  • Please log in to reply
391 replies to this topic

#21 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 08 September 2011 - 09:49 PM

@bác Bình : hề, có mấy cái bên trên dùng position đó thôi bác ^^ Hàm của bác e chưa có CAD để chạy tuy nhiên đoán là có chút vấn đề, vì (vl-remove x lst) sẽ xóa toàn bộ item có giá trị X trong list của bác, nên vòng lặp sẽ chỉ chạy lần đầu xong là nghỉ ^^

@bác Giabach : Hàm của bác kết hợp ngon nghẻ giữa 4 và 8 đúng không ạ. Có lẽ tốc độ sẽ nhanh hơn cả 2 ^^
  • 1

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


#22 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 09 September 2011 - 01:59 AM

Cám ơn Ketxu về cái chủ đề và hàm Bench đánh giá tốc độ của bạn
- Nếu vđ này quan trọng với bạn, bạn hãy thử với một dữ liệu thực và lớn, phức tạp như danh sách lồng trong danh sách xem sao.

Mình cũng một vđ "đố vui" như sau :
Có rất nhiều đoạn thẳng trong mặt phẳng có tọa độ (x1 y1), (x2 y2) và đã được đánh số thứ tự. Hãy thiết kế dữ liệu và giải thuật sao cho khi ta cung cấp một điểm bất kỳ, sẽ trả về số thứ tự đoạn thẳng nằm gần nó nhất (nghĩa là đoạn nối từ điểm đến một điểm bất kỳ trên đoạn thẳng ngắn nhất) nhanh nhất.
Có thể tạo dữ liệu ban đầu bằng cách vào CAD chọn dữ liệu line, số thứ tự có thể là vị trí của nó trong tập hợp chọn. (Chú ý: Mình kg phải tìm đối tượng gần điểm trên bản vẽ mà tìm trong dữ liệu tọa độ và số thứ tự của chúng)
Vấn đề này hơi khó. Mình nghĩ vậy. Xin cám ơn các bạn
  • 0

#23 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 09 September 2011 - 06:17 AM

@bác TrungNgaMy : ^^ em làm XDDD thì có bao giờ phải xử lý list với dữ liệu lớn đâu ^^ VĐ cũng không quan trọng với em, mà chủ yếu là "vui" mà ^^
Ngoài ra, khi đố 1 câu nào đó, bác cần có đáp án ( chuẩn hoặc gần chuẩn) của nó trước rồi nhé ^^ Hề hề
Bài toán bác đưa ra tạm thời e mới nghĩ ra là có công thức tính khoảng cách từ 1 điểm đến 1 đường thẳng vecto (x1,y1) (x2,y2), ta cứ thế mà làm tới thôi chứ hỉ ?

P/S : e kiểm nghiệm thấy hàm bác gia_bach trong câu trước nhanh nhứt, có bác nào có kết quả test khác không ạ ?
  • 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


#24 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 09 September 2011 - 06:43 PM

@Ketxu
Mình hay nghi ngờ độ chuẩn xác của giải thuật nên cố kiểm tra xem thôi, mình chưa hiều các hàm xác định thời gian của bạn vì trước giờ mình cũng kg quan tâm lắm. Thấy bạn đưa ra hay hay nên mình định sd kiểm tra một số hàm mình viết. Tuy nhiên, khi sd mình có cảm giác thời gian thực kg hợp lý lắm nên làm cái hàm thủ công test thử hàm bench của bạn. Mình làm như sau đây các bạn xem hợp lý kg nhé :
(defun Testbench(Funcs ; list of functions
Args ; list of arguments
Count )
(command "_.time" "")
(bench Funcs Args Count)
(command "_.time" "")
)
Kết quả test thử như sau:
Command: (setq lst (tam 10 10) a (length lst))
30
Command: Specify opposite corner:
Command: (testbench '(finditem3) (list 2 lst) 1)
_.time
Current time: Friday, September 09, 2011 6:28:50:234 PM
Times for this drawing:
Created: Friday, September 09, 2011 5:48:58:281 PM
Last updated: Friday, September 09, 2011 5:48:58:281 PM
Total editing time: 0 days 00:39:52:391
Elapsed timer (on): 0 days 00:39:51:969
Next automatic save in: <no modifications yet>
Enter option [Display/ON/OFF/Reset]:
Command:
FINDITEM3
Tổng : ...................0 mili giây
Trung bình : 0.0000 mili giây / 1 lần
_.time
Current time: Friday, September 09, 2011 6:28:51:281 PM
Times for this drawing:
Created: Friday, September 09, 2011 5:48:58:281 PM
Last updated: Friday, September 09, 2011 5:48:58:281 PM
Total editing time: 0 days 00:39:53:437
Elapsed timer (on): 0 days 00:39:53:015
Next automatic save in: <no modifications yet>
Enter option [Display/ON/OFF/Reset]:
Command: nil
Command: (testbench '(finditem8) (list 2 lst) 1)
_.time
Current time: Friday, September 09, 2011 6:29:13:984 PM
Times for this drawing:
Created: Friday, September 09, 2011 5:48:58:281 PM
Last updated: Friday, September 09, 2011 5:48:58:281 PM
Total editing time: 0 days 00:40:16:141
Elapsed timer (on): 0 days 00:40:15:719
Next automatic save in: <no modifications yet>
Enter option [Display/ON/OFF/Reset]:
Command:
FINDITEM8
Tổng : ...................0 mili giây
Trung bình : 0.0000 mili giây / 1 lần
_.time
Current time: Friday, September 09, 2011 6:29:15:015 PM
Times for this drawing:
Created: Friday, September 09, 2011 5:48:58:281 PM
Last updated: Friday, September 09, 2011 5:48:58:281 PM
Total editing time: 0 days 00:40:17:172
Elapsed timer (on): 0 days 00:40:16:750
Next automatic save in: <no modifications yet>
Enter option [Display/ON/OFF/Reset]:
Command: nil
Command: (testbench '(finditem9) (list 2 lst) 1)
_.time
Current time: Friday, September 09, 2011 6:29:47:031 PM
Times for this drawing:
Created: Friday, September 09, 2011 5:48:58:281 PM
Last updated: Friday, September 09, 2011 5:48:58:281 PM
Total editing time: 0 days 00:40:49:187
Elapsed timer (on): 0 days 00:40:48:765
Next automatic save in: <no modifications yet>
Enter option [Display/ON/OFF/Reset]:
Command:
FINDITEM9
Tổng : ...................0 mili giây
Trung bình : 0.0000 mili giây / 1 lần
_.time
Current time: Friday, September 09, 2011 6:29:48:062 PM
Times for this drawing:
Created: Friday, September 09, 2011 5:48:58:281 PM
Last updated: Friday, September 09, 2011 5:48:58:281 PM
Total editing time: 0 days 00:40:50:219
Elapsed timer (on): 0 days 00:40:49:812
Next automatic save in: <no modifications yet>
Enter option [Display/ON/OFF/Reset]:
Command: nil

Căn cứ vào dòng
Current time: Friday, September 09, 2011 6:29:48:062 PM
trước và sau khi chạy lệnh bench của bạn cũng có thể xác định đc thời gian. Các bạn xem thử, Kg biết mình có nhầm lẫn gì kg
  • 0

#25 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 10 September 2011 - 10:05 PM

Xin lỗi bác TrungNgaMy ket đi 2 ngày nay ^^ Ketxu chưa hiểu rõ ý bác : Test hàm Bench tức là làm sao nhỉ ^^
- Hai hàm sosanh và bench không phải do Ketxu viết ^^ Tuy nhiên về cơ bản cơ chế nó cũng như nhau và rất dễ hiểu, đó là :

Bước 1 : Lấy thời gian điểm đầu
Bước 2 : Thực hiện công việc (có thể lặp đi lặp lại)
Bước 3 : Lấy mốc thời gian cuối, trừ đi thời gian đầu -> Ra thời gian tổng thực hiện => Chia cho số lần thực hiện công việc để ra thời gian trung bình

Để lấy điểm mốc thời gian đầu và cuối có thể dựa theo nhiều cách
Ở cả 2 lisp Bench và sosanh bác có thể thấy công việc (getvar "Millisecs")) ở thời điểm đầu và cuối ^^. Ngoài ra còn có CDATE,DATE...
Hàm Testbench của bác viết cũng chính là đi theo con đường như vậy.

Nếu bác nghi ngờ, hãy kiểm tra với cách tính thủ công và cách dùng Bench.
Ketxu lấy ví dụ với hàm finditem8 và lấy time bằng _VL-Times cho 1 lần thực hiện hàm nhé :
Thủ công :

(defun test1 () ;thu cong
(setq start (car(_VL-TIMES)))
(repeat 1 ;Hoac so lan khac
(finditem8 4 lst) ; Cong viec can tinh thoi gian
)
(princ (strcat "\n "
(rtos (/ (- (car (_VL-TIMES)) start) 1000.) 2 4)
" secs."
) ;_ strcat
) ;_ princ
)

Command: (setq lst (tam 1000 100) a (length lst))
19200

Command: (test1)

0.0310 secs."\n 0.0310 secs."

Command: (bench '(finditem8) (list 4 lst) 1)

FINDITEM8
Tổng : ..................31 mili giây
Trung bình : 31.0000 mili giây / 1 lần


P/S : những đoạn chữ dẫn chứng mong bác cho vào thẻ quote cho dễ đọc
  • 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 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 11 September 2011 - 01:50 AM

Xin lỗi bác TrungNgaMy ket đi 2 ngày nay ^^ Ketxu chưa hiểu rõ ý bác : Test hàm Bench tức là làm sao nhỉ ^^
- Hai hàm sosanh và bench không phải do Ketxu viết ^^ Tuy nhiên về cơ bản cơ chế nó cũng như nhau và rất dễ hiểu, đó là :

Để lấy điểm mốc thời gian đầu và cuối có thể dựa theo nhiều cách
Ở cả 2 lisp Bench và sosanh bác có thể thấy công việc (getvar "Millisecs")) ở thời điểm đầu và cuối ^^. Ngoài ra còn có CDATE,DATE...
Hàm Testbench của bác viết cũng chính là đi theo con đường như vậy.

Nếu bác nghi ngờ, hãy kiểm tra với cách tính thủ công và cách dùng Bench.
Ketxu lấy ví dụ với hàm finditem8 và lấy time bằng _VL-Times cho 1 lần thực hiện hàm nhé :
Thủ công :


(defun test1 () ;thu cong
(setq start (car(_VL-TIMES)))
(repeat 1 ;Hoac so lan khac
(finditem8 4 lst) ; Cong viec can tinh thoi gian
)
(princ (strcat "\n "
(rtos (/ (- (car (_VL-TIMES)) start) 1000.) 2 4)
" secs."
) ;_ strcat
) ;_ princ
)



P/S : những đoạn chữ dẫn chứng mong bác cho vào thẻ quote cho dễ đọc

Chẳng hiểu sao hàm tam của bạn :
Command: (setq lst (tam 1000 100) a (length lst))
19200
và của mình cho độ dài lst khác nhau :
Command: (setq lst (tam 1000 100) a (length lst))
1200
và các hàm test1 cũng cho kq kg ổn định, có lẽ do hệ thống chăng
Command: (test1)
0.0000 secs."\n 0.0000 secs."
Command: (test1)
0.0000 secs."\n 0.0000 secs."

Command: (setq lst (tam 1000 1000) a (length lst))
3000
Command: (test1)
0.0000 secs."\n 0.0000 secs."
Command: (test1)
0.0160 secs."\n 0.0160 secs."
Command: (test1)
0.0000 secs."\n 0.0000 secs."
Command: (test1)
0.0150 secs."\n 0.0150 secs."

Do đó, khi thực hiện mình thấy phải chờ 1 thời gian mới có kq mà thời gian trả về có khi là 0.0 mi li giây, nhưng một mi li giây là rất nhỏ.
Bởi vậy mình chưa hiểu ly do vì sao, có khi nào do máy mình nó bị gì
  • 0

#27 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 11 September 2011 - 02:05 AM

@bác TrungNgaMy : ^^ em làm XDDD thì có bao giờ phải xử lý list với dữ liệu lớn đâu ^^ VĐ cũng không quan trọng với em, mà chủ yếu là "vui" mà ^^ Ngoài ra, khi đố 1 câu nào đó, bác cần có đáp án ( chuẩn hoặc gần chuẩn) của nó trước rồi nhé ^^ Hề hề Bài toán bác đưa ra tạm thời e mới nghĩ ra là có công thức tính khoảng cách từ 1 điểm đến 1 đường thẳng vecto (x1,y1) (x2,y2), ta cứ thế mà làm tới thôi chứ hỉ ? P/S : e kiểm nghiệm thấy hàm bác gia_bach trong câu trước nhanh nhứt, có bác nào có kết quả test khác không ạ ?


vđ tìm điểm gần đoạn thẳng nếu nghĩ đơn giản thì ai cũng làm đc. Chỉ cần lập vòng lặp duyệt qua từng line rồi kiểm tra, nếu hình chiếu của điểm nằm trong line thì xét khoảng cách, nếu kg thì xét độ dài từ điểm đến hai đầu đoạn thẳng, cái nào cho trị ngắn nhất thì là nó. Tuy nhiên, vđ ở đây là tốc độ, khi số đoạn thẳng lên đến con số hàng trăm ngàn đoạn thẳng hoặc hơn nữa thì kg đơn giàn chút nào. Sẽ phải có PP nào đó khác hơn thì mới nhanh đc.
Bạn thấy đấy, TH của bạn khá đơn giản nhưng khi duyệt qua từng phần tử để so sánh đã thấy thời gian đáng kể rồi huống chi còn phải kiểm tra độ dài nữa.
Mình tô đoạn màu xanh để nhấn mạnh đây kg phải tìm khoảng cách ngắn nhất
  • 0

#28 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 11 September 2011 - 06:40 AM

Chẳng hiểu sao hàm tam của bạn :
Command: (setq lst (tam 1000 100) a (length lst))
19200
và của mình cho độ dài lst khác nhau :
Command: (setq lst (tam 1000 100) a (length lst))
1200
và các hàm test1 cũng cho kq kg ổn định, có lẽ do hệ thống chăng
Command: (test1)
0.0000 secs."\n 0.0000 secs."
Command: (test1)
0.0000 secs."\n 0.0000 secs."

Command: (setq lst (tam 1000 1000) a (length lst))
3000
Command: (test1)
0.0000 secs."\n 0.0000 secs."
Command: (test1)
0.0160 secs."\n 0.0160 secs."
Command: (test1)
0.0000 secs."\n 0.0000 secs."
Command: (test1)
0.0150 secs."\n 0.0150 secs."

Do đó, khi thực hiện mình thấy phải chờ 1 thời gian mới có kq mà thời gian trả về có khi là 0.0 mi li giây, nhưng một mi li giây là rất nhỏ.
Bởi vậy mình chưa hiểu ly do vì sao, có khi nào do máy mình nó bị gì

Bác còn băn khoăn về vấn đề gì thì tại sao không đọc code của nó nhỉ. :o
- Hàm Bench delay 1 giây trước khi bắt đầu thực hiện công việc
- Hàm tam e sửa lại từ hàm của bác nhưng chưa KHỬ BIẾN, nếu làm đi làm lại thì list nó cứ thế dài thêm
- Bác thử không làm gì rồi test, và vừa xem HD vừa test xem sao ? ^^ Tốc độ của máy đâu có phải bất biến ?



Hãy thiết kế dữ liệu và giải thuật sao cho khi ta cung cấp một điểm bất kỳ, sẽ trả về số thứ tự đoạn thẳng nằm gần nó nhất (nghĩa là đoạn nối từ điểm đến một điểm bất kỳ trên đoạn thẳng ngắn nhất) nhanh nhất.

vđ tìm điểm gần đoạn thẳng nếu nghĩ đơn giản thì ai cũng làm đc. Chỉ cần lập vòng lặp duyệt qua từng line rồi kiểm tra, nếu hình chiếu của điểm nằm trong line thì xét khoảng cách, nếu kg thì xét độ dài từ điểm đến hai đầu đoạn thẳng, cái nào cho trị ngắn nhất thì là nó. Tuy nhiên, vđ ở đây là tốc độ, khi số đoạn thẳng lên đến con số hàng trăm ngàn đoạn thẳng hoặc hơn nữa thì kg đơn giàn chút nào. Sẽ phải có PP nào đó khác hơn thì mới nhanh đc.
Bạn thấy đấy, TH của bạn khá đơn giản nhưng khi duyệt qua từng phần tử để so sánh đã thấy thời gian đáng kể rồi huống chi còn phải kiểm tra độ dài nữa.
Mình tô đoạn màu xanh để nhấn mạnh đây kg phải tìm khoảng cách ngắn nhất


Ketxu dốt hình học, mà đọc đề bài của bác thấy quay mòng mòng. Sao bác không cho cái hình minh họa nhỉ ^^
Bác đã có giải thuật nào chưa , và mức trần của nó là xử lý bao nhiêu lượng Dữ liệu trong bao nhiêu time ??

P/S lần 2 : những đoạn chữ dẫn chứng mong bác cho vào thẻ quote cho dễ đọc

P/S2 : 2 ngày tick Thank thuộc về bác Gia_bach hén ^^
Thank các bác rất nhiều. Từ mỗi câu trả lời mình lại học được rất rất nhiều điều ^^
  • 1

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


#29 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 12 September 2011 - 09:53 PM

Bác còn băn khoăn về vấn đề gì thì tại sao không đọc code của nó nhỉ. :o
- Hàm Bench delay 1 giây trước khi bắt đầu thực hiện công việc
- Hàm tam e sửa lại từ hàm của bác nhưng chưa KHỬ BIẾN, nếu làm đi làm lại thì list nó cứ thế dài thêm
- Bác thử không làm gì rồi test, và vừa xem HD vừa test xem sao ? ^^ Tốc độ của máy đâu có phải bất biến ?






Ketxu dốt hình học, mà đọc đề bài của bác thấy quay mòng mòng. Sao bác không cho cái hình minh họa nhỉ ^^
Bác đã có giải thuật nào chưa , và mức trần của nó là xử lý bao nhiêu lượng Dữ liệu trong bao nhiêu time ??

P/S lần 2 : những đoạn chữ dẫn chứng mong bác cho vào thẻ quote cho dễ đọc

P/S2 : 2 ngày tick Thank thuộc về bác Gia_bach hén ^^
Thank các bác rất nhiều. Từ mỗi câu trả lời mình lại học được rất rất nhiều điều ^^

Mình nghĩ cách viết hàm tính thời gian chắc kg có lỗi gì, mà lỗi có lẽ do hệ thống. Kg biết máy các bạn thế nào, máy của mình thực hiện (sau khi tắt hết các ứng dụng, kể cả mạng) vẫn cho kq kg cố định :

Command: (setq lst (tam 10000 10000) a (length lst))
30000
Command: (test1)
0.0620 secs."\n 0.0620 secs."
Command: (test1)
0.0620 secs."\n 0.0620 secs."
Command: (test1)
0.0470 secs."\n 0.0470 secs."
Command: (test1)
0.0470 secs."\n 0.0470 secs."
Command: (test1)
0.0620 secs."\n 0.0620 secs."
Command: (test1)
0.0630 secs."\n 0.0630 secs."
Command: (test1)
0.0620 secs."\n 0.0620 secs."
Command: (test1)
0.0470 secs."\n 0.0470 secs."
Command: (test1)
0.0470 secs."\n 0.0470 secs."
Command: (test1)
0.0630 secs."\n 0.0630 secs."


  • 0

#30 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 September 2011 - 10:04 PM

Ồ, thì tại sao bác vẫn lăn tăn về chuyên time đấy nhỉ ^^ Kết quả KHÔNG THỂ CỐ ĐỊNH được, vì thế các chương trình Bench mới có chức năng thực hiện nhiều lần và đưa ra thời gian trung bình ^^
Còn về câu đố của bác ?
  • 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


#31 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 12 September 2011 - 10:20 PM

Ồ, thì tại sao bác vẫn lăn tăn về chuyên time đấy nhỉ ^^ Kết quả KHÔNG THỂ CỐ ĐỊNH được, vì thế các chương trình Bench mới có chức năng thực hiện nhiều lần và đưa ra thời gian trung bình ^^ Còn về câu đố của bác ?

Ừ, kg nói về time nữa.
Vế câu đố mình có hình ảnh đây, trước đây mình có viết trên lisp nhưng nó chạy chậm nên mình để đâu quên mất, để mình viết lại :
Đây là hình ảnh của việc tìm đoạn thẳng gần điểm, các bạn xem thử.
(màu tím là đoạn thẳng trả về, ở hình 1 đoạn màu xanh có khoảng cách (vuông góc) gần điểm nhưng vẫn kg đc chọn, hình 2 có 2 đoạn thỏa yêu cầu) :
Hình đã gửi
  • 0

#32 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 September 2011 - 10:27 PM

Sao nhìn hình và đọc bài bác đố em vẫn chưa hiểu công việc là gì nhỉ :o

nếu hình chiếu của điểm nằm trong line thì xét khoảng cách, nếu kg thì xét độ dài từ điểm đến hai đầu đoạn thẳng


Xét độ dài từ điểm đến 2 đầu là tổng hay hiệu nhỉ ^^ E mù mịt quá
  • 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


#33 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 12 September 2011 - 11:08 PM

Trong lúc chờ bác TrungNgaMy giải thích rõ hơn, Ketxu có 1 câu đố vui thế này :
Để hiển thị được 1 hộp thoại như bên dưới cần tối thiểu bao nhiêu dòng code lisp / DCL (mỗi dòng là 1 cặp () )
Câu đố này không khó nhưng có thể nhiều người chưa biết ^^
Giải là 5 phát Thanks, trong vòng 1 ngày, mời các bác thư giãn nào :

Hình đã gửi
  • 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


#34 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 13 September 2011 - 06:19 AM

Sao nhìn hình và đọc bài bác đố em vẫn chưa hiểu công việc là gì nhỉ :o

Xét độ dài từ điểm đến 2 đầu là tổng hay hiệu nhỉ ^^ E mù mịt quá

Mình nói lại cho rõ. Giả sử (chỉ giả sử thôi vì câu đố của mình là bạn phải thiết kế dạng cơ sở dữ liệu) có một list bao gồm tọa độ 2 đầu của vô số line, người sd cung cấp 1 điểm bất kỳ, Hãy trả vị trí của line gần điểm nhất (không phải là khoảng cách vuông góc từ điểm đến line gần nhất). Đơn giản bạn có thể hình dung có một vòng tròn (hoặc vuông) rất nhỏ có tâm tại điểm đó, vòng tròn (hay hình vuông) này sẽ lớn dần đến khi nào nó cắt it nhất 1 line đầu tiên (cũng có TH cắt nhiều line cùng lúckhi các line này đồng qui và đỉnh gần điểm đang xét) thì dừng lại và trả về 1 hoặc các line đó (chú ý là chỉ tìm trong cơ sở dữ liệu tọa độ chứ kg phải trên bản vẽ).
  • 0

#35 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 September 2011 - 07:22 AM

Trong lúc chờ bác TrungNgaMy giải thích rõ hơn, Ketxu có 1 câu đố vui thế này :
Để hiển thị được 1 hộp thoại như bên dưới cần tối thiểu bao nhiêu dòng code lisp / DCL (mỗi dòng là 1 cặp () )
Câu đố này không khó nhưng có thể nhiều người chưa biết ^^
Giải là 5 phát Thanks, trong vòng 1 ngày, mời các bác thư giãn nào :
Hình đã gửi

Đáp án đây bạn :

(defun c:gdcl nil
(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")
(start_dialog)
)

  • 2

#36 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 September 2011 - 07:35 AM

Ồ ồ, giờ thì em đã hiểu. Tại dốt quá nên bác giải thích mấy bài mới vỡ ra khái niệm Line gần điểm nhất của bác ^^ Thế thì vòng tròn tưởng tượng mần chi ^^
Giải thuật đầu tiên :
- Dữ liệu toàn là Line nên entmakex Line invisible, kiểm tra "khoảng cách Line tới điểm" pt bằng hàm
(distance pt (vlax-curve-getClosestPointTo (vlax-ename->vla-object (setq ent (entmakex (list (cons 0 "LINE")(cons 10 p1)(cons 11 p2)(cons 60 1))))) pt))
C1 : kiểm tra distance này với distance trước, làm theo kiểu nổi bọt ^^
C2 :
- Append tất cả vào 1 list Distance, 1 list ename
- Dùng apply 'min để lấy khoảng cách nhỏ nhất + vl-position tương ứng để lấy ename -> suy ra đường thẳng
- Del toàn bộ list ename
  • 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


#37 npham

npham

    biết lệnh rotate

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

Đã gửi 13 September 2011 - 08:52 AM

Đáp án đây bạn :


(defun c:gdcl nil
(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")
(start_dialog)
)


Nếu chỉ để gọi ra thôi thì mình chỉ cần 2 dòng thôi

(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")

:D
  • 0

#38 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 September 2011 - 09:02 AM


Nếu chỉ để gọi ra thôi thì mình chỉ cần 2 dòng thôi


(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")

:D

(new_dialog "LispEd" (load_dialog "acad.dcl"))
Gọi ra dồi ... dồi "đơ" luôn :D
  • 0

#39 npham

npham

    biết lệnh rotate

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

Đã gửi 13 September 2011 - 11:28 AM

Bác nào rãnh rỗi giải trí chút ha:

Cho 2 đường tròn c1, c2. Vẽ các đoạn tiếp tuyến với cả 2 đường tròn trên (Ôn lại HH tí :D)

Chúc các bác vui vẻ.
  • 0

#40 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 13 September 2011 - 11:53 AM

Đáp án đây bạn :


(defun c:gdcl nil
(new_dialog "LispEd" (load_dialog "acad.dcl"))
(set_tile "contents" "Goi hop thoai can 4 dong code lisp")
(start_dialog)
)

Hề hề hề,
Hinh như ý của bác ketxu là phải có cả cái code DCL để có được cái hộp thoại giống như bạn ấy hiển thị cơ chứ không phải chỉ là code lisp để gọi hộp thoại.....
Hề hề hề.
Về cái khoản DCL này thì mình vẫn còn đang phải mót, chửa thể thi thố gì được. Tranh thủ ngồi đợi các bác ra tay để mót vậy....
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.