This was converted from a C program that used X windows. The C program did the Newton-Raphson to get everything lined up. I just took one solution generated by the C program and hard coded it here.
import java.awt.Graphics; import java.awt.Font; import java.awt.Color; /* Sri Yantra by Jim Kukula */ public class goforit extends java.applet.Applet { double p[][]; double scale; int x0, y0; double radius[]; double wall[][]; public void intersect(double x[], double a1[], double a2[], double b1[], double b2[]) { double sa, sb; sa = (a1[1]-a2[1])/(a1[0]-a2[0]); sb = (b1[1]-b2[1])/(b1[0]-b2[0]); x[0] = (a1[1] - b1[1] + sb*b1[0] - sa*a1[0])/(sb-sa); x[1] = b1[1] + sb*(x[0] - b1[0]); } public void hintersect(double x[], double h[], double b1[], double b2[]) { double r[], s[]; r = new double[2]; s = new double[2]; r[0] = -10.; r[1] = h[1]; s[0] = 10.; s[1] = h[1]; this.intersect(x, s, r, b1, b2); } public void vintersect(double x[], double b1[], double b2[]) { x[0] = 0; x[1] = b1[1] - (b2[1]-b1[1])*b1[0]/(b2[0]-b1[0]); } public void eightfold(double part[][], double whole[][], int cnt) { int i; for(i=0; i<cnt; i++){ whole[i][0] = part[i][0]; whole[i][1] = part[i][1]; } for(i=0; i<cnt; i++){ whole[cnt+i][0] = part[cnt-1-i][0]; whole[cnt+i][1] = -part[cnt-1-i][1]; } for(i=0; i<cnt; i++){ whole[2*cnt+i][0] = -part[i][1]; whole[2*cnt+i][1] = part[i][0]; } for(i=0; i<cnt; i++){ whole[3*cnt+i][0] = part[cnt-1-i][1]; whole[3*cnt+i][1] = part[cnt-1-i][0]; } for(i=0; i<cnt; i++){ whole[4*cnt+i][0] = -part[i][0]; whole[4*cnt+i][1] = -part[i][1]; } for(i=0; i<cnt; i++){ whole[5*cnt+i][0] = -part[cnt-1-i][0]; whole[5*cnt+i][1] = part[cnt-1-i][1]; } for(i=0; i<cnt; i++){ whole[6*cnt+i][0] = part[i][1]; whole[6*cnt+i][1] = -part[i][0]; } for(i=0; i<cnt; i++){ whole[7*cnt+i][0] = -part[cnt-1-i][1]; whole[7*cnt+i][1] = -part[cnt-1-i][0]; } } public void init() { int i; double wp[][]; p = new double[28][2]; wall = new double[40][2]; wp = new double[5][2]; radius = new double[4]; this.scale = 0.6; this.x0 = 300; this.y0 = 300; p[22][0] = 0.; p[22][1] = 200.0; p[21][1] = -p[22][1]*0.280861; p[21][0] = p[22][1]*0.959748; p[19][0] = p[21][0]; p[19][1] = -p[21][1]; p[20][0]= 0.0; p[20][1] = -p[22][1]; this.hintersect(p[13], p[19], p[21], p[22]); this.hintersect(p[17], p[21], p[19], p[20]); p[12][0] = 0.; p[12][1] = p[19][1] + (p[22][1]-p[19][1])/2.8; p[14][0]=0.; p[14][1]=p[20][1] - (p[20][1]-p[21][1])/2.8; this.hintersect(p[26], p[12], p[14], p[13]); this.hintersect(p[16], p[26], p[22], p[21]); p[5][0]=0.; p[5][1]=p[21][1]; this.hintersect(p[10], p[13], p[5], p[16]); this.vintersect(p[18], p[10], p[17]); this.hintersect(p[25], p[18], p[5], p[16]); p[2][0]=0.; p[2][1]=p[10][1]; this.hintersect(p[9], p[21], p[14], p[13]); p[24][0] = p[25][0]*1.2; p[24][1] = p[14][1]; this.vintersect(p[4], p[24], p[9]); this.intersect(p[15], p[4], p[24], p[20], p[19]); this.hintersect(p[23], p[15], p[17], p[18]); p[8][0]=0; p[8][1] = p[23][1]; this.hintersect(p[7], p[4], p[18], p[23]); this.intersect(p[3], p[4], p[24], p[8], p[7]); this.hintersect(p[11], p[3], p[14], p[26]); this.intersect(p[27], p[4], p[24], p[5], p[25]); this.hintersect(p[1], p[27], p[7], p[8]); radius[0] = p[22][1]; radius[1] = (4./3.)*radius[0]; radius[2] = radius[1] + (radius[1]/radius[0])*(1./2.)*(radius[1]-radius[0]); radius[3] = radius[2] + (1./5.)*(radius[2]-radius[1]); wp[0][0] = radius[3]; wp[0][1] = -radius[3]; wp[1][0] = wp[0][0]; wp[1][1] = p[21][1]; wp[2][0] = (13./12.) * wp[1][0]; wp[2][1] = wp[1][1]; wp[3][0] = wp[2][0]; wp[3][1] = 0.5 * wp[0][1]; wp[4][0] = 1.25 * wp[1][0]; wp[4][1] = wp[3][1]; this.eightfold(wp, wall, 5); for(i=0; i<40; i++) System.out.println("x=" + wall[i][0] + ", y=" + wall[i][1]); } public void line(Graphics g, double x1, double y1, double x2, double y2) { int xw1, xw2, yw1, yw2; xw1 = this.x0 + (int)(this.scale*x1); xw2 = this.x0 + (int)(this.scale*x2); yw1 = this.y0 + (int)(this.scale*y1); yw2 = this.y0 + (int)(this.scale*y2); g.drawLine(xw1, yw1, xw2, yw2); } public void circle(Graphics g, double cx, double cy, double r, Color c) { int tcx, tcy, w, h; Color oldc; oldc = g.getColor(); tcx = this.x0 + (int)(this.scale*(cx-r)); tcy = this.y0 + (int)(this.scale*(cy-r)); w = (int)(this.scale*2.0*r); h = w; g.setColor(c); g.fillOval(tcx, tcy, w, h); g.setColor(Color.black); g.drawOval(tcx, tcy, w, h); g.setColor(oldc); } public void triangle(Graphics g, int base, int tip) { this.line(g, -p[base][0], p[base][1], p[base][0], p[base][1]); this.line(g, -p[base][0], p[base][1], p[tip][0], p[tip][1]); this.line(g, p[base][0], p[base][1], p[tip][0], p[tip][1]); } public void polygon(Graphics g, double v[][], int cnt, Color c) { int i; int xi[], yi[]; Color oldc; oldc = g.getColor(); xi = new int[cnt]; yi = new int[cnt]; for(i=0; i<cnt; i++){ xi[i] = this.x0 + (int)(this.scale*v[i][0]); yi[i] = this.y0 + (int)(this.scale*v[i][1]); } g.setColor(c); g.fillPolygon(xi, yi, cnt); g.setColor(Color.black); g.drawPolygon(xi, yi, cnt); g.setColor(oldc); } public void paint (Graphics g) { Color gold = new Color(255, 204, 51); g.setColor(Color.black); setBackground(new Color(0, 102, 102)); this.polygon(g, wall, 40, new Color(102, 0, 51)); this.circle(g, 0.0, 0.0, radius[3], gold); this.circle(g, 0.0, 0.0, radius[2], gold); this.circle(g, 0.0, 0.0, radius[1], gold); this.circle(g, 0.0, 0.0, radius[0], gold); this.circle(g, 0.0, 0.0, 4.0, Color.white); this.triangle(g, 21, 22); this.triangle(g, 19, 20); this.triangle(g, 26, 14); this.triangle(g, 25, 5); this.triangle(g, 24, 4); this.triangle(g, 23, 18); this.triangle(g, 7, 8); this.triangle(g, 11, 12); this.triangle(g, 1, 2); } }