[JAVA] Klasa Kolory...

ŚwIeRsZcZ
Użytkownik
Użytkownik
Posty: 232
Rejestracja: 8 paź 2006, o 16:21
Płeć: Mężczyzna
Lokalizacja: Wawa
Podziękował: 121 razy
Pomógł: 1 raz

[JAVA] Klasa Kolory...

Post autor: ŚwIeRsZcZ » 30 lis 2008, o 12:14

Kod: Zaznacz cały

Zdefiniuj klasę  Kolor, posiadającą następujące możliwości:

   1. Składowe RGB koloru będą pamiętane na prywatnych atrybutach klasy i mogą przyjmować wartości 0..255;
   2. Konstruktory:
          * Kolor(int r, int g, int b) pobierający składniki RGB koloru.
          * Kolor(double r, double g, double b) pobierający składowe na liczbach z przedziału [0..1).
   3. Metody (publiczne):
          * int getRed(), int getBlue(), int getGreen() - pobierające składowe RGB koloru.
          * void setRed(int r), void setGreen(int g), void setBlue(int b) - ustalające składowe RGB koloru.
          * Zwracające zmodyfikowaną wersję koloru: Kolor jaśniej(), Kolor ciemniej(), Kolor nałóż(Kolor k).
          * Dodatkowe: boolean equals(Kolor k), String toString().
   4. Publiczne stałe statyczne, definiujące podstawowe kolory: biały, czarny, czerwony, zielony, niebieski, żółty itp. (muszą one być jakoś zainicjowane).

Wszystkie zadania umieść w pakiecie o nazwie prg.kolory
Za pomoc w napisaniu tej klasy dziękuję + .

smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[JAVA] Klasa Kolory...

Post autor: smiechowiec » 30 lis 2008, o 22:07

Należy zdefiniować w jaki sposób dokonać konwersji z liczby zmiennoprzecinkowej na int

Kod: Zaznacz cały

public class Kolor {
//   1. Składowe RGB koloru będą pamiętane na prywatnych atrybutach klasy 
//  i mogą przyjmować wartości 0..255;
  private int r = 0;
  private int g = 0;
  private int b = 0;
  private int ton = 10; // o jaką wartość zwiększamy/zmniejszamy barwy 
//   4. Publiczne stałe statyczne, definiujące podstawowe kolory: 
// biały, czarny, czerwony, zielony, niebieski, żółty itp. (muszą one być jakoś zainicjowane).
  public static Kolor biały = new Kolor(255, 255, 255);
  public static Kolor czarny = new Kolor(255, 255, 255);
  public static Kolor czerwony = new Kolor(255, 0, 0);
  public static Kolor zielony = new Kolor(0, 255, 0);
  public static Kolor żółty = new Kolor(255, 255, 0);
    
  public static int zakres (int z) {
    z = z % 256;
    if (z < 0)
      z = 256 + z;
    return z;
  }
  
  private int min(int a, int b) {
    if (a < b)
      return a;
    else return b;
  }

  private int max(int a, int b) {
    if (a > b)
      return a;
    else return b;
  }
  
//   2. Konstruktory:
//  * Kolor(int r, int g, int b) pobierający składniki RGB koloru.
  public Kolor(int r, int g, int b) {
    this.r = zakres(r);
    this.g = zakres(g);
    this.b = zakres(b);
  }
//   * Kolor(double r, double g, double b) pobierający składowe na liczbach z przedziału [0..1).
// Uwaga należy zdefiniować w jaki sposób dokonać konwersji z liczby zmiennoprzecinkowej na int !!!
  public Kolor(double r, double g, double b) {
    this.r = zakres((int) (256 * r));
    this.g = zakres((int) (256 * g));
    this.b = zakres((int) (256 * b));
  }
//   3. Metody (publiczne):
//          * int getRed(), int getBlue(), int getGreen() - pobierające składowe RGB koloru.
  int getRed() {
    return r;
  }
  int getGreen() {
    return g;
  }
  int getBlue() {
    return b;
  }
//          * void setRed(int r), void setGreen(int g), void setBlue(int b) - ustalające składowe RGB koloru.
void setRed(int r) {
  this.r = zakres(r);
} 
void setGreen(int g) {
  this.g = zakres(g);
} 
void setBlue(int b) {
  this.b = zakres(b);
} 
//          * Zwracające zmodyfikowaną wersję koloru: Kolor jaśniej(), Kolor ciemniej(), Kolor nałóż(Kolor k).
Kolor jaśniej() {
  return new Kolor(min(r + ton, 255), min(g + ton, 255), min(b + ton, 255));
}
// rozjaśniamy każdy koloro o wartość ton
Kolor ciemniej() {
  return new Kolor(max(r - ton, 0), max(g - ton, 0), max(b - ton, 0));
}
// zciemniamy każdy koloro o wartość ton
Kolor nałóż(Kolor k) {
  return new Kolor((this.r + k.r) % 256, (this.g + k.g) % 256, (this.b + k.b) % 256);
}

// * Dodatkowe: boolean equals(Kolor k), String toString().
boolean equals(Kolor k) {
  return ((this.r == k.r) && (this.g == k.g) && (this.b == k.b));
}

public String toString() {
  String s = "(" + r + ", " + g + ", " + b + ")";
  return s;
}
  
   public static void main(String[] args) {
     Kolor k = new Kolor(0.01, 0.12, 0.2);
     k = k.nałóż( new Kolor(1, 10, 100));
     System.out.println(k);
  }
   
}

soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1822 razy

[JAVA] Klasa Kolory...

Post autor: soku11 » 30 lis 2008, o 22:15

Nie znam sie na Javie (moze kiedys...), widze skladnia podobna do C++.
I chcialem sie przyczepic do typu zmiennych kolorow. Czy nie ma czegos mniejszego niz int (pewnie 4 bajty), np 1 bajtowego unsigned chara. Wtedy by nie bylo mozliwosci zeby przekroczyc zakres i nie trzeba by sie bylo motac znakiem itd Pozdrawiam.

smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[JAVA] Klasa Kolory...

Post autor: smiechowiec » 1 gru 2008, o 09:26

Niestety typ byte w java jest do 127 od -128, nie ma typu unsigned, nawet typ znakowy w java ma 2 bajty.
Początkowo chciałem oprzeć zmienne o byte, ale wtedy konwersja na int musi być w 2 strony.
Dając zwykłego inta wystarczy sprawdzać zakres w jedną stronę, odczyt zawsze będzie prawidłowy.
Wszystko zależy od tego czy zależy nam na optymalizacji obszaru pamięci czy szybkości działania czy przejrzystości.

Ogólnie rzecz biorąc java jest jezykiem ograniczonym w stosunku do C++.
Brak możliwości przeciążania operatorów, brak tablic rozumianych w sposób analogiczny co w C++, jedynie wskaźniki, na których nie można wykonywać operacji poza przypisaniem.
W java znacznie trudniej zwolnić pamięć. Programista ma ograniczony wpływ na tzw odśmicacz (garbage collector), więc trzeba bardziej uważać żeby nie wyczerpać dostępnej pamięci, w C++ wystarczy ją zwolnić.

Kod: Zaznacz cały

public class Kolor { 
//   1. Składowe RGB koloru będą pamiętane na prywatnych atrybutach klasy 
//  i mogą przyjmować wartości 0..255; 
  private byte r = 0; 
  private byte g = 0; 
  private byte b = 0; 
  private byte ton = 10; // o jaką wartość zwiększamy/zmniejszamy barwy 
//   4. Publiczne stałe statyczne, definiujące podstawowe kolory: 
// biały, czarny, czerwony, zielony, niebieski, żółty itp. (muszą one być jakoś zainicjowane). 
  public static Kolor biały = new Kolor(255, 255, 255); 
  public static Kolor czarny = new Kolor(255, 255, 255); 
  public static Kolor czerwony = new Kolor(255, 0, 0); 
  public static Kolor zielony = new Kolor(0, 255, 0); 
  public static Kolor żółty = new Kolor(255, 255, 0); 
  
  
public static int unsignedToInt(byte b) {
    return (int) b & 0xFF;
    }

public static byte IntTounsigned(int i) {
    return (byte) (i & 0xFF);
}

  private int min(int a, int b) { 
    if (a < b) 
      return a; 
    else return b; 
  } 

  private int max(int a, int b) { 
    if (a > b) 
      return a; 
    else return b; 
  } 
  
//   2. Konstruktory: 
//  * Kolor(int r, int g, int b) pobierający składniki RGB koloru. 
  public Kolor(int r, int g, int b) { 
    this.r = IntTounsigned(r); 
    this.g = IntTounsigned(g); 
    this.b = IntTounsigned(b); 
  } 
//   * Kolor(double r, double g, double b) pobierający składowe na liczbach z przedziału [0..1). 
// Uwaga należy zdefiniować w jaki sposób dokonać konwersji z liczby zmiennoprzecinkowej na int !!! 
  public Kolor(double r, double g, double b) { 
    this.r = IntTounsigned((int) (256 * r)); 
    this.g = IntTounsigned((int) (256 * g)); 
    this.b = IntTounsigned((int) (256 * b)); 
  } 
//   3. Metody (publiczne): 
//          * int getRed(), int getBlue(), int getGreen() - pobierające składowe RGB koloru. 
  int getRed() { 
    return unsignedToInt(r); 
  } 
  int getGreen() { 
    return unsignedToInt(g); 
  } 
  int getBlue() { 
    return unsignedToInt(b); 
  } 
//          * void setRed(int r), void setGreen(int g), void setBlue(int b) - ustalające składowe RGB koloru. 
void setRed(int r) { 
  this.r = IntTounsigned(r); 
} 
void setGreen(int g) { 
  this.g = IntTounsigned(g); 
} 
void setBlue(int b) { 
  this.b = IntTounsigned(b); 
} 
//          * Zwracające zmodyfikowaną wersję koloru: Kolor jaśniej(), Kolor ciemniej(), Kolor nałóż(Kolor k). 
// rozjaśniamy każdy koloro o wartość ton 
Kolor jaśniej() { 
  return new Kolor(min(unsignedToInt(r) + ton, 255), min(unsignedToInt(g) + ton, 255), min(unsignedToInt(b) + ton, 255)); 
} 
// zciemniamy każdy koloro o wartość ton 
Kolor ciemniej() { 
  return new Kolor(max(unsignedToInt(r) - ton, 0), max(unsignedToInt(g) - ton, 0), max(unsignedToInt(b) - ton, 0)); 
} 
// Rozjaśnianie światła (nie filtra) powoduje rozjaśnienie
Kolor nałóż(Kolor k) { 
  return new Kolor(max(unsignedToInt(this.r), unsignedToInt(k.r)), 
                   max(unsignedToInt(this.g), unsignedToInt(k.g)),
                   max(unsignedToInt(this.b), unsignedToInt(k.b))); 
} 

// * Dodatkowe: boolean equals(Kolor k), String toString(). 
boolean equals(Kolor k) { 
  return ((this.r == k.r) && (this.g == k.g) && (this.b == k.b)); 
} 

public String toString() { 
  String s = "(" + unsignedToInt(r) + ", " + unsignedToInt(g) + ", " + unsignedToInt(b) + ")"; 
  return s; 
} 
  
   public static void main(String[] args) { 
     Kolor k = new Kolor(200, 200, 200); 
     System.out.println("Kolor : " + k); 
     System.out.println( "Ciemniej : " + k.ciemniej()); 
     System.out.println( "Jaśniej : " + k.jaśniej()); 
     System.out.println( "Kolor drugi : " + new Kolor(1, 10, 100)); 
     System.out.println( "Nałożenie kolorów : " + k.nałóż( new Kolor(1, 10, 100))); 
  } 
    
} 

ODPOWIEDZ