3D-Objekte/Bounding-Box

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 3D-Objekte/Bounding-Box

    Hier eine erste lauffähige Version der Aufgabe für Donnerstag. Bin mir allerdings nicht ganz sicher, ob es das ist, was Herr Schwanecke will. Der Zylinder kann nur senkrecht zur x-Achse gesetzt werden. Wäre interessant, was ihr so für Lösungen habt...

    Quellcode

    1. package Aufgabe02;
    2. import java.util.*;
    3. /**
    4. * Programmieren 2, II.Semester / FH-Wiesbaden<br>
    5. * Uebung03/Aufgabe02<br>
    6. * Programm zur repraesentation von dreidimensionalen Objekten<br>
    7. * getestet mit WinXP(Servicepack 2)/ Fedora Core
    8. *
    9. * @author Sebastian Schmitt
    10. * @version 1.0
    11. */
    12. public class Obj3d {
    13. /**
    14. * @param args
    15. * Kommandozeilenparameter
    16. */
    17. public static void main(String[] args) {
    18. Scanner sc = new Scanner(System.in);
    19. System.out.print("bitte waehlen: \n1)Kugel \n2)Wuerfel \n3)Zylinder :");
    20. int auswahl = Integer.parseInt(sc.next());
    21. if (auswahl == 1) { // Kugel
    22. Kugel k = new Kugel();
    23. System.out.print("x-Koordinate des Kreismittelpunktes:");
    24. k.setzeX(Integer.parseInt(sc.next()));
    25. System.out.print("y-Koordinate des Kreismittelpunktes:");
    26. k.setzeY(Integer.parseInt(sc.next()));
    27. System.out.print("z-Koordinate des Kreismittelpunktes:");
    28. k.setzeZ(Integer.parseInt(sc.next()));
    29. System.out.print("Radius des Kreises:");
    30. k.setzeR(Integer.parseInt(sc.next()));
    31. System.out.println(k);
    32. }
    33. else if (auswahl == 2) { // Wuerfel
    34. Wuerfel w = new Wuerfel();
    35. System.out.print("x-Koordinate des Wuerfelmittelpunktes:");
    36. w.setzeX(Integer.parseInt(sc.next()));
    37. System.out.print("y-Koordinate des Wuerfelmittelpunktes:");
    38. w.setzeY(Integer.parseInt(sc.next()));
    39. System.out.print("z-Koordinate des Wuerfelmittelpunktes:");
    40. w.setzeZ(Integer.parseInt(sc.next()));
    41. System.out.print("Durchmesser des Wuerfels:");
    42. w.setzeD(Integer.parseInt(sc.next()));
    43. System.out.println(w);
    44. }
    45. else { // Zylinder
    46. Zylinder z = new Zylinder();
    47. System.out
    48. .print("x-Koordinate des Mittelpunktes der Grundflaeche:");
    49. z.setzeX(Integer.parseInt(sc.next()));
    50. System.out
    51. .print("y-Koordinate des Mittelpunktes der Grundflaeche:");
    52. z.setzeY(Integer.parseInt(sc.next()));
    53. System.out
    54. .print("z-Koordinate des Mittelpunktes der Grundflaeche:");
    55. z.setzeZ(Integer.parseInt(sc.next()));
    56. System.out.print("Radius des Zylinders:");
    57. z.setzeR(Integer.parseInt(sc.next()));
    58. System.out.print("Hoehe des Zylinders:");
    59. z.setzeH(Integer.parseInt(sc.next()));
    60. System.out.println(z);
    61. }
    62. }
    63. }
    64. abstract class D3Obj {
    65. final float pi = 3.141592654f;
    66. final float vierdrittel = 1.3333333333333f;
    67. double x;
    68. double y;
    69. double z;
    70. double bboxx; // x-
    71. double bboxy; // y-
    72. double bboxz; // z- Koordinate der Bounding-Box
    73. double bboxb; // breite-
    74. double bboxh; // hoehe-
    75. double bboxt; // tiefe der Bounding-Box
    76. void setzeX(double x) {
    77. this.bboxx = x;
    78. }
    79. void setzeY(double y) {
    80. this.bboxy = y;
    81. }
    82. void setzeZ(double z) {
    83. this.bboxz = z;
    84. }
    85. void setzeBreite(double b) {
    86. this.bboxb = b;
    87. }
    88. void setzeHoehe(double h) {
    89. this.bboxh = h;
    90. }
    91. void setzeTiefe(double t) {
    92. this.bboxt = t;
    93. }
    94. String leseOberflaecheBbox() {
    95. double x = 2 * (bboxb * bboxh + bboxb * bboxt + bboxh * bboxt);
    96. return "Oberflaeche: " + x + "\n";
    97. }
    98. String leseVolumenBbox() {
    99. double x = bboxb * bboxh * bboxt;
    100. return "Volumen: " + x + "\n";
    101. }
    102. abstract String leseOberflaeche();
    103. abstract String leseVolumen();
    104. String print() {
    105. return "\nBounding-Box:\n" + "untere Ecke:(" + bboxx + "," + bboxy
    106. + "," + bboxz + ")\n" + "b/h/t: (" + bboxb + "," + bboxh + ","
    107. + bboxt + ")\n" + leseOberflaecheBbox() + leseVolumenBbox();
    108. }
    109. }
    110. class Kugel extends D3Obj {
    111. double radius;
    112. void setzeX(double x) {
    113. this.x = x;
    114. }
    115. void setzeY(double y) {
    116. this.y = y;
    117. }
    118. void setzeZ(double z) {
    119. this.z = z;
    120. }
    121. void setzeR(double r) {
    122. this.radius = r;
    123. super.setzeX(this.x - this.radius);
    124. super.setzeY(this.y - this.radius);
    125. super.setzeZ(this.z - this.radius);
    126. super.setzeBreite(2 * this.radius);
    127. super.setzeHoehe(2 * this.radius);
    128. super.setzeTiefe(2 * this.radius);
    129. }
    130. String leseOberflaeche() {
    131. return "Oberflaeche: " + 4 * pi * (radius * radius) + "\n";
    132. }
    133. String leseVolumen() {
    134. return "Volumen: " + (vierdrittel) * pi * (radius * radius * radius)
    135. + "\n";
    136. }
    137. public String toString() {
    138. return super.print() + "Kugel:\n" + "Koordinaten des Mittelpunktes:("
    139. + x + "," + y + "," + z + ")\n" + "Radius: " + radius + "\n"
    140. + leseOberflaeche() + leseVolumen();
    141. }
    142. }
    143. class Wuerfel extends D3Obj {
    144. double durchmesser;
    145. void setzeX(int x) {
    146. this.x = x;
    147. }
    148. void setzeY(int y) {
    149. this.y = y;
    150. }
    151. void setzeZ(int z) {
    152. this.z = z;
    153. }
    154. void setzeD(int d) {
    155. this.durchmesser = d;
    156. super.setzeX(this.x - this.durchmesser / 2);
    157. super.setzeY(this.y - this.durchmesser / 2);
    158. super.setzeZ(this.z - this.durchmesser / 2);
    159. super.setzeBreite(this.durchmesser);
    160. super.setzeHoehe(this.durchmesser);
    161. super.setzeTiefe(this.durchmesser);
    162. }
    163. String leseOberflaeche() {
    164. return "Oberflaeche: " + 6 * (durchmesser * durchmesser) + "\n";
    165. }
    166. String leseVolumen() {
    167. return "Volumen: " + durchmesser * durchmesser * durchmesser + "\n";
    168. }
    169. public String toString() {
    170. return super.print() + "Wuerfel:\n" + "Koordinaten des Mittelpunktes:("
    171. + x + "," + y + "," + z + ")\n" + "Durchmesser: " + durchmesser
    172. + "\n" + leseOberflaeche() + leseVolumen();
    173. }
    174. }
    175. class Zylinder extends D3Obj {
    176. double radius;
    177. double hoehe;
    178. void setzeX(double x) {
    179. this.x = x;
    180. }
    181. void setzeY(double y) {
    182. this.y = y;
    183. }
    184. void setzeZ(double z) {
    185. this.z = z;
    186. }
    187. void setzeR(double r) {
    188. this.radius = r;
    189. }
    190. void setzeH(double h) {
    191. this.hoehe = h;
    192. super.setzeX(this.x - this.radius);
    193. super.setzeY(this.y - this.radius);
    194. super.setzeZ(this.z - this.radius);
    195. super.setzeBreite(this.radius * 2);
    196. super.setzeHoehe(this.hoehe);
    197. super.setzeTiefe(this.radius * 2);
    198. }
    199. String leseOberflaeche() {
    200. return "Oberflaeche: " + 2 * pi * radius * hoehe + "\n";
    201. }
    202. String leseVolumen() {
    203. return "Volumen: " + pi * radius * radius * hoehe + "\n";
    204. }
    205. public String toString() {
    206. return super.print() + "Wuerfel:\n"
    207. + "Koordinaten des Mittelpunktes der Grundflaeche:(" + x + ","
    208. + y + "," + z + ")\n" + "Radius: " + radius + "\nHoehe: "
    209. + hoehe + "\n" + leseOberflaeche() + leseVolumen();
    210. }
    211. }
    Alles anzeigen
  • Hi!

    Ich bin zwar nicht bei euch im Studiengang aber die Aufgaben mach ich ganz gerne mit :)

    Die Aufgabenstellung an sich fand ich allgemein ein wenig schwammig.
    Mir ist aufgefallen dass im dargestellten Beispiel das Koordinatensystem nicht ganz stimmt. Nach dem Koordinatensystem auf Wikipedia.de (http://de.wikipedia.org/wiki/Koordinatensystem) müßte die linke untere Ecke für das Kugel-Beispiel den Z-Wert 1 (also positiv) und nicht -1 haben.
    Vielleicht habe ich aber auch nur die Aufgabenstellung nicht ganz verstanden :wink:

    Für speziell dein Beispiel noch zwei Tipps:
    Die Kreiszahl PI ist eine Konstante der Klasse Math, du kannst sie also direkt über Math.PI ansprechen.


    edit: hab mich vertan Math.pow(zahl1,zahl2) ist nur der ausdruck in java für zahl1^zahl2, sorry!
    :oops:

    4/3 könntest du in der berechnung der double zahl mit (4d/3d) ausdrücken, wenn du (4/3) schreibst versteht der compiler das nicht weil die zahlen 4 und 3 vom typ int wären.
  • hi,

    wenn ich fragen darf: wer bist du dann? Das Aufgabenblatt hast du?
    Bei der Gelegenheit...
    meldet euch doch ALLE mal im Who is Who-Thread und stellt euch vor

    Quellcode

    1. /**
    2. * @author Torben Brodt
    3. * <p />Bounding Box
    4. * <p />Funktioniert ab Java 1.5
    5. */
    6. import java.util.*;
    7. public class A03_Bounding_Box {
    8. public static void main(String[] args) {
    9. // Eingabe von Tastatur lesen
    10. Scanner sc = new Scanner(System.in);
    11. int[] queries;
    12. Box objekt;
    13. System.out.print("Bitte waehlen Sie: 1 (Kugel), 2 (Wuerfel), 3 (Zylinder)\t\t: ");
    14. int choice = sc.nextInt();
    15. switch(choice) // Eingaben
    16. {
    17. case 1: // Kugel
    18. queries = queries("Kreismittelpunktes");
    19. System.out.print("Bitte geben Sie den Radius der Kugel ein\t\t\t: ");
    20. queries[3] = sc.nextInt();
    21. objekt = new Kugel(queries[0], queries[1], queries[2], queries[3]);
    22. break;
    23. case 2: // Wuerfel
    24. queries = queries("Wuerfelmittelpunktes");
    25. System.out.print("Bitte geben Sie die Laenge des Wuerfels ein\t\t\t: ");
    26. queries[3] = sc.nextInt();
    27. objekt = new Wuerfel(queries[0], queries[1], queries[2], queries[3]);
    28. break;
    29. case 3: // Zylinder
    30. queries = queries("Zylindermittelpunktes");
    31. System.out.print("Bitte geben Sie den Radius des Zylinders ein\t\t\t: ");
    32. queries[3] = sc.nextInt();
    33. System.out.print("Bitte geben Sie die Hoehe des Zylinders ein\t\t\t: ");
    34. queries[4] = sc.nextInt();
    35. objekt = new Zylinder(queries[0], queries[1], queries[2], queries[3], queries[4]);
    36. break;
    37. default:
    38. System.out.println("Fehler bei der Eingabe");
    39. objekt = new Kugel(1,1,1,1); //Damit mir Eclipse keine Fehler zeigt
    40. System.exit(0);
    41. }
    42. System.out.println(objekt);
    43. }
    44. /**
    45. * Stellt ein paar Standardfragen
    46. * @param input -> Füllt den Platzhalter in der Frage
    47. * @return -> gibt ein 5er Array mit den 3 vorselektierten Antworten zurück
    48. */
    49. static int[] queries(String input) {
    50. int[] queries = new int[5];
    51. Scanner sc = new Scanner(System.in);
    52. System.out.print("Bitte geben Sie die x-Koordinate des "+input+" ein\t: ");
    53. queries[0] = sc.nextInt();
    54. System.out.print("Bitte geben Sie die y-Koordinate des "+input+" ein\t: ");
    55. queries[1] = sc.nextInt();
    56. System.out.print("Bitte geben Sie die z-Koordinate des "+input+" ein\t: ");
    57. queries[2] = sc.nextInt();
    58. return queries;
    59. }
    60. }
    61. /**
    62. * abstrakte Bounding Box Hauptklasse
    63. * @author tbr
    64. */
    65. abstract class Box {
    66. private int x, y, z;
    67. private int centerx, centery, centerz;
    68. protected int hoehe, breite, tiefe;
    69. //Abstrakte Funktionen, die in den abgeleiteten Klassen vorkommen müssen
    70. abstract String leseOberflaeche();
    71. abstract String leseVolumen();
    72. //SET
    73. void setzeX(int x) {
    74. this.x = x;
    75. }
    76. void setzeY(int y) {
    77. this.y = y;
    78. }
    79. void setzeZ(int z) {
    80. this.z = z;
    81. }
    82. void setzeBreite(int breite) {
    83. this.breite = breite;
    84. }
    85. void setzeHoehe(int hoehe) {
    86. this.hoehe = hoehe;
    87. }
    88. void setzeTiefe(int tiefe) {
    89. this.tiefe = tiefe;
    90. }
    91. void setzeMittelpunkt(int centerx, int centery, int centerz) {
    92. this.centerx = centerx;
    93. this.centery = centery;
    94. this.centerz = centerz;
    95. }
    96. //GET
    97. String leseBreite() {
    98. return "\nBreite\t\t\t: "+this.breite;
    99. }
    100. String leseHoehe() {
    101. return "\nHoehe\t\t\t\t: "+this.hoehe;
    102. }
    103. String leseTiefe() {
    104. return "\nTiefe\t\t\t: "+this.tiefe;
    105. }
    106. String leseMittelpunkt() {
    107. return "\nKoordinaten des Mittelpunkts\t: ("+centerx+","+centery+","+centerz+")";
    108. }
    109. String round(double decimal) {
    110. return ""+(Math.round(decimal * 100000) / 100000.);
    111. }
    112. // Konstruktor
    113. public Box(int x, int y, int z) {
    114. this.x = x;
    115. this.y = y;
    116. this.z = z;
    117. }
    118. // Ueberschreibt die Stringkonvertierung
    119. public String toString() {
    120. return "---" +
    121. "\nBounding-Box:" +
    122. "\nKoordinaten der \"unteren\" Ecke\t: ("+this.x+","+this.y+","+this.z+")" +
    123. "\nHoehe, Breite, Tiefe\t\t: ("+this.hoehe+","+this.breite+","+this.tiefe+")" +
    124. "\nOberflaeche\t\t\t: "+2*(this.hoehe*this.breite + this.hoehe*this.tiefe + this.breite*this.tiefe)+
    125. "\nVolumen\t\t\t\t: "+(this.hoehe*this.breite*this.tiefe);
    126. }
    127. }
    128. class Kugel extends Box {
    129. int radius;
    130. // die abstrakte Funktion der Basisklasse
    131. String leseOberflaeche() {
    132. return "\nOberflaeche\t\t\t: " + round(4 * Math.PI * radius * radius);
    133. }
    134. // abstrakte Funktion der Basisklasse
    135. String leseVolumen() {
    136. return "\nVolumen\t\t\t\t: " + round((4d/3d) * Math.PI * radius*radius*radius);
    137. }
    138. String leseRadius() {
    139. return "\nRadius\t\t\t\t: "+this.radius;
    140. }
    141. void setzeRadius(int radius) {
    142. this.radius = radius;
    143. }
    144. // Ueberschreibt die Stringkonvertierung (ruft auch die Funktion der Basisklasse auf)
    145. public String toString() {
    146. return super.toString() + "\n\nKugel:" +
    147. leseMittelpunkt() + leseRadius() + leseOberflaeche() + leseVolumen();
    148. }
    149. // Konstruktor
    150. public Kugel(int x, int y, int z, int radius) {
    151. super(x-radius, y-radius, z-radius);
    152. setzeMittelpunkt(x,y,z);
    153. setzeRadius(radius);
    154. setzeBreite(2*radius); // Durchmesser
    155. setzeHoehe(2*radius); // Durchmesser
    156. setzeTiefe(2*radius); // Durchmesser
    157. }
    158. }
    159. class Wuerfel extends Box {
    160. int laenge;
    161. String leseOberflaeche() {
    162. return "\nOberflaeche\t\t\t: " + round(6*laenge*laenge);
    163. }
    164. String leseVolumen() {
    165. return "\nVolumen\t\t\t\t: " + round(laenge*laenge*laenge);
    166. }
    167. String leseLaenge() {
    168. return "\nLaenge\t\t\t\t: "+this.laenge;
    169. }
    170. void setzeLaenge(int laenge) {
    171. this.laenge = laenge;
    172. }
    173. public String toString() {
    174. return super.toString() + "\n\nWuerfel:" +
    175. leseMittelpunkt() + leseLaenge() + leseOberflaeche() + leseVolumen();
    176. }
    177. public Wuerfel(int x, int y, int z, int laenge) {
    178. super(x-laenge/2, y-laenge/2, z-laenge/2);
    179. setzeMittelpunkt(x,y,z);
    180. setzeBreite(laenge);
    181. setzeHoehe(laenge);
    182. setzeTiefe(laenge);
    183. setzeLaenge(laenge);
    184. }
    185. }
    186. class Zylinder extends Box {
    187. int radius;
    188. String leseOberflaeche() {
    189. return "\nOberflaeche\t\t\t: " + round(2 * Math.PI * radius * hoehe + (2*Math.PI * radius*radius));
    190. }
    191. String leseVolumen() {
    192. return "\nVolumen\t\t\t\t: " + round(Math.PI * (radius*radius) * hoehe);
    193. }
    194. String leseRadius() {
    195. return "\nRadius\t\t\t\t: "+this.radius;
    196. }
    197. void setzeRadius(int radius) {
    198. this.radius = radius;
    199. }
    200. public String toString() {
    201. return super.toString() + "\n\nZylinder:" +
    202. leseMittelpunkt() + leseHoehe() + leseRadius() + leseOberflaeche() + leseVolumen();
    203. }
    204. public Zylinder(int x, int y, int z, int radius, int hoehe) {
    205. super(x-radius, y, z-radius);
    206. setzeMittelpunkt(x,y,z);
    207. setzeRadius(radius);
    208. setzeBreite(2*radius); // Durchmesser
    209. setzeHoehe(hoehe);
    210. setzeTiefe(2*radius); // Durchmesser
    211. }
    212. }
    Alles anzeigen