Сюжет ДелонеТриангуляция в Mathematica - PullRequest
1 голос
/ 24 июня 2011

Учитывая следующий пример ( из решения Sjoerd по построению ConvexHull )

Needs["ComputationalGeometry`"]
pts = RandomReal[{0, 10}, {60, 2}];
dtpts=DelaunayTriangulation[pts]

Теперь я хотел бы построить график DelaunayTriangulation для набора точек, но не могу понятьСинтаксис сюжета с использованием графики.

Мысли?

Ответы [ 3 ]

4 голосов
/ 24 июня 2011

Первый метод, используя многоугольники, такие как Sjoerd, но без проблем, вызванных точками на выпуклой оболочке:

Graphics[{FaceForm[], EdgeForm[Black], 
  Polygon[pts[[#]] & /@ 
    DeleteCases[dtpts, {i_, _} /; MemberQ[ConvexHull[pts], i]][[All, 
      2]]], Red, Point[pts]}]

Второй метод, используя линии, соединяющие соседние точки:

edges[pts_, {a_, l_List}] := {pts[[a]], #} & /@ pts[[l]]
Graphics[{Line[edges[pts, #]] & /@ dtpts, Red, Point[pts]}]

Оба эти метода приводят к дублированию примитивов (три полигона или две линии, из каждой точки в качестве отправной точки).

Мы можем немного изменить данные и использовать встроенные функции визуализации:

Graphics[{FaceForm[], EdgeForm[Black], 
  Cases[Normal[
    ListDensityPlot[{##, 0.} & @@@ pts, Mesh -> All]], _Polygon, 
   Infinity], Red, Point[pts]}, ImageSize -> 175]

enter image description here

3 голосов
/ 24 июня 2011
Graphics[
  GraphicsComplex[
    pts, 
    {
      Function[{startPt, finishPts},Line[{startPt, #}] & /@ finishPts] @@@ dtpts, 
      Red, Point@Range[Length@pts]
    }
   ]
  ]

enter image description here

А если вам нужны настоящие полигоны:

Graphics[
 GraphicsComplex[
  pts, 
  {EdgeForm[Black], 
   Function[{startPt, finishPts}, 
      {FaceForm[RGBColor[RandomReal[], RandomReal[], RandomReal[]]], 
        Polygon[{startPt, ##}]} & @@@ 
          Transpose[{Drop[finishPts, 1], 
                     Drop[RotateRight@finishPts, 1]
                    }
          ]
         ] @@@ dtpts, 
   Red, Point@Range[Length@pts]
  }
 ]
]

enter image description here

1 голос
/ 24 августа 2011

Мне нравится использование Sjoerd GraphicsComplex, но я не вижу необходимости кода в стиле барокко в середине.

Кажется, это работает просто отлично:

Needs["ComputationalGeometry`"]
pts = RandomReal[{0, 10}, {60, 2}];
dtpts = DelaunayTriangulation[pts];

Линии

Graphics[GraphicsComplex[
  pts,
  {Line /@ Thread /@ dtpts, Red, Point@Range@Length@pts}
]]

enter image description here


Полигоны

Graphics[GraphicsComplex[
  pts,
  {
    EdgeForm[Black],
    ( {FaceForm[RGBColor @@ RandomReal[1, 3]], Polygon@#} & /@ 
      Append @@@ Thread@{Partition[#2, 2, 1], #} & ) @@@ dtpts,
    Red,
    Point@Range[Length@pts]
  }
]]

enter image description here

...