Đến nội dung


Hình ảnh
5 stars - based on 24598 reviews
- - - - -

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


  • Please log in to reply
12 replies to this topic

#1 mauthanh

mauthanh

    biết zoom

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

Đã gửi 02 July 2017 - 06:43 PM

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!


  • -1

#2 Danh Cong

Danh Cong

    biết lệnh Xplode

  • Moderator
  • PipPipPipPipPipPip
  • 481 Bài viết
Điểm đánh giá: 108 (tàm tạm)

Đã gửi 02 July 2017 - 09:11 PM

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 ^^


  • 0

              *** Vô lo - Vô nghĩ - Vô sầu hận ***
*** Chẳng thương - Chẳng giận - Chẳng đau lòng ***


#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 July 2017 - 10:43 PM

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


  • 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ờ. Và đừng làm điều ngược lại.

* 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.


#4 Danh Cong

Danh Cong

    biết lệnh Xplode

  • Moderator
  • PipPipPipPipPipPip
  • 481 Bài viết
Điểm đánh giá: 108 (tàm tạm)

Đã gửi 02 July 2017 - 11:32 PM

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


  • 0

              *** Vô lo - Vô nghĩ - Vô sầu hận ***
*** Chẳng thương - Chẳng giận - Chẳng đau lòng ***


#5 mauthanh

mauthanh

    biết zoom

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

Đã gửi 03 July 2017 - 10:51 AM

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


  • 0

#6 cuongtk2

cuongtk2

    biết lệnh mirror

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

Đã gửi 03 July 2017 - 11:33 AM

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.
  • 0

#7 mauthanh

mauthanh

    biết zoom

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

Đã gửi 03 July 2017 - 12:32 PM

@cuongtk2. Nếu được phương án B của bác thì còn gì bằng ..,thanks bác


  • 0

#8 cuongtk2

cuongtk2

    biết lệnh mirror

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

Đã gửi 03 July 2017 - 02:49 PM

;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)))))
  • 1

#9 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 July 2017 - 03:39 PM

;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


  • 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ờ. Và đừng làm điều ngược lại.

* 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.


#10 cuongtk2

cuongtk2

    biết lệnh mirror

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

Đã gửi 03 July 2017 - 03:45 PM

ừ, lâu không dùng quên mất, cứ tưởng là nó dùng để lấy int của real.
  • 0

#11 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 July 2017 - 05:01 PM

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))))

  • 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ờ. Và đừng làm điều ngược lại.

* 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.


#12 quocmanh04tt

quocmanh04tt

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 803 Bài viết
Điểm đánh giá: 381 (khá)

Đã gửi 03 July 2017 - 06:45 PM

@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 <)))


  • 0

#13 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 July 2017 - 10:14 PM

:D


  • 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ờ. Và đừng làm điều ngược lại.

* 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.