Project

General

Profile

« Previous | Next » 

Revision f20265a7

Added by Leszek Koltunski about 5 years ago

Dynamics App: fix moving Quat Points
Library: remove negating the Quat Points in the DynamicQuat in order to always go the shortest route.

View differences:

src/main/java/org/distorted/examples/dynamic/DynamicActivity.java
77 77

  
78 78
      Spinner dimensionSpinner  = findViewById(R.id.dynamicSpinnerDimension);
79 79
      dimensionSpinner.setOnItemSelectedListener(this);
80
      String[] dimensions = { "Dimension 1" , "Dimension 2" , "Dimension 3 (XY)" , "Dimension 3 (XZ)" , "Dimension 4 (XY)" , "Dimension 4 (ZW)" };
80
      String[] dimensions = { "Dimension 1" , "Dimension 2" , "Dimension 3 (XY)" , "Dimension 3 (XZ)" , "Dimension 4 (XY)" , "Dimension 4 (ZW)" , "Quaternion XY" , "Quaternion ZW" };
81 81

  
82 82
      ArrayAdapter<String> adapterDim = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, dimensions );
83 83
      adapterDim.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
......
232 232
          case 3: setDim(DynamicSurfaceView.DIM_3DXZ); break;
233 233
          case 4: setDim(DynamicSurfaceView.DIM_4DXY); break;
234 234
          case 5: setDim(DynamicSurfaceView.DIM_4DZW); break;
235
          case 6: setDim(DynamicSurfaceView.DIM_Q_XY); break;
236
          case 7: setDim(DynamicSurfaceView.DIM_Q_ZW); break;
235 237
          }
236 238
        }
237 239
      else if( spinnerID == R.id.dynamicSpinnerMode )
src/main/java/org/distorted/examples/dynamic/DynamicSurfaceView.java
35 35
import org.distorted.library.type.Dynamic2D;
36 36
import org.distorted.library.type.Dynamic3D;
37 37
import org.distorted.library.type.Dynamic4D;
38
import org.distorted.library.type.DynamicQuat;
38 39
import org.distorted.library.type.Static1D;
39 40
import org.distorted.library.type.Static2D;
40 41
import org.distorted.library.type.Static3D;
......
52 53
    public static final int DIM_3DXZ = 3; 
53 54
    public static final int DIM_4DXY = 4;
54 55
    public static final int DIM_4DZW = 5;
56
    public static final int DIM_Q_XY = 6;
57
    public static final int DIM_Q_ZW = 7;
55 58

  
56 59
    private static final int MAX_DIM = 4;
60
    private static final float QUAT_QUOT = 0.9f;
57 61

  
58 62
    static final int NUM_POINTS = 250;
59 63
    private static final Object lock = new Object();
......
63 67
    private static int halfScreenHeight=0;
64 68
    private static int halfScreenWidth =0;
65 69

  
66
    private Dynamic1D di1D;
67
    private Dynamic2D di2D;
68
    private Dynamic3D di3D;
69
    private Dynamic4D di4D;
70
    private Dynamic1D   di1D;
71
    private Dynamic2D   di2D;
72
    private Dynamic3D   di3D;
73
    private Dynamic4D   di4D;
74
    private DynamicQuat diQu;
70 75
    
71 76
    private Paint mPaint;
72 77
    private int mMoving;
......
85 90
    private Static2D p2D;
86 91
    private Static3D p3D;
87 92
    private Static4D p4D;
93
    private Static4D pQD;
88 94

  
89 95
    private Static1D p1N;
90 96
    private Static2D p2N;
91 97
    private Static3D p3N;
92 98
    private Static4D p4N;
99
    private Static4D pQN;
93 100

  
94 101
    private float[] mPoints = new float[MAX_DIM*NUM_POINTS];
95 102
    private boolean mRunning;
......
128 135
      p3N  = new Static3D(mNoise[0],mNoise[1],mNoise[2]);
129 136
      di4D = new Dynamic4D(mDuration,mCount);
130 137
      p4N  = new Static4D(mNoise[0],mNoise[1],mNoise[2],mNoise[3]);
138
      diQu = new DynamicQuat(mDuration,mCount);
139
      pQN  = new Static4D(mNoise[0],mNoise[1],mNoise[2],mNoise[3]);
131 140

  
132 141
      di1D.setAccessType(Dynamic.ACCESS_TYPE_SEQUENTIAL);
133 142
      di2D.setAccessType(Dynamic.ACCESS_TYPE_SEQUENTIAL);
134 143
      di3D.setAccessType(Dynamic.ACCESS_TYPE_SEQUENTIAL);
135 144
      di4D.setAccessType(Dynamic.ACCESS_TYPE_SEQUENTIAL);
145
      diQu.setAccessType(Dynamic.ACCESS_TYPE_SEQUENTIAL);
136 146

  
137 147
      if(!isInEditMode())
138 148
        {
......
189 199
      di2D.setMode(mode);
190 200
      di3D.setMode(mode);
191 201
      di4D.setMode(mode);
202
      diQu.setMode(mode);
192 203
      }
193 204

  
194 205
///////////////////////////////////////////////////////////////////////////////////////////////////
......
201 212
      di2D.setDuration(duration);
202 213
      di3D.setDuration(duration);
203 214
      di4D.setDuration(duration);
215
      diQu.setDuration(duration);
204 216
      }
205 217

  
206 218
///////////////////////////////////////////////////////////////////////////////////////////////////
......
213 225
      di2D.setCount(count);
214 226
      di3D.setCount(count);
215 227
      di4D.setCount(count);
228
      diQu.setCount(count);
216 229
      }
217 230

  
218 231
///////////////////////////////////////////////////////////////////////////////////////////////////
......
223 236
      di2D.setConvexity(convexity);
224 237
      di3D.setConvexity(convexity);
225 238
      di4D.setConvexity(convexity);
239
      diQu.setConvexity(convexity);
226 240
      }
227 241

  
228 242
///////////////////////////////////////////////////////////////////////////////////////////////////
243
// DynamicQuat does not support noise
229 244

  
230 245
    public void setNoise(float noise0, float noise1, float noise2, float noise3)
231 246
      {
......
252 267
      if( currentDim != dim )
253 268
        {
254 269
        if( !(currentDim==DIM_3DXY && dim==DIM_3DXZ) && !(currentDim==DIM_3DXZ && dim==DIM_3DXY) &&
255
            !(currentDim==DIM_4DXY && dim==DIM_4DZW) && !(currentDim==DIM_4DZW && dim==DIM_4DXY)  )
270
            !(currentDim==DIM_4DXY && dim==DIM_4DZW) && !(currentDim==DIM_4DZW && dim==DIM_4DXY) &&
271
            !(currentDim==DIM_Q_XY && dim==DIM_Q_ZW) && !(currentDim==DIM_Q_ZW && dim==DIM_Q_XY)  )
256 272
          {
257 273
          resetPoints();
258 274
          }
......
307 323
                         drawPath(c,di4D,2,3,time);
308 324
                         drawRedPoints4D(c);
309 325
                         break;
326
          case DIM_Q_XY: drawHorizontalAxis(c,"x");
327
                         drawVerticalAxis  (c,"y");
328
                         drawPath(c,diQu,0,1,time);
329
                         drawRedPointsQu(c);
330
                         break;
331
          case DIM_Q_ZW: drawHorizontalAxis(c,"z");
332
                         drawVerticalAxis  (c,"w");
333
                         drawPath(c,diQu,2,3,time);
334
                         drawRedPointsQu(c);
335
                         break;
310 336
          }
311 337
        }
312 338

  
......
339 365
          case DIM_3DXZ: di3D.removeAll(); break;
340 366
          case DIM_4DXY:
341 367
          case DIM_4DZW: di4D.removeAll(); break;
368
          case DIM_Q_XY:
369
          case DIM_Q_ZW: diQu.removeAll(); break;
342 370
          }
343 371

  
344 372
        DynamicActivity act = mAct.get();
......
360 388
      di2D.resetToBeginning();
361 389
      di3D.resetToBeginning();
362 390
      di4D.resetToBeginning();
391
      diQu.resetToBeginning();
363 392
      }
364 393

  
365 394
///////////////////////////////////////////////////////////////////////////////////////////////////
......
415 444
          addNewSpeedPoint(time);
416 445
          }
417 446

  
418
        for(int i=0; i<NUM_POINTS; i++)
447
        if( currentDim!=DIM_Q_XY && currentDim!=DIM_Q_ZW )
448
          {
449
          for(int i=0; i<NUM_POINTS; i++)
450
            {
451
            int color = i<=mPosition ? 0xff - (mPosition           -i)*0xff/(NUM_POINTS-1)
452
                                     : 0xff - (mPosition+NUM_POINTS-i)*0xff/(NUM_POINTS-1);
453

  
454
            mPaint.setColor( 0xffffff + ((color&0xff)<<24) );
455
            c.drawCircle(mPoints[MAX_DIM*i+indexH], mPoints[MAX_DIM*i+indexW] , mSize1, mPaint );
456
            }
457
          }
458
        else
419 459
          {
420
          int color = i<=mPosition ? 0xff - (mPosition           -i)*0xff/(NUM_POINTS-1)
421
                                   : 0xff - (mPosition+NUM_POINTS-i)*0xff/(NUM_POINTS-1);
460
          float x,y,min = QUAT_QUOT* (halfScreenWidth<halfScreenHeight ? halfScreenWidth:halfScreenHeight );
422 461

  
423
          mPaint.setColor( 0xffffff + ((color&0xff)<<24) );
424
          c.drawCircle(mPoints[MAX_DIM*i+indexH], mPoints[MAX_DIM*i+indexW] , mSize1, mPaint );
462
          for(int i=0; i<NUM_POINTS; i++)
463
            {
464
            int color = i<=mPosition ? 0xff - (mPosition           -i)*0xff/(NUM_POINTS-1)
465
                                     : 0xff - (mPosition+NUM_POINTS-i)*0xff/(NUM_POINTS-1);
466

  
467
            mPaint.setColor( 0xffffff + ((color&0xff)<<24) );
468
            x = mPoints[MAX_DIM*i+indexH]*min + halfScreenWidth;
469
            y = mPoints[MAX_DIM*i+indexW]*min + halfScreenHeight;
470
            c.drawCircle( x, y, mSize1, mPaint );
471
            }
425 472
          }
426 473
        }
427 474
      }
......
480 527
        }
481 528
      }
482 529

  
530
///////////////////////////////////////////////////////////////////////////////////////////////////
531

  
532
    private void drawRedPointsQu(Canvas c)
533
      {
534
      int len = diQu.getNumPoints();
535
      float x,y, min = QUAT_QUOT* (halfScreenWidth<halfScreenHeight ? halfScreenWidth:halfScreenHeight );
536

  
537
      for(int curr=0; curr<len; curr++)
538
        {
539
        pQD = diQu.getPoint(curr);
540

  
541
        if( currentDim==DIM_Q_XY )
542
          {
543
          x = pQD.get1()*min + halfScreenWidth;
544
          y = pQD.get2()*min + halfScreenHeight;
545
          }
546
        else
547
          {
548
          x = pQD.get3()*min + halfScreenWidth;
549
          y = pQD.get4()*min + halfScreenHeight;
550
          }
551

  
552
        drawRedPoint(c,curr+"", x,y);
553
        }
554
      }
555

  
483 556
///////////////////////////////////////////////////////////////////////////////////////////////////
484 557

  
485 558
    private void drawRedPoint(Canvas c, String label, float width, float height)
......
492 565

  
493 566
///////////////////////////////////////////////////////////////////////////////////////////////////
494 567

  
495
    private void addNewPoint(int x, int y)
568
    private void addNewPoint(float x, float y)
496 569
      {
497 570
      float gx,gy,gz,gw;
498 571
      int len;
......
622 695
                          }
623 696
                        }
624 697
                      break;
698
        case DIM_Q_XY:
699
        case DIM_Q_ZW:len = diQu.getNumPoints();
700
                      float min = QUAT_QUOT* (halfScreenWidth<halfScreenHeight ? halfScreenWidth:halfScreenHeight );
701

  
702
                      for(int g=0; g<len; g++)
703
                        {
704
                        pQD = diQu.getPoint(g);
705

  
706
                        if( currentDim==DIM_Q_XY )
707
                          {
708
                          gx = pQD.get1()*min + halfScreenWidth;
709
                          gy = pQD.get2()*min + halfScreenHeight;
710

  
711
                          if( (x-gx)*(x-gx) + (y-gy)*(y-gy) < minDist )
712
                            {
713
                            mMoving = g;
714
                            break;
715
                            }
716
                          }
717
                        if( currentDim==DIM_Q_ZW )
718
                          {
719
                          gz = pQD.get3()*min + halfScreenWidth;
720
                          gw = pQD.get4()*min + halfScreenHeight;
721

  
722
                          if( (x-gz)*(x-gz) + (y-gw)*(y-gw) < minDist )
723
                            {
724
                            mMoving = g;
725
                            break;
726
                            }
727
                          }
728
                        }
729

  
730
                      if( mMoving <0 )
731
                        {
732
                        float z,w;
733
                        x = (x - halfScreenWidth ) / min;
734
                        y = (y - halfScreenHeight) / min;
735
                        float len1 = x*x + y*y;
736

  
737
                        if( len1>= 1.0f )
738
                          {
739
                          float A = (float)Math.sqrt(len1);
740
                          x = x/A;
741
                          y = y/A;
742
                          z = 0.0f;
743
                          w = 0.0f;
744
                          }
745
                        else
746
                          {
747
                          z = (float)Math.sqrt(1-len1);
748
                          w = 0.0f;
749
                          }
750

  
751
                        synchronized(lock)
752
                          {
753
                          if( currentDim==DIM_Q_XY ) diQu.add(new Static4D(x,y,z,w));
754
                          if( currentDim==DIM_Q_ZW ) diQu.add(new Static4D(z,w,x,y));
755
                          mAct.get().setNumRedPoints(len+1);
756
                          }
757
                        }
758
                      break;
625 759
        }
626 760
      }
627
    
761

  
628 762
///////////////////////////////////////////////////////////////////////////////////////////////////
629 763

  
630 764
    private void addNewSpeedPoint(long time)
......
653 787
    public boolean onTouchEvent(MotionEvent event)
654 788
      {
655 789
      int action = event.getAction();
656
      int xDown, yDown;
790
      float xDown, yDown;
657 791

  
658 792
      switch(action)
659 793
        {
660
        case MotionEvent.ACTION_DOWN: xDown = (int)event.getX();
661
                                      yDown = (int)event.getY();
662
                                      
794
        case MotionEvent.ACTION_DOWN: xDown = event.getX();
795
                                      yDown = event.getY();
796

  
663 797
                                      addNewPoint(xDown,yDown);
664
                                    
798

  
665 799
                                      break;
666 800
        case MotionEvent.ACTION_MOVE: if( mMoving >=0 )
667 801
                                        {
668
                                        xDown = (int)event.getX();
669
                                        yDown = (int)event.getY();
802
                                        xDown = event.getX();
803
                                        yDown = event.getY();
670 804
                                        
671 805
                                        switch(currentDim)
672 806
                                          {
......
682 816
                                                         break;
683 817
                                          case DIM_4DZW: di4D.setPoint(mMoving, (int)di4D.getPoint(mMoving).get1(), (int)di4D.getPoint(mMoving).get2(), xDown, yDown);
684 818
                                                         break;
819
                                          case DIM_Q_XY: float min1 = QUAT_QUOT* (halfScreenWidth<halfScreenHeight ? halfScreenWidth:halfScreenHeight );
820
                                                         float x1 = (xDown - halfScreenWidth ) / min1;
821
                                                         float y1 = (yDown - halfScreenHeight) / min1;
822
                                                         float z1 = diQu.getPoint(mMoving).get3();
823
                                                         float w1 = diQu.getPoint(mMoving).get4();
824
                                                         float len1 = x1*x1 + y1*y1;
825

  
826
                                                         if( len1 <= 1.0f )
827
                                                           {
828
                                                           float len2 = z1*z1 + w1*w1;
829

  
830
                                                           if( len2 == 0 )
831
                                                             {
832
                                                             if( len1 == 0 )
833
                                                               {
834
                                                               w1 = 1.0f;
835
                                                               }
836
                                                             else
837
                                                               {
838
                                                               float B = (float)Math.sqrt(len1);
839
                                                               x1 = x1/B;
840
                                                               y1 = y1/B;
841
                                                               }
842
                                                             }
843
                                                           else
844
                                                             {
845
                                                             float A = (float)Math.sqrt((1.0f - len1)/len2);
846
                                                             z1 = A*z1;
847
                                                             w1 = A*w1;
848
                                                             }
849
                                                           }
850
                                                         else
851
                                                           {
852
                                                           float B = (float)Math.sqrt(len1);
853
                                                           x1 = x1/B;
854
                                                           y1 = y1/B;
855
                                                           z1 = 0.0f;
856
                                                           w1 = 0.0f;
857
                                                           }
858
                                                         diQu.setPoint(mMoving, x1,y1,z1,w1);
859
                                                         break;
860
                                          case DIM_Q_ZW: float min2 = QUAT_QUOT* (halfScreenWidth<halfScreenHeight ? halfScreenWidth:halfScreenHeight );
861
                                                         float x2 = diQu.getPoint(mMoving).get1();
862
                                                         float y2 = diQu.getPoint(mMoving).get2();
863
                                                         float z2 = (xDown - halfScreenWidth ) / min2;
864
                                                         float w2 = (yDown - halfScreenHeight) / min2;
865
                                                         float len3 = z2*z2 + w2*w2;
866

  
867
                                                         if( len3 <= 1.0f )
868
                                                           {
869
                                                           float len4 = x2*x2 + y2*y2;
870

  
871
                                                           if( len4 == 0 )
872
                                                             {
873
                                                             if( len3 == 0 )
874
                                                               {
875
                                                               w2 = 1.0f;
876
                                                               }
877
                                                             else
878
                                                               {
879
                                                               float B = (float)Math.sqrt(len3);
880
                                                               z2 = z2/B;
881
                                                               w2 = w2/B;
882
                                                               }
883
                                                             }
884
                                                           else
885
                                                             {
886
                                                             float A = (float)Math.sqrt((1.0f - len3)/len4);
887
                                                             x2 = A*x2;
888
                                                             y2 = A*y2;
889
                                                             }
890
                                                           }
891
                                                         else
892
                                                           {
893
                                                           float B = (float)Math.sqrt(len3);
894
                                                           x2 = 0.0f;
895
                                                           y2 = 0.0f;
896
                                                           z2 = z2/B;
897
                                                           w2 = w2/B;
898
                                                           }
899
                                                         diQu.setPoint(mMoving, x2,y2,z2,w2);
900
                                                         break;
685 901
                                          }
686 902
                                        }                           
687 903
                                      break;

Also available in: Unified diff