部分集合の束をSVGでお絵かき
- 集合の部分集合はべき集合として、相互に要素の持ち合い関係を有する。要素数nの集合のべき集合(部分集合の集合)はもとの集合そのものと空集合とを併せて、
個。これらの関係は束になっており、そのグラフ表現はこの通り(要素数6の場合)。
- 束については、駆け足シリーズ離散数学の10([href="http://d.hatena.ne.jp/ryamada22/20060520/:title=こちら])を。
- 要素数1、2、3、4、5、6、7のsvgファイルはそれぞれこちら(1、[http://www.genome.med.kyoto-u.ac.jp/kyoto_ref/Lattice/lattice2.svg:title=2]、[http://www.genome.med.kyoto-u.ac.jp/kyoto_ref/Lattice/lattice3.svg:title=3]、[http://www.genome.med.kyoto-u.ac.jp/kyoto_ref/Lattice/lattice4.svg:title=4]、[http://www.genome.med.kyoto-u.ac.jp/kyoto_ref/Lattice/lattice5.svg:title=5]、[http://www.genome.med.kyoto-u.ac.jp/kyoto_ref/Lattice/lattice6.svg:title=6]、[http://www.genome.med.kyoto-u.ac.jp/kyoto_ref/Lattice/lattice7.svg:title=7])。絵で現れないときは、拡張子"svg"でローカル保存してsvg対応ブラウザ等で開け直し。
- svgファイルでの図の作成ソース(細部の整備はしていないのでさんこうまで)は末尾。
- svg関係
- Javaソース
- PowerSet クラス
public class PowerSet {
int[][][] element;
double[][][] location;
int[][][] relation;
int maxcomb;
public PowerSet(int k){
element = Combination.PowerSet(k);
int half=k/2;
System.out.println("k/2 " + half);
maxcomb = Combination.NComb2(k,half);
System.out.println("maxcomb " + maxcomb);
location = new double[element.length][0][2];
for(int i=0;i<element.length;i++){
location[i] = new double[element[i].length][2];
double dif = (double)(element[half].length-element[i].length)/2;
for(int j=0;j<element[i].length;j++){
location[i][j][0]=dif+j;
location[i][j][1]=i;
}
}
relation = new int[element.length-1][0][0];
for(int i=0;i<element.length-1;i++){
relation[i]=new int[element[i].length][element[i+1].length];
for(int j=0;j<location[i].length;j++){
for(int t=0;t<element[i+1].length;t++){
relation[i][j][t]=1;
for(int s=0;s<element[i][j].length;s++){
if(element[i][j][s]!=element[i+1][t][s] &&
element[i][j][s]!=element[i+1][t][s+1]){
relation[i][j][t]=0;
//flag =false;
break;
}
}
}
}
}
}
public static void main(String[] args){
int k=8;
PowerSet ps = new PowerSet(k);
//PowerSet.PrintPowerSetElement(ps,"\t","\n");
//PowerSet.PrintPowerSetLocation(ps,"\t","\n");
//PowerSet.PrintPowerSetRelation(ps,"\t","\n");
String outfile ="out.svg";
String outfileInfo ="info.txt";
BufferedWriter[] bw = new BufferedWriter[2];
bw[0]= null;
bw[1]= null;
Print2FileSVGPowerSet(ps,bw[0],outfile);
Print2FileInfoPowerSet(ps,"\t","\n",bw[1],outfileInfo);
/*
String svg = StringSVGPowerSet(ps);
System.out.println(svg);
*/
}
public static String StringSVGPowerSet(PowerSet ps){
double[] size ={500,500};
double[] viewBoxZero ={-1,-1};
double[] viewBoxLength = {ps.maxcomb-viewBoxZero[0],ps.maxcomb-viewBoxZero[1]};
if(ps.maxcomb<ps.element.length){
viewBoxLength[0]+=(ps.element.length-ps.maxcomb);
viewBoxLength[1]+=(ps.element.length-ps.maxcomb);
}
double r=0.2;
double width = 0.01;
String ret ="";
String objP ="";
String objM ="";
String header = "<?xml version=\"1.0\" standalone=\"yes\" ?>\n";
header += "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n";
header += "<svg width=\""+ size[0] +"\" height=\"" + size[1] +"\" viewBox=\"" + viewBoxZero[0] + " " + viewBoxZero[1] +" " + viewBoxLength[0] + " " + viewBoxLength[1] +"\" xmlns=\"http://www.w3.org/2000/svg\">\n";
String footer = "</svg>\n";
for(int i=0;i<ps.location.length;i++){
for(int j=0;j<ps.location[i].length;j++){
String stP = StringCircle(ps.location[i][j],r);
objP += stP;
}
}
for(int i=0;i<ps.relation.length;i++){
for(int j=0;j<ps.relation[i].length;j++){
for(int k=0;k<ps.relation[i][j].length;k++){
if(ps.relation[i][j][k]==1){
double[] tmp = new double[4];
tmp[0]= ps.location[i][j][0];
tmp[1]= ps.location[i][j][1];
tmp[2]= ps.location[i+1][k][0];
tmp[3]= ps.location[i+1][k][1];
String stM = StringLine(tmp,width);
objM+=stM;
}
}
}
}
ret += header + objM + objP + footer;
return ret;
}
public static void Print2FileSVGPowerSet(PowerSet ps,BufferedWriter bw,String file){
try{
bw = new BufferedWriter(new FileWriter(file));
double[] size ={500,500};
double[] viewBoxZero ={-1,-1};
double[] viewBoxLength = {ps.maxcomb-viewBoxZero[0],ps.maxcomb-viewBoxZero[1]};
if(ps.maxcomb<ps.element.length){
viewBoxLength[0]+=(ps.element.length-ps.maxcomb);
viewBoxLength[1]+=(ps.element.length-ps.maxcomb);
}
double r=0.2;
double width = 0.01;
String ret ="";
String objP ="";
String objM ="";
String header = "<?xml version=\"1.0\" standalone=\"yes\" ?>\n";
header += "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n";
header += "<svg width=\""+ size[0] +"\" height=\"" + size[1] +"\" viewBox=\"" + viewBoxZero[0] + " " + viewBoxZero[1] +" " + viewBoxLength[0] + " " + viewBoxLength[1] +"\" xmlns=\"http://www.w3.org/2000/svg\">\n";
InOut.out3File(bw,header);
String footer = "</svg>\n";
for(int i=0;i<ps.location.length;i++){
for(int j=0;j<ps.location[i].length;j++){
String stP = StringCircle(ps.location[i][j],r);
InOut.out3File(bw,stP);
//objP += stP;
}
}
for(int i=0;i<ps.relation.length;i++){
for(int j=0;j<ps.relation[i].length;j++){
for(int k=0;k<ps.relation[i][j].length;k++){
if(ps.relation[i][j][k]==1){
double[] tmp = new double[4];
tmp[0]= ps.location[i][j][0];
tmp[1]= ps.location[i][j][1];
tmp[2]= ps.location[i+1][k][0];
tmp[3]= ps.location[i+1][k][1];
String stM = StringLine(tmp,width);
InOut.out3File(bw,stM);
//objM+=stM;
}
}
}
}
//ret += header + objM + objP + footer;
//return ret;
InOut.out3File(bw,header);
bw.close();
}catch(IOException e){
System.out.println(e);
}
}
public static void Print2FileInfoPowerSet(PowerSet ps,String sep1,String sep2,BufferedWriter bw,String file){
try{
// PowerSet.PrintPowerSetElement(ps,"\t","\n");
//PowerSet.PrintPowerSetLocation(ps,"\t","\n");
//PowerSet.PrintPowerSetRelation(ps,"\t","\n");
bw = new BufferedWriter(new FileWriter(file));
String pst="Powerset_Element"+sep2;
InOut.out3File(bw,pst);
for(int i=0;i<ps.element.length;i++){
String pst_i="";
for(int j=0;j<ps.element[i].length;j++){
String pst_j="";
for(int t=0;t<ps.element[i][j].length;t++){
pst_j += ps.element[i][j][t] + ",";
}
pst_j += sep1;
InOut.out3File(bw,pst_j);
}
pst_i += sep2;
InOut.out3File(bw,pst_i);
}
String pst2="Powerset_Location"+sep2;
InOut.out3File(bw,pst2);
for(int i=0;i<ps.location.length;i++){
String pst_i="";
for(int j=0;j<ps.location[i].length;j++){
String pst_j="";
for(int t=0;t<ps.location[i][j].length;t++){
pst_j += ps.location[i][j][t] + ",";
}
pst_j += sep1;
InOut.out3File(bw,pst_j);
}
pst_i += sep2;
InOut.out3File(bw,pst_i);
}
String pst3="Powerset_Relation"+sep2;
InOut.out3File(bw,pst2);
for(int i=0;i<ps.relation.length;i++){
String pst_i="";
for(int j=0;j<ps.relation[i].length;j++){
String pst_j="";
for(int t=0;t<ps.relation[i][j].length;t++){
pst_j += ps.relation[i][j][t] + ",";
}
pst_j += sep1;
InOut.out3File(bw,pst_j);
}
pst_i += sep2;
InOut.out3File(bw,pst_i);
}
bw.close();
}catch(IOException e){
System.out.println(e);
}
}
public static String StringLine(double[] d,double width){
/*
* <line x1="100" y1="300" x2="300" y2="100"
stroke-width="5" />
*/
String ret="<line x1=\"";
ret += d[0]+"\" y1=\""+d[1]+"\" x2=\"" +d[2] +"\" y2=\"" +d[3] + "\"";
ret += " stroke=\"black\" stroke-width=\"" + width + "\" ";
//ret += "black";
ret += "/>\n";
return ret;
}
public static String StringCircle(double[] d,double r){
/*
* <circle cx="600" cy="200" r="100"
fill="red" stroke="blue" stroke-width="10" />
*/
String ret="<circle cx=\"";
ret += d[0]+"\" cy=\""+d[1]+"\" r=\"" +r +"\"";
ret += " stroke=\"none\" stroke-width=\"0\" fill=\"";
ret += "black";
ret += "\"/>\n";
return ret;
}
public static void PrintPowerSetRelation(PowerSet ps, String sep1, String sep2){
String ret = StringPowerSetRelation(ps,sep1,sep2);
System.out.println(ret);
}
public static String StringPowerSetRelation(PowerSet ps, String sep1, String sep2){
String pst="Powerset_Relation"+sep2;
for(int i=0;i<ps.relation.length;i++){
for(int j=0;j<ps.relation[i].length;j++){
for(int t=0;t<ps.relation[i][j].length;t++){
pst += ps.relation[i][j][t] + ",";
}
pst += sep1;
}
pst += sep2;
}
return pst;
}
public static void PrintPowerSetLocation(PowerSet ps, String sep1, String sep2){
String ret = StringPowerSetLocation(ps,sep1,sep2);
System.out.println(ret);
}
public static String StringPowerSetLocation(PowerSet ps, String sep1, String sep2){
String pst="Powerset_Location"+sep2;
for(int i=0;i<ps.location.length;i++){
for(int j=0;j<ps.location[i].length;j++){
for(int t=0;t<ps.location[i][j].length;t++){
pst += ps.location[i][j][t] + ",";
}
pst += sep1;
}
pst += sep2;
}
return pst;
}
public static void PrintPowerSetElement(PowerSet ps, String sep1, String sep2){
String ret = StringPowerSetElement(ps,sep1,sep2);
System.out.println(ret);
}
public static String StringPowerSetElement(PowerSet ps, String sep1, String sep2){
String pst="Powerset_Element"+sep2;
for(int i=0;i<ps.element.length;i++){
for(int j=0;j<ps.element[i].length;j++){
for(int t=0;t<ps.element[i][j].length;t++){
pst += ps.element[i][j][t] + ",";
}
pst += sep1;
}
pst += sep2;
}
return pst;
}
}