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