Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
Huyminer

CẦN GIÚP GIẢI BÀI TOÁN SẮP XẾP TẬP ĐIỂM NGẪU NHIÊN

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

Chào mọi người!

Hiện giờ mình đang viết 1 đoạn mã VBA phục vụ công việc.

Mình gặp vấn đề sắp xếp thứ tự các điểm ngẫu nhiên

có hình minh họa phía dưới

Mình đang sắp xếp bằng phương pháp x+y và xếp từ lớn tới nhỏ nhưng không được như ý lắm

Mọi người có thể giúp mình sắp xếp, đánh số các điểm theo tứ tự từ trên xuống dưới, phải qua trái được không?

Mình xếp như kia đoạn đầu đoạn cuối, nhưng khúc giữa lại bị lỗi

Xin cảm ơn!

Untitled.png

  • 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
9 giờ trước, Huyminer đã nói:

Chào mọi người!

Hiện giờ mình đang viết 1 đoạn mã VBA phục vụ công việc.

Mình gặp vấn đề sắp xếp thứ tự các điểm ngẫu nhiên

có hình minh họa phía dưới

Mình đang sắp xếp bằng phương pháp x+y và xếp từ lớn tới nhỏ nhưng không được như ý lắm

Mọi người có thể giúp mình sắp xếp, đánh số các điểm theo tứ tự từ trên xuống dưới, phải qua trái được không?

Mình xếp như kia đoạn đầu đoạn cuối, nhưng khúc giữa lại bị lỗi

Xin cảm ơn!

Untitled.png

Nếu là code lisp thì mình có thể giú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

  Chắc thớt hỏi giải thuật thôi chứ ko wan tâm ngôn ngữ. Nhưng ít ra thớt phải post cái file lên chứ ko lẽ bắt người khác vẽ lại.

  Giải thuật thì có ý thế này:

Lấy điểm x max và y max làm trục, chiếu tất cả điểm còn lại lên trục đó rồi cứ theo vị trí to nhỏ mà đánh số thui.

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 viết ngắn gọn nhất có thể nên bạn thớt chịu khó đọc thêm bài viết này để hiểu ý mình: https://viblo.asia/p/cac-thuat-toan-sap-xep-co-ban-Eb85ooNO52G
- Chọn dùng thuật toán bubble sort 

(mình hay viết bằng lisp nên chả quan tâm thuật toán gì, cứ áp cho nó cái vl-sort là khỏi phải nghĩ, không biết các ngôn ngữ khác thì thế nào)

- Giờ đến phần Phép so sánh, tức là: lúc nào thì đổi chỗ 2 phần tử cho nhau

Dùng hàm như dưới đây với input là 2 điểm P1, P2; output là có hay không phải đổi chỗ 2 phần tử

079ec8d82416d0488907.thumb.jpg.6605105eab7a8be00a057cec85b28788.jpg

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

Code lisp của nó chỉ như này thôi, tạ ơn VL-SORT đã giúp bớt đi bao nhiêu dòng code

 

(defun sortlist_LR-TB(ename_list)
(vl-sort ename_list    (function (lambda (a b) 
    (if    (>    (cadr (L:ename-dxf a 10))    (cadr (L:ename-dxf b 10))    )
     T     (if    (=    (cadr (L:ename-dxf a 10))    (cadr (L:ename-dxf b 10))    )
            (<    (car (L:ename-dxf a 10))    (car (L:ename-dxf b 10))    )
        );if
    );if
)))
);defun

(defun L:ename-dxf(ename code)    (cdr (assoc code (entget ename))))

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ập hợp các điểm của mình không đơn thuần là nó chạy theo trục XY

Các tập điểm có thể chạy xiên như này chứ không thẳng hàng nên phép chiếu và so sánh các điểm với trục x và y mình đã thử rồi và không thành công

Untitled.png

  • Vote giảm 2

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
21 phút trước, Huyminer đã nói:

tập hợp các điểm của mình không đơn thuần là nó chạy theo trục XY

Các tập điểm có thể chạy xiên như này chứ không thẳng hàng nên phép chiếu và so sánh các điểm với trục x và y mình đã thử rồi và không thành công

 

Ít nhất bạn phải có file cho người ta test chứ.

Trong các điểm bạn đưa thì gần như không có quy luật nào chính xác. Bạn phải tìm 1 quy luật tương đối gần đúng với nó nhất để sort.

Bạn dề xuất sort theo x+y thì không đúng rồi. Theo mình thấy là nên xoay trục tọa đô rồi sort

 

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
26 phút trước, ngokiet đã nói:

Ít nhất bạn phải có file cho người ta test chứ.

Trong các điểm bạn đưa thì gần như không có quy luật nào chính xác. Bạn phải tìm 1 quy luật tương đối gần đúng với nó nhất để sort.

Bạn dề xuất sort theo x+y thì không đúng rồi. Theo mình thấy là nên xoay trục tọa đô rồi sort

 

đây là file 

hck.dwg

  • Vote giảm 2

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

Đầu tiên  phải chọn trục để sort (VD từ điểm 1 đến 9), trục Y lấy vuông góc với trục trước theo ý định sort, sau đó translate toàn bộ point theo ma trận chuyển đổi. Lúc này sort được.

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
1 giờ} trướ}c, cuongtk2 đã nói:

Đầu tiên  phải chọn trục để sort (VD từ điểm 1 đến 9), trục Y lấy vuông góc với trục trước theo ý định sort, sau đó translate toàn bộ point theo ma trận chuyển đổi. Lúc này sort được.

sort toàn bộ tập điểm luôn chứ sort 1 vài điểm thì nói làm gì

  • Vote giảm 3

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
1 giờ} trướ}c, Huyminer đã nói:

sort toàn bộ tập điểm luôn chứ sort 1 vài điểm thì nói làm gì

Không hiểu đây là thái độ của người muốn nhờ người khác giúp hay là người ta phải xin xỏ để được giúp?

 

21 giờ trước, Huyminer đã nói:

đây là file 

hck.dwg

 

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
48 phút trước, Doan Nguyen Van đã nói:

Không hiểu đây là thái độ của người muốn nhờ người khác giúp hay là người ta phải xin xỏ để được giúp?

 

 

Chác là 1 boss nào đây mà, bác @Doan Nguyen Van thông cảm cho.

Nhưng hình như boss này không hiểu người khác nói gì, người ta nói 1 đằng boss lại hiểu 1 nẻo, vấn đề của boss coi bộ khó giải quyết lắ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
If SSETO.Count > 0 Then
        ReDim Preserve arPoint(SSETO.Count - 1, 2)
        ReDim Preserve arPointN(SSETO.Count - 1, 2)
        For iSSETO = 0 To SSETO.Count - 1
            Set SGETO = SSETO.Item(iSSETO)
            PointC = SGETO.Center
            arPoint(iSSETO, 0) = PointC(0): arPoint(iSSETO, 1) = PointC(1): arPoint(iSSETO, 2) = PointC(2)
        Next iSSETO
        aCount = 0
        For iCount = LBound(arPoint) To UBound(arPoint)
            For jCount = LBound(arPoint) To UBound(arPoint)
                If jCount = LBound(arPoint) Then
                    rmPoint(0) = arPoint(jCount, 0): rmPoint(1) = arPoint(jCount, 1): rmPoint(2) = arPoint(jCount, 2)
                    rmPointUCS = ThisDrawing.Utility.TranslateCoordinates(rmPoint, acWorld, acUCS, False)
                    lmPoint(0) = arPoint(jCount, 0): lmPoint(1) = arPoint(jCount, 1): lmPoint(2) = arPoint(jCount, 2)
                    lmPointUCS = ThisDrawing.Utility.TranslateCoordinates(lmPoint, acWorld, acUCS, False)
                Else
                    rmPointUCS = ThisDrawing.Utility.TranslateCoordinates(rmPoint, acWorld, acUCS, False)
                    lmPointUCS = ThisDrawing.Utility.TranslateCoordinates(lmPoint, acWorld, acUCS, False)
                End If
                PointD(0) = arPoint(jCount, 0): PointD(1) = arPoint(jCount, 1): PointD(2) = arPoint(jCount, 2)
                PointUCS = ThisDrawing.Utility.TranslateCoordinates(PointD, acWorld, acUCS, False)
                If PointUCS(0) > rmPointUCS(0) And PointUCS(1) > rmPointUCS(1) Then
                    rmPoint(0) = arPoint(jCount, 0): rmPoint(1) = arPoint(jCount, 1): rmPoint(2) = arPoint(jCount, 2)
                    rCount = jCount
                End If
                If lmPointUCS(0) = 0# Then
                    lmPointUCS(0) = PointUCS(0)
                    lCount = jCount
                End If
                If PointUCS(0) < lmPointUCS(0) And PointUCS(1) > lmPointUCS(1) Then
                    lmPoint(0) = arPoint(jCount, 0): lmPoint(1) = arPoint(jCount, 1): lmPoint(2) = arPoint(jCount, 2)
                    lCount = jCount
                End If
            Next jCount
            For jCount = LBound(arPoint) To UBound(arPoint)
                rmPoint(0) = arPoint(rCount, 0): rmPoint(1) = arPoint(rCount, 1): rmPoint(2) = arPoint(rCount, 2)
                rmPointUCS = ThisDrawing.Utility.TranslateCoordinates(rmPoint, acWorld, acUCS, False)
                lmPoint(0) = arPoint(lCount, 0): lmPoint(1) = arPoint(lCount, 1): lmPoint(2) = arPoint(lCount, 2)
                lmPointUCS = ThisDrawing.Utility.TranslateCoordinates(lmPoint, acWorld, acUCS, False)
                PointD(0) = arPoint(jCount, 0): PointD(1) = arPoint(jCount, 1): PointD(2) = arPoint(jCount, 2)
                PointUCS = ThisDrawing.Utility.TranslateCoordinates(PointD, acWorld, acUCS, False)
                If (PointUCS(0) <= rmPointUCS(0) And PointUCS(0) >= lmPointUCS(0)) And ((PointUCS(1) >= rmPointUCS(1) And PointUCS(1) <= lmPointUCS(1)) Or (PointUCS(1) <= rmPointUCS(1) And PointUCS(1) >= lmPointUCS(1))) Then
                    arPointN(aCount, 0) = PointD(0): arPointN(aCount, 1) = PointD(1): arPointN(aCount, 2) = PointD(2)
                    arPoint(jCount, 0) = 0#: arPoint(jCount, 1) = 0#: arPoint(jCount, 2) = 0#
                    If aCount + 1 <= UBound(arPoint) Then aCount = aCount + 1
                End If
            Next jCount
            If iCount = LBound(arPoint) Then
                fCount = LBound(arPoint)
                sCount = aCount - 1
            Else
                If sCount + 1 <= UBound(arPoint) Then fCount = sCount + 1
                If aCount = UBound(arPoint) Then
                    sCount = aCount - 1
                Else
                    aCount = UBound(arPoint)
                End If
            End If
            For jCount = fCount To sCount
                If jCount + 1 <= sCount Then
                    For xCount = jCount + 1 To sCount
                        PointS(0) = arPointN(xCount - 1, 0): PointS(1) = arPointN(xCount - 1, 1): PointS(2) = arPointN(xCount - 1, 2)
                        PointUCSS = ThisDrawing.Utility.TranslateCoordinates(PointS, acWorld, acUCS, False)
                        PointD(0) = arPointN(xCount, 0): PointD(1) = arPointN(xCount, 1): PointD(2) = arPointN(xCount, 2)
                        PointUCS = ThisDrawing.Utility.TranslateCoordinates(PointD, acWorld, acUCS, False)
                        If PointUCSS(0) < PointUCS(0) Then
                        sortPoint(0) = arPointN(xCount - 1, 0): sortPoint(1) = arPointN(xCount - 1, 1): sortPoint(2) = arPointN(xCount - 1, 2)
                        arPointN(xCount - 1, 0) = arPointN(xCount, 0): arPointN(xCount - 1, 1) = arPointN(xCount, 1): arPointN(xCount - 1, 2) = arPointN(xCount, 2)
                        arPointN(xCount, 0) = sortPoint(0): arPointN(xCount, 1) = sortPoint(1): arPointN(xCount, 2) = sortPoint(2)
                        End If
                    Next xCount
                End If
            Next jCount
        Next iCount
        For iCount = LBound(arPointN) To UBound(arPointN)
            PoinT(0) = arPointN(iCount, 0): PoinT(1) = arPointN(iCount, 1): PoinT(2) = arPointN(iCount, 2)
            Set AddText = ThisDrawing.ModelSpace.AddText(iCount, PoinT, 2)
        Next iCount
    End If
    SSETO.Delete
    Exit Sub

Mình có thử viết 1 đoạn như này để lọc rồi cho vào 1 mảng mới, nhưng có vẻ như không thành công, vì sau khi gán giá trị 0 vào mảng cũ thì những lần lọc sau lại lấy giá trị 0 cho vào mảng mới.

Mọi người xem giúp mình xem như n

  • Vote giảm 2

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

Nhìn tập điểm nghiêng nghiêng đó mà muốn sort  "Như ý"  mà không chỉ định 2 vector để sort thì mình vẫn chưa hiểu thớt  sao làm ra được.

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
Vào lúc 28/6/2021 tại 00:57, Huyminer đã nói:

Chào mọi người!

Hiện giờ mình đang viết 1 đoạn mã VBA phục vụ công việc.

Mình gặp vấn đề sắp xếp thứ tự các điểm ngẫu nhiên

có hình minh họa phía dưới

Mình đang sắp xếp bằng phương pháp x+y và xếp từ lớn tới nhỏ nhưng không được như ý lắm

Mọi người có thể giúp mình sắp xếp, đánh số các điểm theo tứ tự từ trên xuống dưới, phải qua trái được không?

Mình xếp như kia đoạn đầu đoạn cuối, nhưng khúc giữa lại bị lỗi

Xin cảm ơn!

Untitled.png

Chủ thớt có thể thử cách xoay UCS, trans point sang UCS, sort theo UCS.

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
3 giờ trước, cuongtk2 đã nói:

Nhìn tập điểm nghiêng nghiêng đó mà muốn sort  "Như ý"  mà không chỉ định 2 vector để sort thì mình vẫn chưa hiểu thớt  sao làm ra được.

Mình đã tạo 1 trục ucs mới tương đối với tập điểm, và tran điểm sang trục ucs đó để sort, nhưng vẫn đang gặp vấn đề với đoạn code kia

Tìm được 2 điểm trên cùng bên trái và phải, sau đó tìm điểm ở khúc giữa 2 điểm đó để sort, nhưng chỉ sort được mỗi dòng đầu tiên những dòng sau bị gán hết vào tọa độ 0.0.0

  • 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

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  

×