Drehen RGB Würfel

sweti3

Mitglied
Hei Leute. Ich habe einen RGB Farbwürfel programmiert, der alle 16,7 Milionen Farben anzeigt. nun würde ich gerne einen Slider einbauen, mit dem man diesen Würfel drehen kann. Hier hab ich euch mal den Code:

Java:
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;

import javax.swing.JButton;

import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;

import junit.framework.Test;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class NewJFrame extends javax.swing.JFrame {
	private JButton jBuZeichnen;
	

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				NewJFrame inst = new NewJFrame();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public NewJFrame() {
		super();
		initGUI();
	}
	
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				jBuZeichnen = new JButton();
				getContentPane().add(jBuZeichnen);
				jBuZeichnen.setText("Würfel zeichnen");
				jBuZeichnen.setBounds(842, 738, 147, 21);
				jBuZeichnen.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						jBuZeichnenActionPerformed(evt);
					}
				});
			}
			pack();
			this.setSize(1022, 828);
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	private void jBuZeichnenActionPerformed(ActionEvent evt) {
		 
		Graphics g = this.getGraphics();
	       
	      for(int rot=0; rot<=255;rot++){
	    	  for (int i=0; i<=255;i++) {
		           for (int x=0; x<=255;x++) {
		               g.setColor(new Color(rot,255-i,x));
		               g.drawLine(+i+rot*1/2,50+x+rot*1/2,+i+1/2*rot,50+x+rot*1/2);
		               
		            }
		          }
	      
	      }
	       
	      
	       
	       
	       
	       
	    }
	}

Gibt es da einen Befehl dafür oder so etwas ? ich möchte ihn um 180° nach links und um 180° nach rechts verschieben können.

Viele Grüße

sweti3
 
Ne, auf ein Bild.

Java:
private static BufferedImage rotateImage(BufferedImage source, double angle)
{
	double a = Math.toRadians(angle);
	int w = source.getWidth();
	int h = source.getHeight();
	int t = BufferedImage.TYPE_INT_ARGB;

	AffineTransform affineTransform = AffineTransform.getRotateInstance(a, w / 2, h / 2);
	BufferedImage rotatedImage = new BufferedImage(w, h, t);
	Graphics2D g = (Graphics2D) rotatedImage.getGraphics();
	g.setTransform(affineTransform);
	g.drawImage(source, 0, 0, null);
	g.dispose();
	
	return(rotatedImage);
}
 
also bei mir unterstreicht er das [JAVA=42] double a = Math.toRadians(angle);
int w = source.getWidth();
int h = source.getHeight();
int t = BufferedImage.TYPE_INT_ARGB; [/code]

source und angle ?
und sagt:

Code:
source cannot be resolved to a variable
 
Also, hab's mal angestartet... nach wenigen Minuten dürfte der Würfel fertig gezeichnet sein ... falls man nicht die Fenstergröße zwischendurch ändert ( nicht getGraphics auf einer Component aufrufen!!!). Den Würfel "drehen" im Sinne einer Drehung im 3D-Raum wird so nichts.

Beschreib' erstmal was da rauskommen soll. Mit OpenGL wäre das .... vielleicht eher hinzukriegen... Aber etwas aufwändiger als im Moment.
 
Mit einem import hat das wohl nichts zu tun (DEN macht die IDE ja auch automatisch :autsch: 😉 )

Es gibt keine Variable "source". Vermutlich wurde der Inhalt der Methode einfach unmotiviert irgendwo hin kopiert.
 
Bei mir unter Eclipse nicht. Nur wenn ich direkt von einer Datei in eine andere kopiere, selbst wenn das import garnicht nötig wäre. Hab bei meinen Server und Client jeweils 1 Interface. Das Interface definiert nur Konstanten aus einer Klasse für die Kommunikation, und muss deshalb ab und zu abgeglichen werden. Wollte eins davon nicht im Classpath des anderen legen, um komplizierende Abhängigkeiten zu vermeiden. Wenn ich von einen Interface ins andere kopiere fügt er den import des Client der Klasse ein, obwohl sie am Server im selben Verzeichnis wie das Interface liegt und die Package-Hierarchie anderst ist.
Könnte aber auch an den Einstellung liegen. Wenn ich die Methode in eine beliebige Klasse von hier aus kopiere, importiert er nichts.

Aber du hast recht, es gibt in dem Fall keinen Fehler bei dem Variablenzugriff. Hab mir eingebildet, ich hatte schon mal einen. :autsch:
Auf die Möglichkeit, dass er einfach den Inhalt kopiert hat wäre ich so schnell nicht gekommen.
 
Also einfach kopiert hab ich nicht, aber dieses source wird immer angestrichen 🙁 ich möchte es so machen, dass ich den Würfel mit nem Schiebe-Regeler drehen kann, geht das nicht mit eclipse ?:rtfm:
 
Das hat nichts mit Eclipse zu tun. Poste ggf. mal den aktuellen code, wo der Fehler auftritt.

Aber nochmal: Was genau hast du vor? Es kann gut sein, dass das mit diesem Ansatz nichts wird, je nachdem, was genau du vorhast...
 
Also ohne irgentwelche Transformationsmatritzen und Vektoren wird das wohl kaum was. Bedeutet entweder das bereits erwähnte OpenGL im Zweifelsfalle mit Render2Texture oder Softwaremässig selbst implementiert. Für letzteres das Graphics Object in Graphics2D casten und mit AffineTransform arbeiten.

...und zu aller Belustigung 'ne Haarspalterei... Was auf keinen Fall geht: alle 16,78 Millionen Farben auf einem Bildschirm 😉 Denn ein 4:3 Screen der das könnte bräuchte eine Auflösung von mindestens 5120X3840 Pixeln...
 
so hab jetzt den Würfel in 3D hinbekommen, mit rotieren. Jetzt hänge ich daran, die einzelnen Flächen einzufärben... -.- :autsch:

[JAVA=42] import java.awt.*;
import java.applet.*;

public class Wuerfel extends Applet {

// 8 Eckpunkte 1-8
// mit je 3 Koordinaten 1,2,3 (x,y,z)
double p[][] = new double[9][4];

int x=1, y=2, z=3;

public void init() {
setBackground(new Color(255,255,255));

// 8 Eckpunkte im lokalen Würfel-Koordinatensystem
// Nullpunkt = Mittelpunkt
p[1][x] = -100; p[1][y] = -100; p[1][z] = -100;
p[2][x] = +100; p[2][y] = -100; p[2][z] = -100;
p[3][x] = +100; p[3][y] = -100; p[3][z] = +100;
p[4][x] = -100; p[4][y] = -100; p[4][z] = +100;
p[5][x] = -100; p[5][y] = +100; p[5][z] = -100;
p[6][x] = +100; p[6][y] = +100; p[6][z] = -100;
p[7][x] = +100; p[7][y] = +100; p[7][z] = +100;
p[8][x] = -100; p[8][y] = +100; p[8][z] = +100;

// 8 - - - - - 7
// / | / |
// 5 - - - - - 6 |
// | | | |
// | 4 - - - -|- 3
// | / | /
// 1 - - - - - 2
}

// Rotationswinkel in Grad
double angle_x = 0.01;
double angle_y = 0.0075;
double angle_z = 0.005;

Image buffer;
Graphics2D gBuffer;

public void paint(Graphics g) {

// Double-Buffering
if (buffer==null) {
buffer=createImage(700, 700);
gBuffer=(Graphics2D)buffer.getGraphics();
}
gBuffer.clearRect(0,0,this.getSize().width, this.getSize().height);

// Antialiasing
gBuffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

// Lokale Würfel-Koordinaten
// in Welt-Koordinaten: +200
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,
(int)(p[2][x])+200,(int)(p[2][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,
(int)(p[3][x])+200,(int)(p[3][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,
(int)(p[4][x])+200,(int)(p[4][y])+200);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,
(int)(p[1][x])+200,(int)(p[1][y])+200);
gBuffer.drawLine((int)(p[5][x])+200,(int)(p[5][y])+200,
(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[6][x])+200,(int)(p[6][y])+200,
(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.drawLine((int)(p[7][x])+200,(int)(p[7][y])+200,
(int)(p[8][x])+200,(int)(p[8][y])+200);
gBuffer.drawLine((int)(p[8][x])+200,(int)(p[8][y])+200,
(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[1][x])+200,(int)(p[1][y])+200,
(int)(p[5][x])+200,(int)(p[5][y])+200);
gBuffer.drawLine((int)(p[2][x])+200,(int)(p[2][y])+200,
(int)(p[6][x])+200,(int)(p[6][y])+200);
gBuffer.drawLine((int)(p[3][x])+200,(int)(p[3][y])+200,
(int)(p[7][x])+200,(int)(p[7][y])+200);
gBuffer.drawLine((int)(p[4][x])+200,(int)(p[4][y])+200,
(int)(p[8][x])+200,(int)(p[8][y])+200);

g.drawImage (buffer, 0, 0, this);

// Verzögerung
try {Thread.sleep(10);}
catch (InterruptedException e) {}

double px, py, pz;

for (int i=1;i<9;i++) {

px = p[x];
py = p[y];
pz = p[z];

// Rotation um x-Achse
p[y] = py*Math.cos(angle_x)-pz*Math.sin(angle_x);
p[z] = py*Math.sin(angle_x)+pz*Math.cos(angle_x);

py = p[y];
pz = p[z];

// Rotation um y-Achse
p[x] = px*Math.cos(angle_y)+pz*Math.sin(angle_y);
p[z] =-px*Math.sin(angle_y)+pz*Math.cos(angle_y);

px = p[x];

// Rotation um z-Achse
p[x] = px*Math.cos(angle_z)-py*Math.sin(angle_z);
p[y] = py*Math.cos(angle_z)+px*Math.sin(angle_z);
}

repaint();
}

public void update(Graphics g) {paint(g);}
}
[/code]
wie soll ich da die Farben reinkriegen ?
 
ähm ja 😀 ich wollte eigentlich meinen ursprünglichen Würfel sich drehen lassen, also den RGB würfel. jetzt hab ich nen rotierenden würfel, aber ich muss jetzt auf jede Seite diese Farbmischung machen -.- ?
 

Neue Themen


Zurück
Oben