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