Project

General

Profile

Download (10.4 KB) Statistics
| Branch: | Revision:

phasedsolver / src / main / java / org / distorted / phasedsolver / SolverActivity.java @ 9e342cf1

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2024 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.phasedsolver;
11

    
12
import static org.distorted.objectlib.main.TwistyObject.MODE_NORM;
13

    
14
import android.app.Activity;
15
import android.content.SharedPreferences;
16
import android.os.Bundle;
17
import android.view.View;
18
import android.widget.TextView;
19
import android.widget.Toast;
20

    
21
import androidx.preference.PreferenceManager;
22

    
23
import org.distorted.library.main.DistortedLibrary;
24
import org.distorted.library.type.Static3D;
25
import org.distorted.objectlib.algsolvers.PhaseMitm;
26
import org.distorted.objectlib.algsolvers.*;
27
import org.distorted.objectlib.main.InitAssets;
28
import org.distorted.objectlib.main.ObjectControl;
29
import org.distorted.objectlib.main.TwistyObject;
30
import org.distorted.objectlib.metadata.ListObjects;
31
import org.distorted.os.OSInterface;
32

    
33
///////////////////////////////////////////////////////////////////////////////////////////////////
34

    
35
public class SolverActivity extends Activity
36
{
37
  private InitAssets mAsset;
38
  private SharedPreferences mPreferences;
39
  private SolverLowerPane mLowerPane;
40
  private TextView mText;
41
  private SolvedObject mObject;
42
  private int[][] mMoveTable;
43
  private String mMoves;
44

    
45
///////////////////////////////////////////////////////////////////////////////////////////////////
46

    
47
  @Override
48
  protected void onCreate(Bundle icicle)
49
    {
50
    super.onCreate(icicle);
51
    mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
52
    DistortedLibrary.onCreate();
53
    setContentView(R.layout.mainlayout);
54
    SolverSurfaceView view = findViewById(R.id.solverView);
55
    OSInterface os = view.getInterface();
56
    mAsset = new InitAssets(null, null, os);
57
    mLowerPane = new SolverLowerPane(this);
58
    mText = findViewById(R.id.solverMoves);
59
    mMoves = "";
60
    }
61

    
62
///////////////////////////////////////////////////////////////////////////////////////////////////
63

    
64
  @Override
65
  protected void onPause()
66
    {
67
    super.onPause();
68
    SolverSurfaceView view = findViewById(R.id.solverView);
69
    view.onPause();
70
    DistortedLibrary.onPause();
71

    
72
    savePreferences();
73
    }
74

    
75
///////////////////////////////////////////////////////////////////////////////////////////////////
76

    
77
  @Override
78
  protected void onResume()
79
    {
80
    super.onResume();
81
    SolverSurfaceView view = findViewById(R.id.solverView);
82
    view.onResume();
83
    DistortedLibrary.onResume();
84

    
85
    restorePreferences();
86

    
87
    ObjectControl control = getControl();
88
    control.changeObject(ListObjects.CUBE_3.ordinal(), MODE_NORM, mAsset);
89
    }
90

    
91
///////////////////////////////////////////////////////////////////////////////////////////////////
92

    
93
  @Override
94
  protected void onDestroy()
95
    {
96
    DistortedLibrary.onDestroy();
97
    super.onDestroy();
98
    }
99

    
100
///////////////////////////////////////////////////////////////////////////////////////////////////
101

    
102
  ObjectControl getControl()
103
    {
104
    SolverSurfaceView view = findViewById(R.id.solverView);
105
    return view.getObjectControl();
106
    }
107

    
108
///////////////////////////////////////////////////////////////////////////////////////////////////
109

    
110
  private void savePreferences()
111
    {
112
    SharedPreferences.Editor editor = mPreferences.edit();
113
    SolverSurfaceView view = findViewById(R.id.solverView);
114
    OSInterface os = view.getInterface();
115
    os.setEditor(editor);
116
    view.getObjectControl().savePreferences();
117

    
118
    editor.apply();
119
    }
120

    
121
///////////////////////////////////////////////////////////////////////////////////////////////////
122

    
123
  private void restorePreferences()
124
    {
125
    SolverSurfaceView view = findViewById(R.id.solverView);
126
    OSInterface os = view.getInterface();
127
    os.setPreferences(mPreferences);
128
    view.getObjectControl().restorePreferences();
129
    }
130

    
131
///////////////////////////////////////////////////////////////////////////////////////////////////
132

    
133
  private void solve(SolverPhased ps, int[] quats)
134
    {
135
    int[][] sol = ps.solution(quats);
136
    int numPhases = sol.length;
137
    int totalLength = 0;
138

    
139
    for(int p=0; p<numPhases; p++)
140
      {
141
      int numMoves = sol[p]==null ? -1 : sol[p][0];
142

    
143
      if( numMoves<0 )
144
        {
145
        String message = "Phase "+p+": FAIL";
146
        Toast.makeText(this,message,Toast.LENGTH_LONG).show();
147
        return;
148
        }
149

    
150
      totalLength += numMoves;
151
      }
152

    
153
    int[][] moves = new int[totalLength][];
154
    int index = 0;
155

    
156
    for( int[] s : sol )
157
      {
158
      int numMoves = s[0];
159

    
160
      for(int m=1; m<=numMoves; m++)
161
        {
162
        int mi = s[m];
163
        moves[index++] = mMoveTable[mi];
164
        android.util.Log.e("D","move "+m+" : "+mMoveTable[mi][0]+" "+mMoveTable[mi][1]+" "+mMoveTable[mi][2]);
165
        }
166
      }
167

    
168
    mLowerPane.setMoves(this,moves);
169
    }
170

    
171
///////////////////////////////////////////////////////////////////////////////////////////////////
172

    
173
    private void createObject()
174
      {
175
      TwistyObject object = getControl().getObject();
176

    
177
      int[] numL      = object.getNumLayers();
178
      float[][] pos   = object.getCubitPositions(numL);
179
      Static3D[] axis = object.getRotationAxis();
180
      int[][] angles  = object.getBasicAngles();
181
      float[][] cuts  = object.getCuts(numL);
182

    
183
      boolean[] r = {true,false,true};
184
      boolean[][] rot = {r,r,r};//object.getLayerRotatable(numL);
185

    
186
      mObject = new SolvedObject(pos,axis,angles,cuts,rot);
187
      mMoveTable = mObject.getMoveTable();
188
      }
189

    
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

    
192
    public void Solve(View v)
193
      {
194
      if( mObject==null ) createObject();
195

    
196
      TwistyObject object = getControl().getObject();
197
      int[] numL      = object.getNumLayers();
198
      float[][] pos   = object.getCubitPositions(numL);
199

    
200
      int numCubits = pos.length;
201
      int[] qi = new int[numCubits];
202
      for(int i=0; i<numCubits; i++) qi[i] = object.getCubitQuatIndex(i);
203

    
204
      int[][] whiteCross   = new int[][]{ {12,13,16,17} };
205
      int[][] whiteCorners = new int[][]{ {0},{1},{2},{3} };
206
      int[][] secondLayer  = new int[][]{ {8},{9},{10},{11} };
207

    
208
      int[][] yellowEdges  = new int[][]{ {14,15,18,19} };
209
      String lleoA = "(11,17,5,15,3,9)";
210
      String lleoB = "(17,6,5,8,3,15)";
211
      String lleoC = "(6,12,5,14,3,8)";
212
      String lleoD = "(12,11,5,9,3,14)";
213
      String llEdgesOrie = lleoA+"{0,1,2} "+lleoB+"{0,1,2} "+lleoC+"{0,1,2} "+lleoD+"{0,1,2}";
214
      String llepA = "(6,5,8,5,6,4,8)";
215
      String llepB = "(12,5,14,5,12,4,14)";
216
      String llepC = "(11,5,9,5,11,4,9)";
217
      String llEdgesPerm = "(3){0,1} ["+llepA+"{-1,0,1};"+llepB+"] "+llepC+"{-1,0,1}";
218
      String llEdges = llEdgesOrie+" "+llEdgesPerm;
219

    
220
      int[][] yellowCorners= new int[][]{ {4,5,6,7} };
221
      String llcpA = "(5,6,3,9,5,8,3,11)";
222
      String llcpB = "(5,12,3,15,5,14,3,17)";
223
      String llcpC = "(5,11,3,8,5,9,3,6)";
224
      String llCornersPerm = "["+llcpA+"{-1,0,1};"+llcpB+"] "+llcpC+"{-1,0,1}";
225
      String llco  = "(3,8,5,6){-2,0,2} (11)";
226
      String llCornersOrie = llco+" "+llco+" "+llco+" "+llco;
227
      String llCorners = llCornersPerm+" "+llCornersOrie;
228

    
229
      int[][] algsOrie = { {11,17,5,15,3,9},{3} };
230
      int[][] algsPerm = { {5,6,3,9,5,8,3,11},{3} };
231

    
232
      int[][] moveTable = mObject.getMoveTable();
233
      MoveProviderAll  all = new MoveProviderAll(moveTable);
234
      MoveProviderAlgs alO = new MoveProviderAlgs(algsOrie);
235
      MoveProviderAlgs alP = new MoveProviderAlgs(algsPerm);
236

    
237
      TargetProvider wcr = new TargetProviderAll(whiteCross);
238
      TargetProvider wco = new TargetProviderAll(whiteCorners);
239
      TargetProvider sla = new TargetProviderAll(secondLayer);
240
      TargetProvider oll = new TargetProviderOrie(mObject,14,1);
241
      TargetProvider pll = new TargetProviderPerm(mObject,14,1);
242

    
243
      Phase[] phases =
244
              {
245
                new PhaseMitm( mObject, all, wcr),
246
                new PhaseMitm( mObject, all, wco),
247
                new PhaseMitm( mObject, all, sla),
248
                new PhaseMitm( mObject, alO, oll),
249
                new PhaseMitm( mObject, alP, pll),
250
              };
251

    
252
      SolverPhased ps = new SolverPhased(mObject,phases);
253

    
254
      runOnUiThread(new Runnable()
255
        {
256
        @Override
257
        public void run()
258
          {
259
          solve(ps,qi);
260
          }
261
        });
262
      }
263

    
264
///////////////////////////////////////////////////////////////////////////////////////////////////
265

    
266
    public void Reset(View v)
267
      {
268
      ObjectControl control = getControl();
269
      control.solveObject();
270
      mLowerPane.clearMoves(this);
271

    
272
      mMoves = "";
273
      mText.setText(mMoves);
274
      }
275

    
276
///////////////////////////////////////////////////////////////////////////////////////////////////
277

    
278
    int findMove(int ax, int row, int angle)
279
      {
280
      int num = mMoveTable.length;
281

    
282
      for( int m=0; m<num; m++)
283
        {
284
        int[] move = mMoveTable[m];
285
        if( ax==move[0] && row==move[1] && angle==move[2] ) return m;
286
        }
287

    
288
      return -1;
289
      }
290

    
291
///////////////////////////////////////////////////////////////////////////////////////////////////
292

    
293
    void addMove(int axis, int row, int angle)
294
      {
295
      if( mObject==null ) createObject();
296
      int move = findMove(axis,row,angle);
297
      mMoves += (" "+move);
298
      mText.setText(mMoves);
299
      }
300

    
301
///////////////////////////////////////////////////////////////////////////////////////////////////
302

    
303
    public void Left(View v)
304
      {
305
      mLowerPane.backMove(this);
306
      }
307

    
308
///////////////////////////////////////////////////////////////////////////////////////////////////
309

    
310
    public void Right(View v)
311
      {
312
      mLowerPane.makeMove(this);
313
      }
314
}
(1-1/5)