m3D.X:= -1;
m3D.Y:= -1;
m3D.Z:= -1;
If (MbDownOnDrw) and (Assigned(NewCube) Then Begin
LastX:= MoveHist[NMoves].X;
LastY:= MoveHist[NMoves].Y;
If (LastX = 0) and (LastY = 0) Then
Exit;
// Richtung der Maus bestimmen
If (LastX > 0) And (LastY > 0) Then Begin
// Winkel der letzten Mausbewegung bestimmen
If Abs(ActuX - LastX) = 0 Then begin
Angle:= 90;
end
else begin
Angle:= arctan(Abs(ActuY - LastY) / Abs(ActuX - LastX)) * (180 / 3.141592); //Bogenmaß -> grad
End;
If ActuX - LastX >= 0 Then begin // Bewegung nach rechts
XRicht:= 1;
end
else begin // Bewegung nach Links
XRicht:= -1;
end;
If ActuY - LastY <= 0 Then Begin // Bewegung nach oben
YRicht:= 1;
end
else begin
YRicht:= -1;
end;
If (XRicht = 1) and (YRicht = 1) Then begin // Winkel in Segment 1 (0h bis 3h)übernehmen
Angle:= Angle;
end
else if (XRicht = -1) and (YRicht = 1) then begin // Winkel in Segment 2 (9h bis 12h)
Angle:= 90 + (90 - Angle);
end
else if (XRicht = -1) and (YRicht = -1) then begin // Winkel in Segment 3 (6h bis 9h)
Angle:= 180 + Angle;
end
else if (XRicht = 1) and (YRicht = -1) then begin
Angle:= 270 + (90 - Angle);
end;
// Bereiche aufteilen in primär zu ändernde Achse
MausRicht:= '';
If ((Angle >= 0) And (Angle < 20)) Or ((Angle >= 340) and (Angle <= 360)) Or ((Angle >=110) and (Angle < 200)) Then begin
MausRicht:= 'X';
end
else if ((Angle >= 20) and (Angle <= 70)) Or ((Angle >= 200) and (Angle < 250)) Then begin
MausRicht:= 'Y';
end
else if ((Angle > 70) and (Angle < 110)) Or ((Angle >= 250) And (Angle < 340)) Then begin
MausRicht:= 'Z';
end;
If Mausricht = '' Then
ShowMessage('Mausrichtungswinkel kontrollieren!');
End;
CDrw:= CoordRef(ActuX, ActuY, False);
cX:= CDrw.X;
cY:= CDrw.Y;
// auf Werkzeugfläche?
If (CDrw.X > ConstArea.X) and not IsMouseOnRubbish Then
Exit;
If LastWkzPos.X = -1 Then begin
// erste Position im Konstruktionsfeld
// X berechnen, wobei Y im ersten Schritt in der Mitte bei -3 liegt
If BahnYFix = -1 Then
AcY:= 2
else
AcY:= BahnYFix - 1;
AcX:= cX + AcY / 2;
AcZ:= cY + AcY / 2;
end
else begin
LastcY:= LastWkzPos.Z - LastWkzPos.Y / 2;
DeltaCy:= cY - LastcY;
Ok3DCoord:= True;
If BahnYFix = -1 Then Begin
repeat
If MausRicht = 'Y' Then begin
// Änderung zur neuen cY Position primär auf Y anwenden
If DeltaCy > 0 Then
AcY:= LastWkzPos.Y - Abs(DeltaCy) * 2
else
AcY:= LastWkzPos.Y + Abs(DeltaCy) * 2;
AcZ:= LastWkzPos.Z;
If (AcY < 0) or (AcY > ConstArea.Y - CubeSize) Then begin
MausRicht:= 'Z';
end;
end;
If MausRicht = 'Z' Then begin
// Änderung zur neuen cY Position primär auf Z anwenden
If DeltaCy > 0 Then
AcZ:= LastWkzPos.Z + Abs(DeltaCy)
else
AcZ:= LastWkzPos.Z - Abs(DeltaCy);
AcY:= LastWkzPos.Y;
If MausRicht = 'X' Then begin
// Änderung an neuer cY Position auf Y und Z aufteilen
If DeltaCy > 0 Then begin
AcZ:= LastWkzPos.Z + Abs(DeltaCy) / 3;
AcY:= LastWkzPos.Y - Abs(DeltaCy) / 3 * 2;
end
else begin
AcZ:= LastWkzPos.Z - Abs(DeltaCy) / 3;
AcY:= LastWkzPos.Y + Abs(DeltaCy) / 3 * 2;
end;
Ok3DCoord:= True;
end;
end;
AcX:= cX + AcY / 2;
until Ok3DCoord;
end
else begin
AcY:= BahnYFix - 1;
AcZ:= cY + AcY / 2;
AcX:= cX + AcY / 2;
end;
End;
LastWkzPos.X:= AcX;
LastWkzPos.Y:= AcY;
LastWkzPos.Z:= AcZ;
// Aus AcX, AcY und AcZ TcX und TcY berechnen
If BahnYFix <> -1 Then begin
TcX:= AcX - AcY / 2;
If TcX <> cX Then
AcX:= cX + AcY / 2;
TcY:= AcZ - AcY / 2;
If Int(TcY * 10000) <> Int(cY * 10000) Then begin
// Y behalten und Z neu ausrechnen
AcZ:= cY + AcY / 2;
end;
End;
// Aktuelle 3D Position des Würfels merken
m3D.X:= trunc(AcX);
m3D.Y:= trunc(AcY);
m3D.Z:= trunc(AcZ);
End;