DMUG-Archiv 1998

Frühere

 

Chronologischer Index

 

Spätere

Vorherige

 

Thematischer Index

 

Nächste

Re: Punkt in Polygon, bzw. Polyeder

At 15:34 21-12-98 +0100, Frank Scherbaum wrote:
>Liebe Kollegen/innen,
>
>kennt jemand einen einfachen und moeglichst schnellen Weg, um in
>Mathematica festzustellen, ob ein zweidimensionaler Punkt innerhalb
>eines Polygons liegt, welches durch seine Eckpunkte definiert ist, bzw.
>ein Punkt im 3D-Raum  inerhalb eines Polyeders (ebenfalls durch die
>Eckpunkte definiert)?
>Mit freundlichen Gruessen,
>Frank Scherbaum
>-- 
>Frank Scherbaum, Institut fuer Geowissenschaften, University of Potsdam, 
>POB 601553, D-14415 Potsdam, Germany, 
>Tel. (+49-331)-977-2681, Fax. -2087
>http://www.rz.uni-potsdam.de/u/Geowissenschaft/index.htm
>
>

bester,

es ist in allem fall notwendig der polyheder\polygon als
convex zu nimmen, anders ist das problem nicht eindeutig definiert.

Fur so ein convexes poly gibt es die ConvexHull (= ch2D oder ch3D)
cfr DiscreteMath`ComputationalGeometry`, die bestimmt welche punkten
mit einander verbunden sind. Ein nicht triviales problem fur hunderte punkte !

Haben sie einmal solches ch2D oder ch3D, dann gehts einfach :

in 3D:

In[60]:=(* SeedRandom@12 *)
points= Union[ Table[Plus@@Table[ Random[Integer,{-1,1}],{5}],{6},{3}]]
Out[60]=
{{-2,0,1},{-2,5,-2},{-1,0,0},{0,0,1},{0,1,-2},{1,-2,0}} (* ein random
polyheder *)
In[61]:=Timing[ch3D=ConvexHull3D[points]]
Out[61]={0.44 Second,
{{1,2,5},{1,4,2},{1,5,6},{1,6,4},{2,4,5},{4,6,5}}}

In[141]:=test=.09091 {1,1,1}; (* ein test-punkt *)
In[142]:=
Det[{test-points[[#[[1]]]],points[[#[[1]]]]-points[[#[[2]]]],points[[#[[2]]]]-
points[[#[[3]]]]}]& /@ ch3D
Out[142]={-16.5455,-8.54544,-8.90911,-3.81818,-0.1818,0.00001}
 (*  test liegt an die falsche seite des letztes flaches={4,6,5} *)
In[143]:=FreeQ[Sign[% ],-1]||FreeQ[Sign[% ],1]
Out[143]=False   (* test liegt nich innen *)

in 2D:

In[145]:=
<<DiscreteMath`ComputationalGeometry`
In[150]:=
(* SeedRandom@12 *)
points= Union[ Table[Plus@@Table[ Random[Integer,{-1,1}],{5}],{6},{2}]]
Out[150]={{-1,1},{-1,4},{1,3},{2,-2},{2,0},{4,-1}} (* ein random polygon *)
In[151]:=ch2D=ConvexHull[points]
Out[151]={6,3,2,1,4}
In[152]:=new=Partition[ch2D~Append~First[ch2D],2,1]
Out[152]={{6,3},{3,2},{2,1},{1,4},{4,6}}
In[174]:=
test=1.85715 {1,1};
In[177]:=
Det[{test-points[[#[[1]]]],points[[#[[1]]]]-points[[#[[2]]]]}]& /@ new
Out[177]={-0.00005,1.42855,8.57145,11.1429,7.85715}
(* test liegt an die falsche seite des erstes segments ={6,3} *)
In[178]:=FreeQ[Sign[% ],-1]||FreeQ[Sign[% ],1]
Out[178]=False (* test liegt nich innen *)


ps,

"ConvexHull3D.m" hab ich selbst geschrieben,
ist schon an MathSource angeboten,
um sie wollen schick ich es sie.

Dr. Wouter L. J. MEEUSSEN
w.meeussen.vdmcc@XXXXXXX.be
eu000949@XXXXXXX.be



Verweise:
Punkt in Polygon, bzw. Polyeder
Frank Scherbaum, 22.12.1998

Frühere

 

Chronologischer Index

 

Spätere

Vorherige

 

Thematischer Index

 

Nächste

DMUG-Archiv, http://www.mathematica.ch/dmug-liste.html; Letzte Änderung: 08.09.2003 20:44