В настоящее время я работаю над проектом по созданию кубика Рубика. Я пытаюсь быть в состоянии вращать куб. Сам куб состоит из 27 отдельных меньших кубов. Алгоритм, который я должен вращать, использует трехмерное вращение матрицы для каждого отдельного куба, чтобы найти его новую позицию, прежде чем обновлять угол поворота.
Пример алгоритма вращения вокруг оси z:
if (keyChar = #65) or (keyChar = #97) then
begin
for count := 1 to 27 do
begin
x := Cubes[count].Position.X;
y := Cubes[count].Position.Y;
newX := (cos(-pi/ANGLE)*x) - (sin(-pi/ANGLE)*y);
newY := (sin(-pi/ANGLE)*x) + (cos(-pi/ANGLE)*y);
Cubes[count].Position.X := newX;
Cubes[count].Position.Y := newY;
Cubes[count].RotationAngle.Z := Cubes[count].RotationAngle.Z - (180/ANGLE);
Memo2.Lines.Clear;
Memo2.Lines.Append(floatToStr(Cubes[14].RotationAngle.Z));
end;
end;
Этот алгоритм и алгоритмы поворота в других измерениях работают нормально только при вращении только в одном измерении. Однако, когда куб вращается в другом измерении, весь куб искажается.
Я думаю, что ошибка связана с обновлением угла поворота куба, но я не уверен, как это исправить.
Заранее спасибо за любую помощь.