SCAR Code:
program New;
var
Mx, My : Integer;
type
MyPoint = record
x,y,z : Integer;
end;
Type
TPoly = Array[1..8] of MyPoint;
Type
T_2D = Array[1..8] of TPoint;
var
YRot, XRot : Extended;
DebugCanv, CubeCanv : TCanvas;
TempBmp : integer;
Function SetupBox(Size : integer) : TPoly;
Var
Poly : TPoly;
begin
Poly[1].x := 1 * size;
Poly[1].y := 1 * size;
Poly[1].z := 1 * size;
Poly[2].x := -1 * size;
Poly[2].y := 1 * size;
Poly[2].z := 1 * size;
Poly[3].x := -1 * size;
Poly[3].y := 1 * size;
Poly[3].z := -1 * size;
Poly[4].x := 1 * size;
Poly[4].y := 1 * size;
Poly[4].z := -1 * size;
Poly[5].x := 1 * size;
Poly[5].y := -1 * size;
Poly[5].z := 1 * size;
Poly[6].x := -1 * size;
Poly[6].y := -1 * size;
Poly[6].z := 1 * size;
Poly[7].x := -1 * size;
Poly[7].y := -1 * size;
Poly[7].z := -1 * size;
Poly[8].x := 1 * size;
Poly[8].y := -1 * size;
Poly[8].z := -1 * size;
Result := Poly;
end;
Function _3DTo2D(X,Y,Z: integer; RotX, RotY, RotZ : extended) : TPoint;
begin
Result.x := Round((X*Cos(RotY)-Z*Sin(RotY)));
Result.y := -Round((Y*Cos(RotX)+(-X*Sin(RotY)-Z*Cos(RotY))*Sin(RotX)));
end;
Function CheckSide(Vertices : array of integer; _2D : T_2D) : boolean;
var
I : integer;
Middle : TPoint;
PreviousAngle : Extended;
CurrentAngle : Extended;
BiggerCount : integer;
begin
Middle.x := 0;
Middle.y := 0;
BiggerCount := 0;
For I := 0 to 3 do
begin
Middle.X := Middle.X + _2D[Vertices[i]].x;
Middle.Y := Middle.Y + _2D[Vertices[i]].y;
end;
Middle.x := Round(Middle.x/4);
Middle.y := Round(Middle.y/4);
PreviousAngle := ArcTan2(_2D[Vertices[3]].x - Middle.x, _2d[Vertices[3]].y - Middle.y);
For I := 0 to 3 do
begin
CurrentAngle := ArcTan2(_2D[Vertices[i]].x - Middle.x, _2d[Vertices[i]].y - Middle.y);
If CurrentAngle > PreviousAngle then Inc(BiggerCount);
PreviousAngle := CurrentAngle;
end;
If (BiggerCount >= 3) then Result := True;
end;
Procedure RenderSide(Vertices : Array of Integer; Dots : integer; Canvas : TCanvas; _2D : T_2D);
var
I : integer;
begin
Canvas.MoveTo(_2D[Vertices[0]].x + 300,_2D[Vertices[0]].y + 200);
For I := 0 to 3 do
Canvas.LineTo(_2D[Vertices[i]].x + 300,_2D[Vertices[i]].y + 200);
Canvas.LineTo(_2D[Vertices[0]].x + 300,_2D[Vertices[0]].y + 200);
end;
Procedure DrawSide(Side : integer; Canvas : TCanvas; _2D : T_2D);
begin
Case Side of
1 : begin
if CheckSide([4,3,2,1],_2D) then
RenderSide([4,3,2,1],1,Canvas,_2D);
end;
2 : begin
if CheckSide([5,6,7,8],_2D) then
RenderSide([5,6,7,8],6,Canvas,_2D);
end;
3 : begin
if CheckSide([2,6,5,1],_2D) then
RenderSide([2,6,5,1],3,Canvas,_2D);
end;
4 : begin
if CheckSide([4,8,7,3],_2D) then
RenderSide([4,8,7,3],4,Canvas,_2D);
end;
5 : begin
if CheckSide([5,8,4,1],_2D) then
RenderSide([5,8,4,1],2,Canvas,_2D);
end;
6 : begin
if CheckSide([2,3,7,6],_2D) then
RenderSide([2,3,7,6],5,Canvas,_2D);
end;
end;
end;
Procedure DrawCube(RotX, RotY, RotZ : extended; Size : integer; var C : TCanvas);
var
I : integer;
Poly : TPoly;
_2D : T_2D;
begin
C.Pen.Color := 0;
C.Brush.Color := 0;
C.Rectangle(0,0,600,400);
Poly := SetupBox(Size);
For I := 1 to 8 do
_2D[i] := _3DTo2D(Poly[i].x,Poly[i].y, Poly[i].z, RotX, RotY, RotZ);
C.Pen.Color := 16777215;
For I := 1 to 6 do
DrawSide(I, C, _2D);
end;
begin
DisplayDebugImgWindow(600,400);
DebugCanv :=GetDebugCanvas;
TempBmp := BitmapFromString(600, 400, '');
CubeCanv := GetBitmapCanvas(TempBMP);
Repeat
DrawCube(XRot, YRot , 0.0, 100,CubeCanv);
CopyCanvas(CubeCanv, DebugCanv, 0, 0, 600, 400, 0, 0, 600, 400);
getmousepos(MX, MY);
if ((Mx < 200) and (My < 768)) then
begin
YRot := YRot - 0.02*Pi;
XRot := XRot - 0.02*Pi;
end;
if (Mx > 824) and (My > 0) then
begin
YRot := YRot + 0.02*Pi;
XRot := XRot + 0.02*Pi;
end;
wait(30);
Until(False);
end.