我有这个处理代码可以正常工作,但是对象实例化和case语句有很多重复的代码......在速度/编写代码紧凑性方面有没有更经济的方法呢?
//platonic solids
public Tetrahedron poly0;
public Octahedron poly1;
public Cube poly2;
public Icosahedron poly3;
public Dodecahedron poly4;
//kepler-poinsot solids
public SmallStellatedDodecahedron poly5;
public GreatDodecahedron poly6;
public GreatStellatedDodecahedron poly7;
public GreatIcosahedron poly8;
//archimedean solids
public TruncatedOctahedron poly9;
//versi-regular polyhedra
public Tetrahemihexahedron poly10;
public Cubohemioctahedron poly11;
public Octahemioctahedron poly12;
public SmallDodecahemidodecahedron poly13;
public GreatDodecahemidodecahedron poly14;
public SmallDodecahemicosahedron poly15;
public GreatDodecahemicosahedron poly16;
public SmallIcosihemidodecahedron poly17;
public GreatIcosihemidodecahedron poly18;
//non-regular toroidal solids
public OctagonalIrisToroid poly19;
public float zoom = 0.025;
public int num = 0;
public PFont f;
public void setup(){
size(1000,1000,OPENGL);
lights();
smooth();
frameRate(30);
f = createFont("Arial",24,true);
textFont(f,24);
textAlign(CENTER);
//Instantiate each objects
poly0 = new Tetrahedron();
poly0.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly0.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly1 = new Octahedron();
poly1.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly1.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly2 = new Cube();
poly2.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly2.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly3 = new Icosahedron();
poly3.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly3.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly4 = new Dodecahedron();
poly4.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly4.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly5 = new SmallStellatedDodecahedron();
poly5.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly5.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly6 = new GreatDodecahedron();
poly6.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly6.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly7 = new GreatStellatedDodecahedron();
poly7.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly7.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly8 = new GreatIcosahedron();
poly8.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly8.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly9 = new TruncatedOctahedron();
poly9.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly9.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly10 = new Tetrahemihexahedron();
poly10.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly10.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly11 = new Cubohemioctahedron();
poly11.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly11.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly12 = new Octahemioctahedron();
poly12.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly12.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly13 = new SmallDodecahemidodecahedron();
poly13.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly13.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly14 = new GreatDodecahemidodecahedron();
poly14.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly14.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly15 = new SmallDodecahemicosahedron();
poly15.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly15.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly16 = new GreatDodecahemicosahedron();
poly16.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly16.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly17 = new SmallIcosihemidodecahedron();
poly17.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly17.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly18 = new GreatIcosihemidodecahedron();
poly18.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly18.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly19 = new OctagonalIrisToroid();
poly19.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly19.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
} //end setup()
public void draw(){
background(0);
//camera(width/2, height/2, 300, width/2, height/2, 0, 0, 1, 0);
pointLight(200, 200, 200, width/2, height/2, 200);
ambientLight(102, 102, 102);
spotLight(51, 102, 126, 80, 20, 40, -1, 0, 0, PI/2, 2);
translate(width/2, height/2, 0);
switch(num) {
case 0:
if (mousePressed) {
poly0.rotate(mouseX/100., mouseY/100., 0);
} else {
poly0.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly0.scaleFactor(15000);
poly0.render();
text("Tetrahedron",0,400);
break;
case 1:
if (mousePressed) {
poly1.rotate(mouseX/100., mouseY/100., 0);
} else {
poly1.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly1.scaleFactor(15000);
poly1.render();
text("Octahedron",0,400);
break;
case 2:
if (mousePressed) {
poly2.rotate(mouseX/100., mouseY/100., 0);
} else {
poly2.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly2.scaleFactor(14000);
poly2.render();
text("Cube",0,400);
break;
case 3:
if (mousePressed) {
poly3.rotate(mouseX/100., mouseY/100., 0);
} else {
poly3.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly3.scaleFactor(12000);
poly3.render();
text("Icosahedron",0,400);
break;
case 4:
if (mousePressed) {
poly4.rotate(mouseX/100., mouseY/100., 0);
} else {
poly4.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly4.scaleFactor(6000);
poly4.render();
text("Dodecahedron",0,400);
break;
case 5:
if (mousePressed) {
poly5.rotate(mouseX/100., mouseY/100., 0);
} else {
poly5.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly5.scaleFactor(22000);
poly5.render();
text("Small Stellated Dodecahedron",0,400);
break;
case 6:
if (mousePressed) {
poly6.rotate(mouseX/100., mouseY/100., 0);
} else {
poly6.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly6.scaleFactor(13000);
poly6.render();
text("Great Dodecahedron",0,400);
break;
case 7:
if (mousePressed) {
poly7.rotate(mouseX/100., mouseY/100., 0);
} else {
poly7.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly7.scaleFactor(25000);
poly7.render();
text("Great Stellated Dodecahedron",0,400);
break;
case 8:
if (mousePressed) {
poly8.rotate(mouseX/100., mouseY/100., 0);
} else {
poly8.scaleFactor(22000);
poly8.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly8.render();
text("Great Icosahedron",0,400);
break;
case 9:
if (mousePressed) {
poly9.rotate(mouseX/100., mouseY/100., 0);
} else {
poly9.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly9.render();
text("Truncated Octahedron",0,400);
break;
case 10:
if (mousePressed) {
poly10.rotate(mouseX/100., mouseY/100., 0);
} else {
poly10.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly10.scaleFactor(15000);
poly10.render();
text("Tetrahemihexahedron",0,400);
break;
case 11:
if (mousePressed) {
poly11.rotate(mouseX/100., mouseY/100., 0);
} else {
poly11.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly11.scaleFactor(10000);
poly11.render();
text("Cubohemioctahedron",0,400);
break;
case 12:
if (mousePressed) {
poly12.rotate(mouseX/100., mouseY/100., 0);
} else {
poly12.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly12.scaleFactor(10000);
poly12.render();
text("Octahemioctahedron",0,400);
break;
case 13:
if (mousePressed) {
poly13.rotate(mouseX/100., mouseY/100., 0);
} else {
poly13.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly13.scaleFactor(6000);
poly13.render();
text("Small Dodecahemidodecahedron",0,400);
break;
case 14:
if (mousePressed) {
poly14.rotate(mouseX/100., mouseY/100., 0);
} else {
poly14.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly14.scaleFactor(20000);
poly14.render();
text("Great Dodecahemidodecahedron",0,400);
break;
case 15:
if (mousePressed) {
poly15.rotate(mouseX/100., mouseY/100., 0);
} else {
poly15.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly15.scaleFactor(12000);
poly15.render();
text("Small Dodecahemicosahedron",0,400);
break;
case 16:
if (mousePressed) {
poly16.rotate(mouseX/100., mouseY/100., 0);
} else {
poly16.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly16.scaleFactor(12000);
poly16.render();
text("Great Dodecahemicosahedron",0,400);
break;
case 17:
if (mousePressed) {
poly17.rotate(mouseX/100., mouseY/100., 0);
} else {
poly17.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly17.scaleFactor(7000);
poly17.render();
text("Small Icosihemidodecahedron",0,400);
break;
case 18:
if (mousePressed) {
poly18.rotate(mouseX/100., mouseY/100., 0);
} else {
poly18.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly18.scaleFactor(20000);
poly18.render();
text("Great Icosihemidodecahedron",0,400);
break;
case 19:
if (mousePressed) {
poly19.rotate(mouseX/100., mouseY/100., 0);
} else {
poly19.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly19.scaleFactor(8000);
poly19.render();
text("Octagonal Iris Toroid",0,400);
break;
}
} //end draw()
public void mouseWheel(MouseEvent e) {
zoom += map(e.getCount(), -5, 5, 0.01, -0.01);
zoom = constrain(zoom, 0.001, 0.2);
}
public void keyPressed() {
if (key == CODED) {
if (keyCode == LEFT) {
if (num == 0) {
num = 19;
} else {
num--;
}
}
if (keyCode == RIGHT) {
if (num == 19) {
num = 0;
} else {
num++;
}
}
}
}
更新:在建议之后我做了一些阅读并更新到下面。我创建了一个包含常用方法的Polyhedron抽象类,然后使每种类型的多面体类扩展抽象类。
ArrayList<Polyhedron> polyObjects = new ArrayList<Polyhedron>();
Polyhedron poly;
public float zoom = 0.025;
public int num = 0;
public PFont f;
public void setup(){
size(1000,1000,OPENGL);
lights();
smooth();
frameRate(30);
f = createFont("Arial",24,true);
textFont(f,24);
textAlign(CENTER);
//Instantiate each object
polyObjects.add(new Tetrahedron());
polyObjects.add(new Octahedron());
polyObjects.add(new Cube());
polyObjects.add(new Icosahedron());
polyObjects.add(new Dodecahedron());
polyObjects.add(new SmallStellatedDodecahedron());
polyObjects.add(new GreatDodecahedron());
polyObjects.add(new GreatStellatedDodecahedron());
polyObjects.add(new GreatIcosahedron());
polyObjects.add(new TruncatedOctahedron());
polyObjects.add(new Tetrahemihexahedron());
polyObjects.add(new Cubohemioctahedron());
polyObjects.add(new Octahemioctahedron());
polyObjects.add(new SmallDodecahemidodecahedron());
polyObjects.add(new GreatDodecahemidodecahedron());
polyObjects.add(new SmallDodecahemicosahedron());
polyObjects.add(new GreatDodecahemicosahedron());
polyObjects.add(new SmallIcosihemidodecahedron());
polyObjects.add(new GreatIcosihemidodecahedron());
polyObjects.add(new OctagonalIrisToroid());
for (int i = 0; i < polyObjects.size(); i++) {
poly = polyObjects.get(i);
poly.fillColor(int(random(255)), int(random(255)), int(random(255)), 255);
poly.strokeColor(int(random(255)), int(random(255)), int(random(255)), 255);
}
} //end setup()
public void draw(){
background(0);
//camera(width/2, height/2, 300, width/2, height/2, 0, 0, 1, 0);
pointLight(200, 200, 200, width/2, height/2, 200);
ambientLight(102, 102, 102);
spotLight(51, 102, 126, 80, 20, 40, -1, 0, 0, PI/2, 2);
translate(width/2, height/2, 0);
poly = polyObjects.get(num);
if (mousePressed) {
poly.rotate(mouseX/100., mouseY/100., 0);
} else {
poly.rotate(radians(frameCount%360),radians(frameCount%360),0);
}
poly.scaleFactor(5000);
poly.render();
text(poly.name(),0,400);
} //end draw()
public void mouseWheel(MouseEvent e) {
zoom += map(e.getCount(), -5, 5, 0.01, -0.01);
zoom = constrain(zoom, 0.001, 0.2);
}
public void keyPressed() {
if (key == CODED) {
if (keyCode == LEFT) {
if (num == 0) {
num = 19;
} else {
num--;
}
}
if (keyCode == RIGHT) {
if (num == 19) {
num = 0;
} else {
num++;
}
}
}
}
答案 0 :(得分:0)
使用Inheritance和Polymorphism。这两个面向对象的编程概念应该可以帮助您删除大量的代码大小(因为您将使用方法/函数而不是代码重复)。一旦你使用了这些,你也可以使用Solid
的数组(如果我们要调用那些实体的父类),并进一步简化你的很多代码。使用数组存储text()
调用的参数,您甚至不需要切换案例语句。
以上所有内容只会提高您的代码可理解性和可管理性。它不会影响性能(好的,函数调用的开销很小,但在这种情况下,它没有实际意义)。