|
发表于 2010-8-23 05:48:04
|
显示全部楼层
Hi这是一个F#凸包(Graham的扫描)编辑:新代码请参见这里编辑:在某些情况下,使用共线点需要比较的公差模块ConvexHull。
。
打开系统。
打开Autodesk.AutoCAD.ApplicationServices。
打开Autodesk.AutoCAD.DatabaseServices。
打开Autodesk.AutoCAD.EditorInput。
打开Autodesk.AutoCAD.Geometry。
打开Autodesk.AutoCAD.Runtime。
。
让顺时针(p1: Point2d)(p2: Point2d)(p3: Point2d)=。
(p2. X-p1. X)*(p3. Y-p1. Y)-(p2. Y-p1. Y)*(p3. X-p1. X)。
。
让conexHull(ts: Point2d seq)=。
让rec填充acc pt=。
将acc与匹配。
|a:: b:: _时顺时针b a pt->填充acc.Tailpt。
|_->pt:: acc。
让p0=ts。
|>Seq.reduce(有趣的p1 p2->。
如果p2,Y。
ts。
|>List.ofSeq。
|>List.sortBy(有趣的p->。
让d=p0.GetDistanceTo(p)。
(Math.Round((p0. X-p. X)/d,8), d))。
|>List.fold填充[]。
|>List.rev。
。
[]。
让Test()=。
让doc=Application.DocumentManager.MdiActiveDocument。
让psr=doc.Editor.GetSelection(new SelectionFilter([|new TypeValue(0,"POINT") |]))。
如果psr.Status=PromptStatus.OK那么。
使用tr=doc.TransactionManager.StartTransaction()。
使用pl=new Polyline()。
psr.Value。
|>Seq.cast。
|>Seq.map(有趣(所以:选择对象)->。
let pt=tr.GetObject(so.ObjectId,OpenMode.ForRead ):? > DBPoint。
新的Point2d(pt.Position.X,pt.Position.Y))。
|>conexHull。
|>List.iteri(有趣的i p->pl.AddVertexAt(i, p,0.0,0.0,0.0))。
pl.Closed。
让btr=tr.GetObject(doc.Database.CurrentSpaceId,OpenMode.ForWrite ):? > BlockTableRecords。
btr.AppendEntity(pl)|>忽略。
tr.AddNewlyCreatedDBObject(pl,true)。
tr.Commit。
|
|