fTriangleBoxD.pas 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. unit fTriangleBoxD;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. System.Types,
  6. System.SysUtils,
  7. System.Classes,
  8. System.Math,
  9. Vcl.Graphics,
  10. Vcl.Controls,
  11. Vcl.Forms,
  12. Vcl.Dialogs,
  13. Vcl.ExtCtrls,
  14. Vcl.StdCtrls,
  15. GLS.VectorTypes,
  16. GLS.VectorLists,
  17. GLS.Scene,
  18. GLS.Objects,
  19. GLS.Cadencer,
  20. GLS.VectorFileObjects,
  21. GLS.Material,
  22. GLS.Color,
  23. GLS.State,
  24. GLS.SceneViewer,
  25. GLS.VectorGeometry,
  26. GLS.Graph,
  27. GLS.GeomObjects,
  28. GLS.Coordinates,
  29. GLS.BaseClasses;
  30. type
  31. TFormTriangleBox = class(TForm)
  32. Viewer: TGLSceneViewer;
  33. GLScene: TGLScene;
  34. GLCadencer: TGLCadencer;
  35. GLCamera1: TGLCamera;
  36. GLLightSource1: TGLLightSource;
  37. GLLightSource2: TGLLightSource;
  38. DCCamTarget: TGLDummyCube;
  39. Panel2: TPanel;
  40. GLCube1: TGLCube;
  41. GLXYZGrid1: TGLXYZGrid;
  42. GLLines1: TGLLines;
  43. CheckBoxGrid: TCheckBox;
  44. ButtonFindIntersect: TButton;
  45. CheckBoxPosition: TCheckBox;
  46. CheckBoxScale: TCheckBox;
  47. CheckBoxTriangle: TCheckBox;
  48. ButtonNotFindIntersect: TButton;
  49. GLPolygon1: TGLPolygon;
  50. CheckBoxVisible: TCheckBox;
  51. GLPoints1: TGLPoints;
  52. CheckBoxAxis: TCheckBox;
  53. GLLines2: TGLLines;
  54. GLPolygon2: TGLPolygon;
  55. RadioGroupCoPolygon: TRadioGroup;
  56. procedure GLCadencerProgress(Sender: TObject; const deltaTime,
  57. newTime: Double);
  58. procedure FormCreate(Sender: TObject);
  59. procedure ViewerMouseMove(Sender: TObject; Shift: TShiftState; X,
  60. Y: Integer);
  61. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  62. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  63. procedure FormResize(Sender: TObject);
  64. procedure FormKeyPress(Sender: TObject; var Key: Char);
  65. procedure ButtonNotFindIntersectClick(Sender: TObject);
  66. procedure ButtonFindIntersectClick(Sender: TObject);
  67. procedure CheckBoxVisibleClick(Sender: TObject);
  68. procedure RadioGroupCoPolygonClick(Sender: TObject);
  69. private
  70. mdx, mdy : Integer;
  71. BoxPos, BoxScale,
  72. MinExtend, MaxExtend : TAffineVector;
  73. TriangePos : array [0..2] of TAffineVector;
  74. PolygonPos : array [0..4] of TAffineVector;
  75. procedure MakeRandomData;
  76. procedure DrawResult;
  77. procedure DrawCoplanarPolygon;
  78. public
  79. end;
  80. var
  81. FormTriangleBox : TFormTriangleBox;
  82. implementation
  83. {$R *.DFM}
  84. const
  85. SizePos = 10;
  86. ScaleSize = 3;
  87. TrigRect = 10;
  88. procedure TFormTriangleBox.FormCreate(Sender: TObject);
  89. var
  90. i:integer;
  91. begin
  92. Randomize;
  93. BoxScale := XYZVector;
  94. DrawCoplanarPolygon;
  95. end;
  96. procedure TFormTriangleBox.DrawCoplanarPolygon;
  97. begin
  98. GLPolygon2.Nodes.Clear;
  99. GLPolygon2.Material.FrontProperties.Ambient.RandomColor;
  100. PolygonPos[0] := AffineVectorMake(-5,-5,0);
  101. PolygonPos[1] := AffineVectorMake(5,-5,0);
  102. PolygonPos[2] := AffineVectorMake(5,5,0);
  103. PolygonPos[3] := AffineVectorMake(-5,5,0);
  104. PolygonPos[4] := AffineVectorMake(0,0,0);
  105. GLPolygon2.AddNode(PolygonPos[0]);
  106. GLPolygon2.AddNode(PolygonPos[1]);
  107. GLPolygon2.AddNode(PolygonPos[2]);
  108. GLPolygon2.AddNode(PolygonPos[3]);
  109. GLPolygon2.AddNode(PolygonPos[4]);
  110. end;
  111. procedure TFormTriangleBox.MakeRandomData;
  112. var
  113. i : Integer;
  114. begin
  115. // Change position.
  116. if CheckBoxPosition.Checked then
  117. BoxPos := AffineVectorMake( Random*SizePos -SizePos/2,
  118. Random*SizePos -SizePos/2,
  119. Random*SizePos -SizePos/2 );
  120. // Change scale.
  121. if CheckBoxScale.Checked then
  122. BoxScale := AffineVectorMake( Random*ScaleSize +ScaleSize/2,
  123. Random*ScaleSize +ScaleSize/2,
  124. Random*ScaleSize +ScaleSize/2 );
  125. // Change triangle.
  126. if CheckBoxTriangle.Checked then
  127. for i := 0 to 2 do
  128. TriangePos[i] := AffineVectorMake( Random*TrigRect -TrigRect/2,
  129. Random*TrigRect -TrigRect/2,
  130. Random*TrigRect -TrigRect/2 );
  131. // Calc extends.
  132. MinExtend := VectorSubtract(BoxPos, VectorScale(BoxScale, 0.5));
  133. MaxExtend := VectorAdd( BoxPos, VectorScale(BoxScale, 0.5));
  134. end;
  135. procedure TFormTriangleBox.RadioGroupCoPolygonClick(Sender: TObject);
  136. begin
  137. case RadioGroupCoPolygon.ItemIndex of
  138. 0: GLPolygon2.Material.PolygonMode := pmFill;
  139. 1: GLPolygon2.Material.PolygonMode := pmLines;
  140. 2: GLPolygon2.Material.PolygonMode := pmPoints;
  141. end;
  142. end;
  143. procedure TFormTriangleBox.DrawResult;
  144. var
  145. i : Integer;
  146. begin
  147. GLPolygon1.Nodes.Clear;
  148. GLPolygon1.Material.FrontProperties.Emission.Color := clrGreen;
  149. GLPolygon1.Material.BackProperties.Emission.Color := clrGreen;
  150. GLPolygon1.AddNode(TriangePos[0]);
  151. GLPolygon1.AddNode(TriangePos[1]);
  152. GLPolygon1.AddNode(TriangePos[2]);
  153. GLPoints1.Positions.Clear;
  154. GLPoints1.Colors.Add(1, 0, 1, 1); //magenta
  155. GLPoints1.Size := 5;
  156. for i := 0 to 2 do
  157. GLPoints1.Positions.Add(TriangePos[i]);
  158. GLLines2.Nodes.Clear;
  159. GLLines2.Nodes.AddNode(TriangePos[0]);
  160. GLLines2.Nodes.AddNode(TriangePos[1]);
  161. GLLines2.Nodes.AddNode(TriangePos[2]);
  162. GLLines2.Nodes.AddNode(TriangePos[0]);
  163. DCCamTarget.Position.SetPoint(BoxPos);
  164. DCCamTarget.Scale.SetVector(BoxScale);
  165. GLCube1.Position.SetPoint(BoxPos);
  166. GLCube1.Scale.SetVector(BoxScale);
  167. DrawCoplanarPolygon;
  168. end;
  169. // Find next with intersection
  170. procedure TFormTriangleBox.ButtonFindIntersectClick(Sender: TObject);
  171. var
  172. IterCnt : Integer;
  173. Res1 : Boolean;
  174. begin
  175. IterCnt := 0;
  176. repeat
  177. MakeRandomData;
  178. Res1 := IntersectTriangleBox(TriangePos[0], TriangePos[1], TriangePos[2],
  179. MinExtend, MaxExtend);
  180. IterCnt := IterCnt + 1;
  181. if IterCnt >= 10000 then
  182. begin
  183. DrawResult;
  184. ShowMessage('Intersection not found!');
  185. exit;
  186. end;
  187. until Res1;
  188. DrawResult;
  189. end;
  190. // Find next without intersection.
  191. procedure TFormTriangleBox.ButtonNotFindIntersectClick(Sender: TObject);
  192. var
  193. IterCnt : Integer;
  194. Res1 : Boolean;
  195. begin
  196. IterCnt := 0;
  197. repeat
  198. MakeRandomData;
  199. Res1 := IntersectTriangleBox(TriangePos[0], TriangePos[1], TriangePos[2],
  200. MinExtend, MaxExtend);
  201. IterCnt := IterCnt + 1;
  202. if IterCnt >= 10000 then
  203. begin
  204. DrawResult;
  205. ShowMessage('Intersection not found!');
  206. Exit;
  207. end;
  208. until not Res1;
  209. DrawResult;
  210. end;
  211. procedure TFormTriangleBox.CheckBoxVisibleClick(Sender: TObject);
  212. begin
  213. GLCube1.Visible := CheckBoxVisible.Checked;
  214. GLXYZGrid1.Visible := CheckBoxGrid.Checked;
  215. GLLines1.Visible := CheckBoxAxis.Checked;
  216. end;
  217. procedure TFormTriangleBox.GLCadencerProgress(Sender: TObject; const deltaTime,
  218. newTime: Double);
  219. begin
  220. if FormTriangleBox.Active then Viewer.Invalidate
  221. end;
  222. procedure TFormTriangleBox.ViewerMouseMove(Sender: TObject; Shift: TShiftState; X,
  223. Y: Integer);
  224. begin
  225. if Shift = [ssLeft] then GLCamera1.MoveAroundTarget(mdy -y, mdx -x);
  226. mdx := x;
  227. mdy := y;
  228. end;
  229. procedure TFormTriangleBox.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  230. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  231. begin
  232. GLCamera1.AdjustDistanceToTarget(Power(1.02, WheelDelta/120));
  233. end;
  234. procedure TFormTriangleBox.FormResize(Sender: TObject);
  235. begin
  236. GLCamera1.FocalLength := MinInteger(Height, Width) / 10;
  237. end;
  238. procedure TFormTriangleBox.FormKeyPress(Sender: TObject; var Key: Char);
  239. begin
  240. if Key = #27 then close;
  241. end;
  242. end.