Thứ Sáu, 29 tháng 11, 2024

Thuật toán sắp xếp sử dụng linq trong AutoCAD dotNet | Sorting in AutoCAD dotNET c# | linq advantage | AutoLISP Reviewer

Ứng dụng được phát triển/Sưu tầm bởi đội ngũ AutoLISP Thật là đơn giản
   

Thông tin thêm: 👉👉👉

Thuật toán tìm điểm gần nhất

1A Sử dụng thuật toán

Code:
//Sắp xếp
        public static Point3dCollection Sort(Point3d bspt, Point3dCollection inputpts)
        {
            Point3dCollection pts = inputpts;
            Point3d pt;
            for (int i = 0; i < pts.Count - 1; ++i)
                for (int j = i + 1; j < pts.Count; ++j)
                {
                    if (bspt.DistanceTo(pts[i]) > bspt.DistanceTo(pts[j]))
                    {
                        pt = pts[i];
                        pts[i] = pts[j];
                        pts[j] = pt;
                    }
                }
            return pts;
        }
//Sử dụng:

//Sắp xếp
    var sortpts = SortFar(bspt, inputpts);

//Tìm điểm gần nhất
    var nearpoint = sortpts[0];

1B Sử dụng Linq

Code:
//Sắp xếp:
    var sortpts = inputpts.OfType<Point3d>()
                            .OrderBy(x => x.DistanceTo(bspt))
                            .ToList();
//Tìm điểm gần nhất:
    var nearpoint = inputpts.OfType<Point3d>()
                            .OrderBy(x => x.DistanceTo(bspt))
                            .FirstOrDefault();

 //Hoặc:    
     var nearpoint = sortpts.FirstOrDefault();


Thuật toán tìm đối tượng gần nhất

2A Sử dụng thuật toán

Code:
//Sắp xếp (Với điều kiện dbs chỉ gồm các Curve)
        public static void Sort(Point3d p, DBObjectCollection dbs)
        {
            if (dbs.Count < 2) return;
            for (int i = 0; i < dbs.Count - 1; ++i)
                for (int j = i + 1; j < dbs.Count; ++j)
                {
                    Curve cj = dbs[j] as Curve;
                    Curve ci = dbs[i] as Curve;

                    if (p.DistanceTo(ci.GetClosestPointTo(p, false)) > p.DistanceTo(cj.GetClosestPointTo(p, false)))
                    {
                        DBObject d = dbs[i];
                        dbs[i] = dbs[j];
                        dbs[j] = d;
                    }
                }
        }

//Sắp xếp:
    Sort(bspt, dbs);
//Sử dụng:
    var nearcv = Sort(bspt, dbs)[0] as Curve;

2B Sử dụng Linq

Code:
//Sử dụng (Với điều kiện dbs chỉ gồm các Curve):
    var nearcv = dbs.OfType<Curve>()
                     .OrderBy(x => bspt.DistanceTo(x.GetClosestPointTo(bspt, false)))
                     .FirstOrDefault();


Có cần thiết học thuật toán sắp xếp không?

Không thể bàn cãi, Linq có khả năng sắp xếp rất mạnh.

Tuy nhiên, việc học và sử dụng thuật toán sắp xếp cơ bản sẽ giúp người dùng hiểu được cách vận hành của 1 danh sách (list). Cách thức duyệt qua từng phần tử, cách sử dụng vòng lặp.

Nếu không học cách sắp xếp cơ bản, đó là 1 thiếu sót lớn khi học lập trình!


---------------------------------------------------------------------------------------------
Ứng dụng được phát triển bởi đội ngũ AutoLISP Thật là đơn giản - Tác giả ứng dụng in D2P

    

Mọi thông tin xin liên hệ Fanpage AutoLISP Thật là đơn giản!
Cảm ơn bạn đã theo dõi!

Không có nhận xét nào:

Đăng nhận xét

Fillet bo tròn nhiều đa giác trong AutoCAD | Multiple fillet polylines in AutoCAD | AutoLISP Reviewer

Ứng dụng được phát triển/Sưu tầm bởi đội ngũ AutoLISP Thật là đơn giản     Thông tin thêm: 👉👉👉