//fixed 14.01.2017,20.04.2017 am | |||||
class IntList{ | |||||
int [] data; | |||||
int len =0; | |||||
IntList(int len) { | |||||
data = new int[Math.max(2,len)]; | |||||
} | |||||
IntList() { | |||||
data = new int[16]; // some default size | |||||
} | |||||
void add(int elem) { | |||||
if (len == data.length) { | |||||
int [] b = new int [data.length*2]; | |||||
System.arraycopy(data,0, b,0,len); | |||||
//for (int i = 0; i < len; i++) b[i] = data[i]; | |||||
data = b; | |||||
} | |||||
data[len++] = elem; | |||||
}// end add | |||||
// adds IntList other to this IntList as last part | |||||
void append (IntList other) { | |||||
if ( len + other.len > data.length) { | |||||
int newLen = Math.max(2*len,len + 2*other.len); | |||||
int [] b = new int [newLen]; | |||||
System.arraycopy(data,0,b,0,len); | |||||
data = b; | |||||
} | |||||
System.arraycopy(other.data,0, data, len, other.len); | |||||
len += other.len; | |||||
} // end join other Intlist to this IntList | |||||
void clear(){ | |||||
len =0; | |||||
} // end clear; | |||||
int get (int pos){ | |||||
if (pos > len-1 ) return -1; else return data [pos]; | |||||
}//end get | |||||
int size() { | |||||
return len; | |||||
}//end size | |||||
} // end class IntList |
class Main { | |||||
public static void main(String[] args) { | |||||
if (args.length != 1) { | |||||
System.out.println("Usage: java Main <n>"); | |||||
System.exit(1); | |||||
} | |||||
} | |||||
} |
import java.util.Random; | |||||
/** | |||||
* Class NPunkter17 for aa finne n tilfeldige, ulike punkter i x,y-planet | |||||
* ver 7.mai 2015. Reworked to get not cohyll be a square for lage n | |||||
************************************************************************/ | |||||
public class NPunkter17 { | |||||
Random r; | |||||
int n; | |||||
byte [] bitArr; | |||||
static int maxXY, xShift =3; | |||||
int scaleFactor = 3; // scaleFactor * scaleFactor * n= antall mulige punkter i planet (her: 3*n) | |||||
final int [] bitMask ={1,2,4,8,16,32,64,128}; | |||||
int xCentre =0,yCentre=0, maxVal; | |||||
NPunkter17(int n) { | |||||
this.n =n; | |||||
maxXY = Math.max(10,(int) Math.sqrt(n) * scaleFactor); // største X og Y verdi | |||||
while ((1<<xShift) < maxXY) xShift++; | |||||
xShift = xShift - 3; // 8 bits per byte | |||||
bitArr = new byte[(maxXY<<xShift |(maxXY>>3)) + 1]; | |||||
r = new Random(123); | |||||
// added to get more 'roundish' set of points | |||||
for (int i = 1 ; i <=20 ; i++){ | |||||
xCentre += r.nextInt(maxXY); | |||||
yCentre += r.nextInt(maxXY); | |||||
} | |||||
xCentre /= 20; | |||||
yCentre /= 20; | |||||
maxVal = (int)(xCentre*1.33); | |||||
} | |||||
private void setUsed(int x, int y) { | |||||
bitArr[(x<<xShift) | (y >>3)] |= bitMask[(y&7)]; | |||||
} | |||||
private boolean used (int x, int y) { | |||||
return (bitArr[(x<<xShift) | (y >>3)] & bitMask[y&7]) != 0; | |||||
} | |||||
public void fyllArrayer(int [] x, int[] y) { | |||||
int next =0; | |||||
int xval, yval; | |||||
// new 2017 | |||||
while (next < n) { | |||||
do{ | |||||
xval = r.nextInt(maxXY)+1; | |||||
yval = r.nextInt(maxXY)+1; | |||||
} while (used (xval, yval) || | |||||
Math.abs(xval-xCentre) +Math.abs(yval-yCentre) > maxVal); | |||||
x[next] = xval; | |||||
y[next] = yval; | |||||
setUsed (xval,yval); | |||||
next++; | |||||
} // next point | |||||
}// end fyllArrayer | |||||
public IntList lagIntList() { | |||||
IntList res = new IntList(n); | |||||
for (int i= 0; i <n; i++) res.add(i); | |||||
return res; | |||||
}// end fyllArrayer | |||||
} // end class NPunkter |
abstract class Oblig4 { | |||||
// Required for TegnUt | |||||
public int x[]; | |||||
public int y[]; | |||||
public int n; | |||||
public int MAX_Y; | |||||
public int MAX_X; | |||||
NPunkter17 points; | |||||
Oblig4(NPunkter17 points) { | |||||
this.points = points; | |||||
} | |||||
abstract void solve(); | |||||
} |
class Parallel extends Oblig4 { | |||||
void solve() { | |||||
System.out.println("Solving in parallel"); | |||||
} | |||||
} |
class Sequential extends Oblig4 { | |||||
void solve() { | |||||
System.out.println("Solving sequentially"); | |||||
} | |||||
} |
import java.util.*; | |||||
import javax.swing.*; | |||||
import java.awt.*; | |||||
/** | |||||
* Klasse for aa tegne et punktsett med n punkter (Helst n < 200) og | |||||
* den konvekse innhyllinga i IntList CoHull, koordinatene i d.x[] og d.y[] | |||||
* ver 7.mai 2015, 2016,2017 | |||||
******************************************************************************/ | |||||
class TegnUt extends JFrame{ | |||||
Oblig4 d; | |||||
IntList theCoHull; | |||||
int n, MAX_Y; | |||||
int [] x,y; | |||||
TegnUt(Oblig4 d, IntList CoHull, String s ){ | |||||
theCoHull = CoHull; | |||||
this.d =d; | |||||
x = d.x; | |||||
y = d.y; | |||||
n = d.n; | |||||
MAX_Y = d.MAX_Y; | |||||
size = 500; | |||||
margin = 50; | |||||
scale =size/d.MAX_X +0.8; | |||||
setTitle("Oblig4, num points:"+n+" "+s); | |||||
grafen = new Graph(); | |||||
getContentPane().add(grafen, BorderLayout.CENTER); | |||||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |||||
pack(); | |||||
setVisible(true); | |||||
// angir foretrukket storrelse paa dette lerretet. | |||||
setPreferredSize(new Dimension(d.MAX_X+2*margin,d.MAX_Y+2*margin)); | |||||
} | |||||
Graph grafen; | |||||
int size , margin; | |||||
double scale ; | |||||
class Graph extends JPanel { | |||||
void drawPoint(int p, Graphics g) { | |||||
int SIZE =7; | |||||
if (n <= 50) g.drawString(p+"("+x[p]+","+y[p]+")",xDraw(x[p])-SIZE/2,yDraw(y[p])-SIZE/2); | |||||
else if (n <= 200)g.drawString(p+"",xDraw(x[p])-SIZE/2,yDraw(y[p])-SIZE/2); | |||||
g.drawOval (xDraw(x[p])-SIZE/2,yDraw(y[p])-SIZE/2,SIZE,SIZE); | |||||
g.fillOval (xDraw(x[p])-SIZE/2,yDraw(y[p])-SIZE/2,SIZE,SIZE); | |||||
} | |||||
Graph() { | |||||
setPreferredSize(new Dimension(size+2*margin+10,size+2*margin+10)); | |||||
} | |||||
int xDraw(int x){return (int)(x*scale)+ margin ;} | |||||
int yDraw(int y){return (int)((MAX_Y-y)*scale+margin);} | |||||
public void paintComponent(Graphics g) { | |||||
super.paintComponent(g); | |||||
g.setColor(Color.black); | |||||
for (int i = 0; i < n; i++){ | |||||
drawPoint(i,g); | |||||
} | |||||
g.setColor(Color.red); | |||||
// draw cohull | |||||
int x2 = x[theCoHull.get(0)], y2 = y[theCoHull.get(0)],x1,y1; | |||||
for (int i = 1; i < theCoHull.size(); i++){ | |||||
y1 = y2; x1=x2; | |||||
x2 = x[theCoHull.get(i)]; | |||||
y2 = y[theCoHull.get(i)]; | |||||
g.drawLine (xDraw(x1),yDraw(y1), xDraw(x2),yDraw(y2)); | |||||
} | |||||
g.drawLine (xDraw(x[theCoHull.get(theCoHull.size()-1)]), | |||||
yDraw(y[theCoHull.get(theCoHull.size()-1)]), | |||||
xDraw(x[theCoHull.get(0)]),yDraw(y[theCoHull.get(0)])); | |||||
} // end paintComponent | |||||
} // end class Graph | |||||
}// end class DT |