Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
mauthanh

[Yêu Cầu] Hàm Tìm Điểm

Các bài được khuyến nghị

Các bác cho em hỏi hàm, thuật toán khi biết 1 điểm có tọa độ 

Có 1 đường pline chạy phía dưới .

+Tìm điểm thuộc đường thẳng đó bên trái so với điểm đó sao cho đồng thời deltax( cách tọa độ x lớn nhất) và deltay (cách tọa độ y lớn nhất)

+Tìm điểm thuộc đường thẳng đó bên phải so với điểm đó sao cho đồng thời deltax( cách tọa độ x lớn nhất) và deltay (cách tọa độ y lớn nhất)

cảm ơn các bác!

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình chỉ đưa ra thuật toán theo suy nghĩ của mình thôi: 

B1: Có Pline --> Có được tập hợp tọa độ các đỉnh của Pline: ( Tập hợp S1 )

B2: Có điểm tọa độ điểm P ( x-P, y-P). Lọc ra được tập hợp các điểm bên trái / phải so với điểm P ( Tập hợp S2 )

B3: Từ tập hợp S2, tính ra được tập hợp các khoảng cách Delta-X ( Tập hợp S3), khoảng cách Delta-Y ( Tập hợp S4)

B4: So sánh để tìm ra giá trị lớn nhất Delta-X, Delta-Y trong B3.

B5: Tìm điểm trong tập hợp S2 thỏa mãn điều kiện trong B4:

 

Theo cách nghĩ của mình: Bài toán đưa ra có thể có nghiệm hoặc vô nghiệm ( do 1 điểm chưa chắc đã có cả X và Y đều lớn )

Suy nghĩ đúng sai thế nào, mọi người trong diễn đàn góp ý thêm ^^

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Câu hỏi này khó hiểu quá, sao Danh Cong hiểu được hay vậy?

Em nghĩ thuật toán hiểu qua ví dụ này sẽ tốt hơn:

Xét điểm H1, yêu cầu tìm các điểm nằm bên phải sao cho Delta-X và Delta-Y đồng thời lớn nhất:

Nhìn vào hình vẽ , nhận ra ngay:

+  Điểm A1, A2, A3 nằm bên phải H1.

+ Điểm A2 có Delta-X là lớn nhất so với H1. Nhưng A1 lại có Delta-Y lớn nhất so với H1.

----> Bài toán vô nghiệm.

 

Xét điểm H2;

+ Có B3, B4, B7 nằm bên phải H2.

+ B7 đồng thời có cả Delta-X , Delta-Y là lớn nhất so với H2.

---> Bài toán có nghiệm là B7. 

Tuy nhiên thì em cũng có thắc mắc: Tại sao chủ thớt không sử dụng khoảng cách, mà lại sử dụng Delta-X, Delta-Y. Và ứng dụng của thuật toán này nhằm mục đích gì.????

124641_test_1.png

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn các bác @danh cong và bác @Doan van ha. Đúng nha bác danh cong nói có thể bài toán vô nghiệm em xin thay đổi 1 chút, đầu vào vẫn là 1 điểm đã biết cho trước và 1 pline

Tìm điểm thuộc đường thẳng đó bên trái so với điểm đó sao cho điểm đó có delta y (cách tọa độ y lớn nhất) trong các điểm deltay lớn nhất lọc tìm điểm có deltax lớn nhất.

+Tìm điểm thuộc đường thẳng đó bên phải so với điểm đó sao cho điểm đó có delta y (cách tọa độ y lớn nhất) trong các điểm deltay lớn nhất lọc tìm điểm có delta x lớn nhất.

Mục đích của em  em làm bên giao thông muốn ghi các cao độ vét bùn ( ghi cao độ các điểm sâu nhất ). các bác giúp em thuật toán và các hàm tìm điểm với ạ! thank

Rb4356T.png

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

A. Nếu bạn muốn cần thuật toán để viết thì bạn hãy viết những gì bạn biết ra, bọn mình sẽ giúp bạn hoàn thiện.

B. Nếu bạn muốn có lisp cho bài toán này và qua đó để biết thêm về cách sử dụng hàm cũng được thôi.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

;Mình hướng dẫn bạn một cách tường minh nhé, vì vậy nó hơi dài dòng.

(defun deltaX (p1 p2) (if (> (car p1) (car p2)) (- (car p1) (car p2)) (- (car p2) (car p1))))

(defun deltaY (p1 p2) (if (> (cadr p1) (cadr p2)) (- (cadr p1) (cadr p2)) (- (cadr p2) (cadr p1))))

 

(defun timdiemduoi (p1 pline / getpline listdinh taptrai tapphai diemtrai diemphai)

;entget pline

(setq getpline (entget pline))

; lấy tọa độ các đỉnh pline

(setq listdinh (vl-remove-if '(lambda (e1) (/= (car e1) 10)) getpline))

;bỏ các tọa độ có y > p1y

(setq listdinh (vl-remove-if '(lambda (e1) (> (caddr e1) (cadr p1))) listdinh))

;lấy tập đỉnh bên trái với x < p1x

(setq taptrai (vl-remove-if '(lambda (e1) (> (cadr e1) (car p1))) listdinh))

;lấy tập đỉnh bên phải với x >= p1x

(setq tapphai (vl-remove-if '(lambda (e1) (<= (cadr e1) (car p1))) listdinh))

;xếp tập trái với deltaY lớn nhất; hàm cdr để bỏ đi dxf 10

(setq taptrai (vl-sort taptrai '(lambda (e1 e2) (> (deltaY (cdr e1) p1)

(deltaY (cdr e2) p1))

)))

;;lúc này mình đã có list xếp theo deltaY từ lớn đến nhỏ rồi

;; loại bỏ những phần tử có giá trị Y khac phần tử đầu

(setq taptrai (vl-remove-if '(lambda (e1) (/= (caddr e1) (caddr (car taptrai)))) taptrai))

;;tập này đã có Y bằng nhau rồi, giờ đến xếp theo deltaX lớn nhất cho tập này

(setq taptrai (vl-sort taptrai '(lambda (e1 e2) (> (deltaX (cdr e1) p1)

(deltaX (cdr e2) p1))

)))

;; phan tu dau tien la diem thoa man dieu kien

(setq diemtrai (car taptrai))

;; lay x y, them Z=0

(setq diemtrai (list

(cadr diemtrai)

(caddr diemtrai)

0.0))

;; tuong tu lam viec voi tapphai

(setq tapphai (vl-sort tapphai '(lambda (e1 e2) (> (deltaY (cdr e1) p1)

(deltaY (cdr e2) p1))))

tapphai (vl-remove-if '(lambda (e1) (/= (caddr e1) (caddr (car tapphai)))) tapphai)

tapphai (vl-sort tapphai '(lambda (e1 e2) (> (deltaX (cdr e1) p1)

(deltaX (cdr e2) p1))

)))

(setq diemphai (car tapphai)

diemphai (list

(cadr diemphai)

(caddr diemphai)

0.0))

; gan ket qua cho ham

(list diemtrai diemphai)

)

 

;;su dung ham o dang (timdiemduoi p1 pline)

;;vd (timdiemduoi (getpoint) (car (entsel)))

;;vd (setq diemtrai (car (timdiemduoi (getpoint) (car (entsel)))))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

;Mình hướng dẫn bạn một cách tường minh nhé, vì vậy nó hơi dài dòng.

(defun deltaX (p1 p2) (if (> (car p1) (car p2)) (- (car p1) (car p2)) (- (car p2) (car p1))))

(defun deltaY (p1 p2) (if (> (cadr p1) (cadr p2)) (- (cadr p1) (cadr p2)) (- (cadr p2) (cadr p1))))

 

Bạn viết hàm delta như thế thì tội hàm abs lắm! :D

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Quick Code

 

(defun C:HA(/ p e lst lstT lstP lstYT1 lstYP1 lstYT2 lstYP2)
 (if
  (and
   (setq p (getpoint "\nPick point: "))
   (setq e (car (entsel "\nChon Pline: "))))
  (progn
   (setq lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (= (car x) 10)) (entget e))))
   (setq lstT (vl-remove-if '(lambda(x) (> (car x) (car p))) lst))
   (setq lstP (vl-remove-if '(lambda(x) (< (car x) (car p))) lst))
   (setq lstYT1 (vl-sort lstT '(lambda(e1 e2) (< (cadr e1) (cadr e2)))))
   (setq lstYP1 (vl-sort lstP '(lambda(e1 e2) (< (cadr e1) (cadr e2)))))
   (setq lstYT2 (vl-remove-if-not '(lambda(e) (equal (cadr e) (cadr (car lstYT1)) 1E-3)) lstYT1))
   (setq lstYP2 (vl-remove-if-not '(lambda(e) (equal (cadr e) (cadr (car lstYP1)) 1E-3)) lstYP1))
   (MPoint (car (vl-sort lstYT2 '(lambda(e1 e2) (< (car e1) (car e2))))))
   (MPoint (car (vl-sort lstYP2 '(lambda(e1 e2) (> (car e1) (car e2))))))))
 (princ))  
(defun MPoint(p)
 (entmake (list (cons 0 "POINT") (cons 10 p))))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@Bác Hạ! Dùng hàm này sort có vẻ "mấu" hơn (sau khi có lstT và lstP):

 

(defun 2dsortpoint  (l f)
    (vl-sort l
             '(lambda (x y)
                (cond ((equal (cadr x) (cadr y) 1e-3) (f (car x) (car y)))
                      ((< (cadr x) (cadr y)))))))

*** Makepoint:

(MPoint (car (2dsortpoint lstP >)))

(MPoint (car (2dsortpoint lstT <)))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×