University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

NPunkter17.java 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import java.util.Random;
  2. /**
  3. * Class NPunkter17 for aa finne n tilfeldige, ulike punkter i x,y-planet
  4. * ver 7.mai 2015. Reworked to get not cohyll be a square for lage n
  5. ************************************************************************/
  6. public class NPunkter17 {
  7. Random r;
  8. int n;
  9. byte [] bitArr;
  10. static int maxXY, xShift =3;
  11. int scaleFactor = 3; // scaleFactor * scaleFactor * n= antall mulige punkter i planet (her: 3*n)
  12. final int [] bitMask ={1,2,4,8,16,32,64,128};
  13. int xCentre =0,yCentre=0, maxVal;
  14. NPunkter17(int n) {
  15. this.n =n;
  16. maxXY = Math.max(10,(int) Math.sqrt(n) * scaleFactor); // største X og Y verdi
  17. while ((1<<xShift) < maxXY) xShift++;
  18. xShift = xShift - 3; // 8 bits per byte
  19. bitArr = new byte[(maxXY<<xShift |(maxXY>>3)) + 1];
  20. r = new Random(123);
  21. // added to get more 'roundish' set of points
  22. for (int i = 1 ; i <=20 ; i++){
  23. xCentre += r.nextInt(maxXY);
  24. yCentre += r.nextInt(maxXY);
  25. }
  26. xCentre /= 20;
  27. yCentre /= 20;
  28. maxVal = (int)(xCentre*1.33);
  29. }
  30. private void setUsed(int x, int y) {
  31. bitArr[(x<<xShift) | (y >>3)] |= bitMask[(y&7)];
  32. }
  33. private boolean used (int x, int y) {
  34. return (bitArr[(x<<xShift) | (y >>3)] & bitMask[y&7]) != 0;
  35. }
  36. public void fyllArrayer(int [] x, int[] y) {
  37. int next =0;
  38. int xval, yval;
  39. // new 2017
  40. while (next < n) {
  41. do{
  42. xval = r.nextInt(maxXY)+1;
  43. yval = r.nextInt(maxXY)+1;
  44. } while (used (xval, yval) ||
  45. Math.abs(xval-xCentre) +Math.abs(yval-yCentre) > maxVal);
  46. x[next] = xval;
  47. y[next] = yval;
  48. setUsed (xval,yval);
  49. next++;
  50. } // next point
  51. }// end fyllArrayer
  52. public IntList lagIntList() {
  53. IntList res = new IntList(n);
  54. for (int i= 0; i <n; i++) res.add(i);
  55. return res;
  56. }// end fyllArrayer
  57. } // end class NPunkter