October 19, 2021, 09:33:16

Author Topic: [bb] Triangulate Toy by Pepsi [ 1+ years ago ]  (Read 713 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] Triangulate Toy by Pepsi [ 1+ years ago ]
« on: June 29, 2017, 00:28:41 »
Title : Triangulate Toy
Author : Pepsi
Posted : 1+ years ago

Description : It aint perfect. It may not be the fastest. But it works! I had fun doing this and thought I would share. Warning: Code aint perty and there's some exotic 3d maths in there code. When plotting points, please do so in a clockwise ordely fashion. It may hang if you tiangulate counter clockwise ploted points. Try pressing the [Esc] key to quit. Thanks goes out to Fredborg for supplying the PolyTri link: <a href="http://www.codeproject.com/useritems/polygon_tesselation.asp" target="_blank">http://www.codeproject.com/useritems/polygon_tesselation.asp[/url]
With that, I got instantly hooked on getting something to work for me. I didn't exactly follow the source code to PolyTri as my code should show that and that I wanted to do it on my own. This is my results. Have Fun! :)


Code :
Code: BlitzBasic
  1. ; -----------------------------------------------------------------------------------
  2. ; A Triangulate 3D Polygon Example
  3. ; Author: Todd Riggins
  4. ; 10-25-03
  5. ; It is assumed that this method will run on clockwise convex/concave polygons.
  6. ; It is assumed that a consecutive point will not create a line across a given edge.
  7. ; This is not plug and play code.
  8. ; -----------------------------------------------------------------------------------
  9.  
  10. ; -----------------------------------------------------------------------------------
  11. ; Initializations
  12. ; -----------------------------------------------------------------------------------
  13. Type point3d
  14.         Field mesh
  15.         Field used
  16.         Field x#
  17.         Field y#
  18.         Field z#
  19. End Type
  20.  
  21. Dim this3dPointArray.point3d(100)
  22. Global num3dPoints=0
  23. Global currentmode=0
  24.  
  25. ; ### input helpers
  26. key_space=0
  27. key_w=0
  28. key_a=0
  29. key_s=0
  30. key_d=0
  31. mouse_button1=0
  32.  
  33. ; -----------------------------------------------------------------------------------
  34. ; Set Graphics
  35. ; -----------------------------------------------------------------------------------
  36. Graphics3D 640,480,0,2
  37. SetBuffer BackBuffer()
  38. HidePointer()
  39.  
  40.  
  41. ; ### Make Pivot for Camera to rotate around
  42. Global camerapivot=CreatePivot()
  43.  
  44. ; ### Set Camera
  45. Global camera=CreateCamera(camerapivot)
  46. PositionEntity camera,0,3,-4
  47. CameraRange camera,.1,100
  48. RotateEntity camera,24,0,0
  49.  
  50. ; ### Create Mouse Cursor
  51. Global mouse_image=CreateImage(16,16)
  52. SetBuffer ImageBuffer(mouse_image)
  53. ClsColor 0,0,0
  54. Cls
  55. Color 255,255,255
  56. Line 0,0,7,0
  57. Line 0,0,0,7
  58. Line 0,7,7,0
  59. Line 4,4,15,15
  60. MaskImage mouse_image,0,0,0
  61.  
  62. ; ### Create Point Selection Sphere
  63. Global sphereselect_mesh=CreateSphere()
  64. ScaleEntity sphereselect_mesh,0.07,0.07,0.07
  65. EntityColor sphereselect_mesh,255,255,0
  66. HideEntity sphereselect_mesh
  67.  
  68. ; ### Create Result Mesh for Poly Triangulation Result
  69. Global ResultMesh=CreateMesh()
  70.  
  71. ; ### Create static xz plane
  72. Global xzgrid_tex=CreateTexture(256,256,9)
  73. SetBuffer TextureBuffer(xzgrid_tex)
  74. ClsColor 30,128,200
  75. Cls
  76. Color 255,255,255
  77. Line 0,0,255,0
  78. Line 0,0,0,255
  79. Global xzgrid_plane=CreatePlane()
  80. EntityTexture xzgrid_plane,xzgrid_tex
  81.  
  82. ; ### Create canvas mesh to create triangulated poly on.
  83. ; ### This canvas will be allowed to rotate before creating triangulated poly.
  84. Global canvas_tex=CreateTexture(256,256,9)
  85. SetBuffer TextureBuffer(canvas_tex)
  86. ClsColor 32,32,32
  87. Cls
  88. Color 255,255,0
  89. Line 0,0,255,0
  90. Line 0,0,0,255
  91. Global canvas_mesh=CreateMesh()
  92. Global canvas_surface=CreateSurface(canvas_mesh)
  93. size=3
  94. AddVertex(canvas_surface,-size,0, size,0,0)
  95. AddVertex(canvas_surface, size,0, size,1,0)
  96. AddVertex(canvas_surface,-size,0,-size,0,1)
  97. AddVertex(canvas_surface, size,0,-size,1,1)
  98. AddTriangle canvas_surface,2,0,1
  99. AddTriangle canvas_surface,2,1,3
  100. EntityTexture canvas_mesh,canvas_tex
  101. PositionEntity canvas_mesh,0,1,0
  102. RotateEntity canvas_mesh,-70,-25,0
  103. UpdateNormals canvas_mesh
  104. EntityPickMode canvas_mesh,2
  105.  
  106. ; calculate normalized normals...
  107. Global thisPivot1=CreatePivot(canvas_mesh)
  108. PositionEntity thisPivot1,-size,0, size
  109. Global thisPivot2=CreatePivot(canvas_mesh)
  110. PositionEntity thisPivot2, size,0, size
  111. Global thisPivot3=CreatePivot(canvas_mesh)
  112. PositionEntity thisPivot3,-size,0,-size
  113. Global canvas_nx#
  114. Global canvas_ny#
  115. Global canvas_nz#
  116. Update_Canvas_FaceNormal()
  117.  
  118. ; ### Set default buffer and drawing colors...
  119. SetBuffer BackBuffer()
  120. ClsColor 0,0,0
  121. Cls
  122. Color 255,255,255
  123.  
  124. ; -----------------------------------------------------------------------------------
  125. ; Main
  126. ; -----------------------------------------------------------------------------------
  127. While Not KeyHit(1)
  128.  
  129.         If currentmode=0
  130. ;-------rotate canvas via WASD keys
  131.                 If KeyDown(17) And key_w=0
  132.                         key_w=1
  133.                         TurnEntity canvas_mesh,-5,0,0
  134.                 EndIf
  135.                 If KeyDown(17)=False And key_w=1 Then key_w=0
  136.                 If KeyDown(30) And key_a=0
  137.                         key_a=1
  138.                         TurnEntity canvas_mesh,0,-5,0
  139.                 EndIf
  140.                 If KeyDown(30)=False And key_a=1 Then key_a=0
  141.                 If KeyDown(31) And key_s=0
  142.                         TurnEntity canvas_mesh,5,0,0
  143.                         key_s=1
  144.                 EndIf
  145.                 If KeyDown(31)=False And key_s=1 Then key_s=0
  146.                 If KeyDown(32) And key_d=0
  147.                         TurnEntity canvas_mesh,0,5,0
  148.                         key_d=1
  149.                 EndIf
  150.                 If KeyDown(32)=False And key_d=1 Then key_d=0
  151.  
  152.                 ; switch to draw poly mode             
  153.                 If KeyDown(57) And key_space=0
  154.                         key_space=1
  155.                 EndIf
  156.                 If KeyDown(57)=False And key_space=1
  157.                         key_space=0
  158.                         Update_Canvas_FaceNormal()
  159.                         MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
  160.                         currentmode=1
  161.                 EndIf
  162.         Else
  163. ;-------draw poly mode
  164.                 If currentmode=1
  165.                         ; if we have 2 or more points, then we can generate
  166.                         ;  a triangulated poly.
  167.                         If num3dPoints>2
  168.                                 ; Generate Triangulated Poly
  169.                                 If KeyDown(57) And key_space=0
  170.                                         key_space=1
  171.                                 EndIf
  172.                                 If KeyDown(57)=False And key_space=1
  173.                                         key_space=0
  174.                                         currentmode=2
  175.                                         HideEntity sphereselect_mesh                           
  176.                                         HideEntity canvas_mesh 
  177.                                         ; Triangulate
  178.                                         triangulate()  
  179.                                                
  180.                                         ; Reset this3dPointArray.point3d(i) array
  181.                                         For i=0 To num3dPoints-1
  182.                                                 If this3dPointArray.point3d(i)mesh>0
  183.                                                         HideEntity this3dPointArray.point3d(i)mesh
  184.                                                         FreeEntity this3dPointArray.point3d(i)mesh
  185.                                                         this3dPointArray.point3d(i)mesh=0
  186.                                                         this3dPointArray.point3d(i)used=False
  187.                                                 EndIf
  188.                                         Next
  189.                                        
  190.                        
  191.                                 EndIf
  192.                         Else
  193.                                 ;display error
  194.                         EndIf
  195.        
  196.                         ; Set Current Selector Point to Mouse coords
  197.                         If currentmode=1 Then SetPoint()
  198.                        
  199.                         ; draw poly points
  200.                         If MouseDown(1) And mouse_button1=0
  201.                                 mouse_button1=1
  202.                                 NewPolyPoint()
  203.                         EndIf
  204.                         If MouseDown(1)=False And mouse_button1=1 Then mouse_button1=0
  205.                 Else
  206. ;-----------view triangulated polygon
  207.                         If currentmode=2
  208.                        
  209.                                 ; rotate camera around pivot to view created triangulated poly.
  210.                                 yrot#=yrot#+1.0
  211.                                 If yrot#>360 Then yrot#=yrot#-360
  212.                                 RotateEntity camerapivot,0,yrot#,0
  213.                                
  214.                                 ; reset pivot orientation and delete Result surfaces to
  215.                                 ; start over again...
  216.                                 If KeyDown(57) And key_space=0
  217.                                         key_space=1
  218.                                 EndIf
  219.                                 If KeyDown(57)=False And key_space=1
  220.                                         key_space=0
  221.                                         currentmode=0
  222.                                         yrot#=0
  223.                                         RotateEntity camerapivot,0,yrot#,0
  224.                                        
  225.                                         numofsurfaces=CountSurfaces(ResultMesh)
  226.                                         For i=1 To numofsurfaces
  227.                                                 ResultSurface=GetSurface(ResultMesh,i)
  228.                                                 ClearSurface ResultSurface
  229.                                         Next
  230.                                         num3dPoints=0
  231.                                         ShowEntity canvas_mesh                                 
  232.                                 EndIf
  233.                        
  234.                         EndIf
  235.                        
  236.                 EndIf
  237.         EndIf
  238.        
  239.         UpdateWorld
  240.         RenderWorld
  241.        
  242.        
  243. ;---Output
  244.        
  245.         Text 0,0,"Current Mode="+currentmode
  246.         Text 0,15,"Number of Points="+num3dPoints
  247.        
  248.         Text 120,0,"* Key [Esc] = End Program"
  249.         If currentmode=0
  250.                 Text 0,60,"[Rotate Canvas Mode]"
  251.                 Text 0,75,"Key [W] = Rotate -X Axis"
  252.                 Text 0,90,"Key [S] = Rotate X Axis"
  253.                 Text 0,105,"Key [A] = Rotate -Y Axis"
  254.                 Text 0,120,"Key [D] = Rotate Y Axis"
  255.                 Text 0,150,"Key [Space] = Draw Poly Points Mode"
  256.         EndIf
  257.  
  258.         If currentmode=1
  259.                 DrawImage mouse_image,MouseX(),MouseY()
  260.                 Text 0,60,"[Draw Poly Points Mode]"
  261.                 Text 0,75,"Point mouse on canvas and"
  262.                 Text 0,90,"use left mouse button to"
  263.                 Text 0,105,"draw 3 or more points in a"
  264.                 Text 0,120,"clockwise orderly fashion."
  265.                 If num3dPoints>2
  266.                         Text 0,150,"Key [Space] = Triangulate the Poly"
  267.                 EndIf          
  268.         EndIf
  269.  
  270.         If currentmode=2
  271.                 Text 0,60,"[View Triangulated Poly]"
  272.                 Text 0,90,"Key [Space] = Rotate Canvas Mode"
  273.         EndIf
  274.  
  275.        
  276.         Flip
  277. Wend
  278. End
  279.  
  280.  
  281. ; -----------------------------------------------------------------------------------
  282. ; Functions
  283. ; -----------------------------------------------------------------------------------
  284.  
  285. ; Pick Point on Canvas Mesh
  286. Function SetPoint()
  287.         If CameraPick(camera,MouseX(),MouseY())=canvas_mesh
  288.                 PositionEntity sphereselect_mesh,PickedX#(),PickedY#(),PickedZ#()
  289.                 ShowEntity sphereselect_mesh
  290.         Else
  291.                 HideEntity sphereselect_mesh           
  292.         EndIf
  293. End Function
  294.  
  295. ; Create new poly point
  296. Function NewPolyPoint()
  297.  
  298.         If CameraPick(camera,MouseX(),MouseY())=canvas_mesh
  299.                 num3dPoints=num3dPoints+1
  300.        
  301.                 this3dPointArray.point3d(num3dPoints-1)=New point3d
  302.                 this3dPointArray.point3d(num3dPoints-1)mesh=CreateSphere()
  303.                 ScaleEntity this3dPointArray.point3d(num3dPoints-1)mesh,0.07,0.07,0.07
  304.                 EntityColor this3dPointArray.point3d(num3dPoints-1)mesh,255,63,63      
  305.        
  306.                 this3dPointArray.point3d(num3dPoints-1)x#=PickedX#()
  307.                 this3dPointArray.point3d(num3dPoints-1)y#=PickedY#()
  308.                 this3dPointArray.point3d(num3dPoints-1)z#=PickedZ#()
  309.                
  310.                 locx#=this3dPointArray.point3d(num3dPoints-1)x#
  311.                 locy#=this3dPointArray.point3d(num3dPoints-1)y#
  312.                 locz#=this3dPointArray.point3d(num3dPoints-1)z#
  313.                
  314.                 PositionEntity this3dPointArray.point3d(num3dPoints-1)mesh,locx#,locy#,locz#
  315.         EndIf
  316. End Function
  317.  
  318. Function Update_Canvas_FaceNormal()
  319.         Local x0#,y0#,z0#,x1#,y1#,z1#,x2#,y2#,z2#
  320.         Local vectorx1#,vectory1#,vectorz1#,vectorx2#,vectory2#,vectorz2#
  321.         Local normx#,normy#,normz#,nx1#,ny1#,nz1#
  322.         Local magnitude#
  323.        
  324.         ; calculate normalized normals...
  325.         x0#=EntityX#(thisPivot1,True)
  326.         y0#=EntityY#(thisPivot1,True)
  327.         z0#=EntityZ#(thisPivot1,True)
  328.         x1#=EntityX#(thisPivot2,True)
  329.         y1#=EntityY#(thisPivot2,True)
  330.         z1#=EntityZ#(thisPivot2,True)
  331.         x2#=EntityX#(thisPivot3,True)
  332.         y2#=EntityY#(thisPivot3,True)
  333.         z2#=EntityZ#(thisPivot3,True)
  334.         vectorx1#=x1#-x0#
  335.         vectory1#=y1#-y0#
  336.         vectorz1#=z1#-z0#
  337.         vectorx2#=x2#-x0#
  338.         vectory2#=y2#-y0#
  339.         vectorz2#=z2#-z0#
  340.         normx#=(vectory1# * vectorz2#)-(vectorz1# * vectory2#)
  341.         normy#=(vectorz1# * vectorx2#)-(vectorx1# * vectorz2#)
  342.         normz#=(vectorx1# * vectory2#)-(vectory1# * vectorx2#)
  343.         magnitude#=(Sqr((normx#*normx#)+(normy#*normy#)+(normz#*normz#)))
  344.         If (magnitude#>-0.00001 And magnitude#<0.00001)
  345.                 ;rem do nothing, cannot divide by zero!
  346.         Else
  347.                 nx1#=normx#/magnitude#
  348.                 ny1#=normy#/magnitude#
  349.                 nz1#=normz#/magnitude#
  350.                 normx#=nx1#
  351.                 normy#=ny1#
  352.                 normz#=nz1#
  353.         EndIf
  354.         canvas_nx#=normx#
  355.         canvas_ny#=normy#
  356.         canvas_nz#=normz#
  357. End Function
  358.  
  359. ; Does the 3 vertex points create the same facing as the canvas?
  360. Function IsSameNormal(x0#,y0#,z0#,x1#,y1#,z1#,x2#,y2#,z2#)
  361.  
  362.         ; get face normal for the three provided vertex points
  363.         vectorx1#=x1#-x0#
  364.         vectory1#=y1#-y0#
  365.         vectorz1#=z1#-z0#
  366.         vectorx2#=x2#-x0#
  367.         vectory2#=y2#-y0#
  368.         vectorz2#=z2#-z0#
  369.         normx#=(vectory1# * vectorz2#)-(vectorz1# * vectory2#)
  370.         normy#=(vectorz1# * vectorx2#)-(vectorx1# * vectorz2#)
  371.         normz#=(vectorx1# * vectory2#)-(vectory1# * vectorx2#)
  372.         magnitude#=(Sqr((normx#*normx#)+(normy#*normy#)+(normz#*normz#)))
  373.         If (magnitude#>-0.00001 And magnitude#<0.00001)
  374.                 ;rem do nothing, cannot divide by zero!
  375.         Else
  376.                 nx1#=normx#/magnitude#
  377.                 ny1#=normy#/magnitude#
  378.                 nz1#=normz#/magnitude#
  379.                 normx#=nx1#
  380.                 normy#=ny1#
  381.                 normz#=nz1#
  382.         EndIf
  383.  
  384.         ; Now just get the distance from two vertex points created from normal directions.
  385.        
  386.         rangevalue#=10
  387.        
  388.         px1#=x1#+(normx#*rangevalue#) ; Add current three vertex point's face normal to a vertex point
  389.         py1#=y1#+(normy#*rangevalue#) ; Add current three vertex point's face normal to a vertex point
  390.         pz1#=z1#+(normz#*rangevalue#) ; Add current three vertex point's face normal to a vertex point
  391.         px2#=x1#+(canvas_nx#*rangevalue#) ; Add current canvas face normal to a vertex point
  392.         py2#=y1#+(canvas_ny#*rangevalue#) ; Add current canvas face normal to a vertex point
  393.         pz2#=z1#+(canvas_nz#*rangevalue#) ; Add current canvas face normal to a vertex point
  394.  
  395.         ; get the distance between two points.
  396.         ; note: if dist# = ( rangevalue# * 2 = Max distance ), then both faces face complete opposite directions )
  397.         dist#=Sqr(((px1#-px2#)^2)+((py1#-py2#)^2)+((pz1#-pz2#)^2))
  398.         ;DebugLog "dist="+dist#
  399.        
  400.         ; give a little tolerance to planar
  401.         If dist#<1.0 Then Return True
  402.         Return False   
  403. End Function
  404.  
  405. Function triangulate()
  406.         Local vindex=0
  407.         Local pos0=0
  408.         Local pos1=1
  409.         Local pos2=2
  410.         Local skipused=0
  411.         Local numofUsed=0
  412.  
  413. .loop  
  414.         x0#=this3dPointArray.point3d(pos0)x#
  415.         y0#=this3dPointArray.point3d(pos0)y#
  416.         z0#=this3dPointArray.point3d(pos0)z#
  417.         x1#=this3dPointArray.point3d(pos1)x#
  418.         y1#=this3dPointArray.point3d(pos1)y#
  419.         z1#=this3dPointArray.point3d(pos1)z#
  420.         x2#=this3dPointArray.point3d(pos2)x#
  421.         y2#=this3dPointArray.point3d(pos2)y#
  422.         z2#=this3dPointArray.point3d(pos2)z#
  423.                                
  424.         result=IsSameNormal(x0#,y0#,z0#,x1#,y1#,z1#,x2#,y2#,z2#)
  425.  
  426.         If result=True 
  427.                 For i=0 To (num3dPoints-1)
  428.                         If (i<>pos0) And (i<>pos1) And (i<>pos2)
  429.                                 If IsPointInsideTri(i,x0#,y0#,z0#,x1#,y1#,z1#,x2#,y2#,z2#)=True
  430.                                         result=False
  431.                                 EndIf
  432.                         EndIf
  433.                 Next   
  434.         EndIf
  435.        
  436.         If result=True
  437.                 NewResultSurface=CreateSurface(ResultMesh)
  438.                 AddVertex NewResultSurface,x0#,y0#,z0#
  439.                 AddVertex NewResultSurface,x1#,y1#,z1#
  440.                 AddVertex NewResultSurface,x2#,y2#,z2#
  441.                
  442.                 AddTriangle NewResultSurface,2+vindex,vindex,vindex+1
  443.                
  444.                 brush=CreateBrush(Rand(127)+128,Rand(127)+128,Rand(127)+128)
  445.                 PaintSurface NewResultSurface,brush
  446.                 FreeBrush brush
  447.                
  448.                 this3dPointArray.point3d(pos1)used=True
  449.                 numofUsed=numofUsed+1
  450.                 EntityColor this3dPointArray.point3d(pos1)mesh,63,255,63                       
  451.                
  452.                 UpdateWorld
  453.                 RenderWorld
  454.  
  455.                
  456.                 Text 0,0,"Press Left Mosue Button to Advance"
  457.                 Text 0,10,"Press [Esc] to quit triangulating"
  458.                 Flip           
  459.                
  460.                 While MouseDown(1)=False
  461.                         If KeyDown(1)=True Then Goto done
  462.                 Wend
  463.                 While MouseDown(1)=True
  464.                 Wend
  465.                
  466.                 If numofUsed=num3dPoints Then Goto done
  467.                
  468.                 If skipused=1
  469.                         pos1=pos2
  470.                 Else
  471.                         pos1=pos1+1
  472.                         If pos1>(num3dPoints-1) Then pos1=0
  473.                 EndIf
  474. .addpos22
  475.                 If KeyDown(1)=True Then Goto done                      
  476.                 pos2=pos2+1
  477.                 If pos2>(num3dPoints-1) Then pos2=0
  478.                 If this3dPointArray.point3d(pos2)used=True
  479.                         skipused=1
  480.                         Goto addpos22
  481.                 EndIf
  482.         Else
  483.                 pos0=pos1
  484. .addpos1
  485.                 If KeyDown(1)=True Then Goto done      
  486.                 pos1=pos1+1
  487.                 If pos1>(num3dPoints-1) Then pos1=0
  488.                 If this3dPointArray.point3d(pos1)used=True
  489.                         Goto addpos1
  490.                 EndIf          
  491.                 pos2=pos1
  492. .addpos2
  493.                 If KeyDown(1)=True Then Goto done
  494.                 pos2=pos2+1
  495.                 If pos2>(num3dPoints-1) Then pos2=0
  496.                 If this3dPointArray.point3d(pos2)used=True
  497.                         skipused=1
  498.                         Goto addpos2
  499.                 EndIf
  500.         EndIf
  501.        
  502.         If pos2=pos0 Then Goto done
  503.         If usedverts>(num3dPoints-1) Then Goto done
  504.         Goto loop
  505. .done
  506.  
  507. End Function
  508.  
  509.  
  510. Function IsPointInsideTri(PointIndex,x0#,y0#,z0#,x1#,y1#,z1#,x2#,y2#,z2#)
  511.  
  512.    ; First get angles from 3 corners of the triangle poly
  513.    vx1#=x1#-x0#
  514.    vy1#=y1#-y0#
  515.    vz1#=z1#-z0#
  516.    vx2#=x2#-x0#
  517.    vy2#=y2#-y0#
  518.    vz2#=z2#-z0#
  519.    vlen1#=Sqr((vx1#*vx1#)+(vy1#*vy1#)+(vz1#*vz1#))
  520.    vlen2#=Sqr((vx2#*vx2#)+(vy2#*vy2#)+(vz2#*vz2#))
  521.    angle1#=ACos(((vx1# * vx2#) + (vy1# * vy2#) + (vz1# * vz2#))/(vlen1#*vlen2#))
  522.  
  523.    vx1#=x0#-x1#
  524.    vy1#=y0#-y1#
  525.    vz1#=z0#-z1#
  526.    vx2#=x2#-x1#
  527.    vy2#=y2#-y1#
  528.    vz2#=z2#-z1#
  529.    vlen1#=Sqr((vx1#*vx1#)+(vy1#*vy1#)+(vz1#*vz1#))
  530.    vlen2#=Sqr((vx2#*vx2#)+(vy2#*vy2#)+(vz2#*vz2#))
  531.    angle2#=ACos(((vx1# * vx2#) + (vy1# * vy2#) + (vz1# * vz2#))/(vlen1#*vlen2#))
  532.  
  533.    vx1#=x0#-x2#
  534.    vy1#=y0#-y2#
  535.    vz1#=z0#-z2#
  536.    vx2#=x1#-x2#
  537.    vy2#=y1#-y2#
  538.    vz2#=z1#-z2#
  539.    vlen1#=Sqr((vx1#*vx1#)+(vy1#*vy1#)+(vz1#*vz1#))
  540.    vlen2#=Sqr((vx2#*vx2#)+(vy2#*vy2#)+(vz2#*vz2#))
  541.    angle3#=ACos(((vx1# * vx2#) + (vy1# * vy2#) + (vz1# * vz2#))/(vlen1#*vlen2#))
  542.  
  543.    ; Now find the angle of the 3d point relative to each
  544.    ; corner of the triangle poly. Also the reverse angle
  545.    ; for each...
  546.    vx1#=x1#-x0#
  547.    vy1#=y1#-y0#
  548.    vz1#=z1#-z0#
  549.    vx2#=this3dPointArray.point3d(PointIndex)x#-x0#
  550.    vy2#=this3dPointArray.point3d(PointIndex)y#-y0#
  551.    vz2#=this3dPointArray.point3d(PointIndex)z#-z0#
  552.    vlen1#=Sqr((vx1#*vx1#)+(vy1#*vy1#)+(vz1#*vz1#))
  553.    vlen2#=Sqr((vx2#*vx2#)+(vy2#*vy2#)+(vz2#*vz2#))
  554.    pointAngle1#=ACos(((vx1# * vx2#) + (vy1# * vy2#) + (vz1# * vz2#))/(vlen1#*vlen2#))
  555.  
  556.    vx1#=this3dPointArray.point3d(PointIndex)x#-x0#
  557.    vy1#=this3dPointArray.point3d(PointIndex)y#-y0#
  558.    vz1#=this3dPointArray.point3d(PointIndex)z#-z0#
  559.    vx2#=x2#-x0#
  560.    vy2#=y2#-y0#
  561.    vz2#=z2#-z0#
  562.    vlen1#=Sqr((vx1#*vx1#)+(vy1#*vy1#)+(vz1#*vz1#))
  563.    vlen2#=Sqr((vx2#*vx2#)+(vy2#*vy2#)+(vz2#*vz2#))
  564.    pointAngle11#=ACos(((vx1# * vx2#) + (vy1# * vy2#) + (vz1# * vz2#))/(vlen1#*vlen2#))
  565.  
  566.    vx1#=x0#-x1#
  567.    vy1#=y0#-y1#
  568.    vz1#=z0#-z1#
  569.    vx2#=this3dPointArray.point3d(PointIndex)x#-x1#
  570.    vy2#=this3dPointArray.point3d(PointIndex)y#-y1#
  571.    vz2#=this3dPointArray.point3d(PointIndex)z#-z1#
  572.    vlen1#=Sqr((vx1#*vx1#)+(vy1#*vy1#)+(vz1#*vz1#))
  573.    vlen2#=Sqr((vx2#*vx2#)+(vy2#*vy2#)+(vz2#*vz2#))
  574.    pointAngle2#=ACos(((vx1# * vx2#) + (vy1# * vy2#) + (vz1# * vz2#))/(vlen1#*vlen2#))
  575.  
  576.    vx1#=this3dPointArray.point3d(PointIndex)x#-x1#
  577.    vy1#=this3dPointArray.point3d(PointIndex)y#-y1#
  578.    vz1#=this3dPointArray.point3d(PointIndex)z#-z1#
  579.    vx2#=x2#-x1#
  580.    vy2#=y2#-y1#
  581.    vz2#=z2#-z1#
  582.    vlen1#=Sqr((vx1#*vx1#)+(vy1#*vy1#)+(vz1#*vz1#))
  583.    vlen2#=Sqr((vx2#*vx2#)+(vy2#*vy2#)+(vz2#*vz2#))
  584.    pointAngle22#=ACos(((vx1# * vx2#) + (vy1# * vy2#) + (vz1# * vz2#))/(vlen1#*vlen2#))
  585.  
  586.    vx1#=x0#-x2#
  587.    vy1#=y0#-y2#
  588.    vz1#=z0#-z2#
  589.    vx2#=this3dPointArray.point3d(PointIndex)x#-x2#
  590.    vy2#=this3dPointArray.point3d(PointIndex)y#-y2#
  591.    vz2#=this3dPointArray.point3d(PointIndex)z#-z2#
  592.    vlen1#=Sqr((vx1#*vx1#)+(vy1#*vy1#)+(vz1#*vz1#))
  593.    vlen2#=Sqr((vx2#*vx2#)+(vy2#*vy2#)+(vz2#*vz2#))
  594.    pointAngle3#=ACos(((vx1# * vx2#) + (vy1# * vy2#) + (vz1# * vz2#))/(vlen1#*vlen2#))
  595.  
  596.    vx1#=this3dPointArray.point3d(PointIndex)x#-x2#
  597.    vy1#=this3dPointArray.point3d(PointIndex)y#-y2#
  598.    vz1#=this3dPointArray.point3d(PointIndex)z#-z2#
  599.    vx2#=x1#-x2#
  600.    vy2#=y1#-y2#
  601.    vz2#=z1#-z2#
  602.    vlen1#=Sqr((vx1#*vx1#)+(vy1#*vy1#)+(vz1#*vz1#))
  603.    vlen2#=Sqr((vx2#*vx2#)+(vy2#*vy2#)+(vz2#*vz2#))
  604.    pointAngle33#=ACos(((vx1# * vx2#) + (vy1# * vy2#) + (vz1# * vz2#))/(vlen1#*vlen2#))
  605.  
  606.  
  607.    ; See If point lies inside of the angles.
  608.    inside1=0
  609.    If pointAngle1#<angle1# And pointAngle11#<angle1# Then inside1=1
  610.    inside2=0
  611.    If pointAngle2#<angle2# And pointAngle22#<angle2# Then inside2=1
  612.    inside3=0
  613.    If pointAngle3#<angle3# And pointAngle33#<angle3# Then inside3=1
  614.  
  615.         If inside1=1 And inside2=1 And inside3=1
  616.                 DebugLog "Point inside Tri!!!"
  617.                 Return True
  618.         EndIf
  619.    Return False
  620. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal