Kleinere Positionsangabe als einzelne Pixel bei Image?

Domi96

Mitglied
Hi liebe Community,
ich bin neu hier und habe eine Frage bezüglich der positionierung eines Image.
Mir reicht leider die positionierung nach einzelnen Pixel als Ganzzahl nicht aus und brauche etwas genaueres und hoffe, dass es sowas gibt. Am Besten wäre eine Positionsangabe per double wenn sowas überhaupt möglich ist ;)


Vielleicht ein Denkanstoß:

Ich habe von Subpixel gehört weiß aber nicht genauch was das ist und meine Recherche hilft mir in dem Kontext auch nicht weiter.

Dankeschön :)

Dominik
 
M

Marcinek

Gast
Pixel sind die kleinsten Elemente eines Bildes. Ein Bild ist diskret Unterteilt in pixel, man kann nicht einen Pixel per Kommazahl ansprechen. Was wäre den 0.5, 0.5 für ein Pixel?

Subpixel sind auf dem Monitor und beschreiben die einzelnen Leuchten eines Pixels.
 

Domi96

Mitglied
Ich habe mich vielleicht falsch ausgedrückt:
Ich möchte eine Positionsangabe zu einem Bild haben und eine kleiner Positionsangabe als 1 (weil nur Ganzzahl möglich).
 
Zuletzt bearbeitet:

Network

Top Contributor
Dann verwendest du als Positionsangabe double oder float, castest die Werte in der Zeichenmethode nach int. Gerechnet wird dabei weiterhin mit den double-Werten
Java:
g2d.drawImage( image, (int)x, (int)y, w, h, null );
// Oder so ähnlich, je nachdem wie du das Bild auf dem Bildschirm realisierst

Oder spielt es eine Rolle, dass ein Bild tatsächlich nur einen teil eines Pixels ausfüllt?
Was nicht funktioniert aber dem menschlichen Gehirn/Auge durch Kantenglättung vorgetäuscht wird indem der "halbe" Pixel die Farbe halbe halbe mischt mit einer anderen Farbe die sich an der selben Stelle befindet. AA ist jedoch aufwendig und rechenintensiv.
Alternativ gibt es noch Multisampling, was ca. den selben Effekt hat und viel weniger rechenleistung benötigt. Jedoch wird bei Multisampling eher einfach das Bild leicht verwischt. Wenn also wirklich der Pixel an sich wichtig ist, ist das keine Alternative.
 

Domi96

Mitglied
@ Network

Ja es spiel eine Rolle, da meine Positionsangabe auch auf die "halben Positionen" angewiesen ist :/ Mit casten habe ich es auch schon versucht, jedoch ist das zu ungenau, da ich immer einen Wer zwischen 0 und 1 erhalte. Beim Casten erhalte ich dann immer 0...

ABer am Besten erkläre ich was ich vor habe:

Ich habe ein Image, welchem ich alle paar zeiteinheiten eine neue Position zuweise, damit eine Bewegung entsteht:
Java:
g2d.drawImage(figBall.getImage(), figBall.getX(), figBall.getY(), this);

x und y berechnen sich dabei aus dem Winkel, in dem sich der Ball bewegt:

Java:
 if(angle<90){
    		dx=(int)(Math.sin(Math.PI*(angle)/180)*tempo);
    		dy=(int)(Math.cos(Math.PI*(angle)/180)*tempo);
    		
    	}else if(angle<180){
    		dx=(int)(Math.sin(Math.PI*(angle-90)/180)*tempo);
    		dy=(int)(-Math.cos(Math.PI*(angle-90)/180)*tempo);
    		
    	}else if(angle<270){
    		dx=-(int)(Math.sin(Math.PI*(angle-180)/180)*tempo);
    		dy=-(int)(Math.cos(Math.PI*(angle-180)/180)*tempo);
    		
    	}else if(angle<360){
    		dx=-(int)(Math.sin(Math.PI*(angle-270)/180)*tempo);
    		dy=(int)(Math.cos(Math.PI*(angle-270)/180)*tempo);
    	}else{
    		dx=0;
    		dy=0;
    	}
	        x =x+(dx);
	        y =y+(dy);

Wie man sieht berechne ich momentan dx und dy mit einem Typcast aus sin / cos.

doch ergibt das einen double Wert, wobei es auch wichtig ist, was hinter dem Komma steht. Da beim Casten meist 0 raus kommt und somit keine Bewegung zu Stande kommt. Daher brauche ich wirklich eine Positionsbestimmung mit dem double Wert...

Danke schonmal für die bisherigen Antworten :)
 

Network

Top Contributor
Aha ich verstehe.
Gegenfrage: Du möchtest die Bewegung eines Elektrons um den Atomkern darstellen und dafür suchst du jetzt einen Bildschirm dessen Pixel so groß wie Elektronen sind?

Wie wäre es wenn du deiner sin- und cos-Funktion einen Multiplikator verpasst, damit das menschliche Auge die Bewegung auch wahrnehmen kann?

Ein Bildschirm kann nicht als relativer Vergleich gewählt werden und sollte er auch nicht. Wenn ich dein Programm jetzt auf meinem Smartphone ausführe ist ein Pixel gleich viel kleiner als auf meinem groben Desktopmonitor.
Die Pixel von dem Bildschirm passen 10 mal in einen Pixel meines Desktopbildschirms. Deine Software würde jetzt daraus aber wiederum nur einen "Teil" nehmen. Dabei wären 5 Pixel ja bereits die hälfte eines Pixels eines anderen Bildschirms. Völliger Nonsense.

Entschuldige wenn ich das so voreilig vieleicht abstempel, aber ich finde das Vorhaben ehrlich gesagt nicht sinnvoll. OO dreht sich nebenbei auch um solche Problemstellungen - wo die Anzeige nur für die Anzeige zuständlich ist und nicht die logischen Zusammenhänge dahinter. :)

Gruß
Net

PS: Bitte revidier mich wenn ich zu voreilig geurteilt habe. :)
 

xehpuk

Top Contributor
Lass
Code:
x
,
Code:
y
,
Code:
dx
und
Code:
dy
vom Typ
Code:
double
sein. Nur beim Zeichnen rechnest du dann in
Code:
int
um.

… wobei das weiter oben bereits vorgeschlagen wurde.
 

Network

Top Contributor
Wenn du diese Zahl hast:
0,42
und sie mit 100 Multiplizierst bevor du sie übergibst, stellt der Monitor die Bewegung mit 42 Pixeln dar.
Da wären deine Nachkommastellen, dargestellt und sogar sehr gut erkennbar.
Oder verstehe ich dein Problem ganz falsch.
 

Domi96

Mitglied
nein genau das ist mein Problem.
Sorry das ich das ich mein Problem so schlecht rüberbringen kann :)

Diese Idee hatte ich auch schon, jedoch ergiebt sich dann das Problem, dass alle paar millisekunden der Punkt um zu viele Pixel springt...

Aber ich probiere es mit dem Ansatz weiter und setzte die Wiederholungsrate etwas runter :)

Danke
 

DrZoidberg

Top Contributor
Ich verwende für sowas eine Vektor Klasse wie z.B die hier.
[Java] 2D Vector class - Pastebin.com

Die Position aller Objekte wird dann als Vektor dargestellt. Das gleiche gilt auch für die Geschwindigkeit.
bsp.

Java:
class Ball {
    Vec pos = new Vec(0,0);
    Vec tempo = new Vec(0,0);
    public setSpeed(double angle, double speed) {
        tempo = Vec.X_AXIS.rotate(angle).mul(speed);
    }
    public void update(double time) {
        pos = pos.add(tempo.mul(time));
    }
    public void paint(Graphics2D g) {
        g.setColor(...);
        g.fillOval((int)pos.x, (int)pos.y, ...);
    }
}

Wie du siehst wird hier überall mit double Werten gearbeitet, erst in der paint Methode wird dann gecastet.
 

Domi96

Mitglied
Kann ich wenn ich einem Durchlauf das Bild um einen halben Pixel in x Richtung verschieben muss nciht einfach eine Runde aussetzten und dann in der darauffolgenden Runde um 1 erhöhen? kommt das aufs gleiche raus?
 

Domi96

Mitglied
Ich habe aber eine Bewegung in x und y Rifchtung die zwischen 0 und 1 liegt:

Java:
if(angle<90){
            dx=(int)(Math.sin(Math.PI*(angle)/180)*tempo);
            dy=(int)(Math.cos(Math.PI*(angle)/180)*tempo);
            
        }else if(angle<180){
            dx=(int)(Math.sin(Math.PI*(angle-90)/180)*tempo);
            dy=(int)(-Math.cos(Math.PI*(angle-90)/180)*tempo);
            
        }else if(angle<270){
            dx=-(int)(Math.sin(Math.PI*(angle-180)/180)*tempo);
            dy=-(int)(Math.cos(Math.PI*(angle-180)/180)*tempo);
            
        }else if(angle<360){
            dx=-(int)(Math.sin(Math.PI*(angle-270)/180)*tempo);
            dy=(int)(Math.cos(Math.PI*(angle-270)/180)*tempo);
        }else{
            dx=0;
            dy=0;
        }
            x =x+(dx);
 y =y+(dy);

Wenn ich da caste erhalte ich immer 0. Ich gehe grade mit dem Vorschlag von NETWORK an die sache ran.
 

DrZoidberg

Top Contributor
Kann ich wenn ich einem Durchlauf das Bild um einen halben Pixel in x Richtung verschieben muss nciht einfach eine Runde aussetzten und dann in der darauffolgenden Runde um 1 erhöhen? kommt das aufs gleiche raus?

Und wenn du jetzt mehrere Bilder hast, die sich unterschiedlich schnell bewegen? Eines wird um nen halben Pixel pro Durchllauf verschoben, ein anderes um 0.123423 Pixel usw. Und meistens ist die Bewegung auch nicht parallel zu einer der Axen.

Domi96 hat gesagt.:
Wenn ich da caste erhalte ich immer 0
Du sollst ja auch nicht casten, sondern mit float oder double arbeiten.
 
Zuletzt bearbeitet:

Domi96

Mitglied
und das soll klappen? ISt es nicht das gleiche wenn ich 0,97 erst caste und dann 0 erhalte und es zum alten x ( Beispielsweise x=15) dazu addiere und dann 15 erhalte.
oder ob ich x mit der 0,97 addiere und dann beispielsweise 15,97 erhalte und dann caste und trotzdem 15 erhalte?
 
G

Gast2

Gast
Nein ist nicht das gleiche.
Du rechnest dann im nächsten Durchlauf mit der 15,97 weiter, einzig allein fürs zeichnen castest du. An den Werten mit denen du rechnest änderst du gar nix.
 

Timothy Truckle

Top Contributor
und das soll klappen? ISt es nicht das gleiche wenn ich 0,97 erst caste und dann 0 erhalte und es zum alten x ( Beispielsweise x=15) dazu addiere und dann 15 erhalte.
oder ob ich x mit der 0,97 addiere und dann beispielsweise 15,97 erhalte und dann caste und trotzdem 15 erhalte?
Eigentlich ist es ganz einfach. Du berechnest Deine Werte so als ob es gar keine Pixel gäbe. Das tust Du in einer eigenen Klasse(-nhirarchie). Lass uns das "Modell" nennen.

Für die Anzeige lässt Du Dir die aktuellen Positionen aus dem Modell geben, multipliziertst die mit NETWORKs
Code:
100
, die wir in der Konstanten
Code:
ZOOM_FAKTOR
abgelegt haben und castest die Ergebnisse nach
Code:
int
. Nach dem Zeichen vergisst Du diese umgerechneten Werte.

Nun klar?

bye
TT
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hab' nicht alles gelesen, aber mit graphics2D#draw(shape) kann man auch Dinge zeichnen, die double-Koordinaten haben - und wenn man AntiAliasing AN hat, macht das sogar einen Unterschied zu ganzzahligen Koordinaten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Ideen für kleinere Projekte um Java zu lernen Java Basics - Anfänger-Themen 1
J Kleinere Detailfragen zu Java Java Basics - Anfänger-Themen 4
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
A immer kleinere quadrate Java Basics - Anfänger-Themen 2
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
E JTable einzelne Zelle färben Java Basics - Anfänger-Themen 2
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
X Wie kann ich Zahlen in einzelne Zifferne zerlegen? Java Basics - Anfänger-Themen 3
O Einzelne Bits umwandeln und prüfen Java Basics - Anfänger-Themen 23
C Auf einzelne Werte aus HashSet zugreifen Java Basics - Anfänger-Themen 10
K Einzelne Email verschieben nicht möglich Java Basics - Anfänger-Themen 3
F Arrays Sätze speichern und einzelne Worte mit Index Angabe auslesen Java Basics - Anfänger-Themen 4
M Einzelne Pixel in einem Bild auslesen und bearbeiten Java Basics - Anfänger-Themen 1
B lanterna einzelne Zeichen aus dem Terminal löschen Java Basics - Anfänger-Themen 0
C Matrixmultiplikation ohne einzelne Elemente aufzurufen Java Basics - Anfänger-Themen 2
T JTable einzelne Zeilen löschen Java Basics - Anfänger-Themen 3
A Variablen String Array in einzelne Strings auspalten Java Basics - Anfänger-Themen 4
J Methoden Einzelne Objekte eines Vectors addieren Java Basics - Anfänger-Themen 10
S Einzelne Buchstaben aus Jtextfield in array Java Basics - Anfänger-Themen 2
R Einzelne Zahlen von der Eingabe (Scan) weiterverarbeiten Java Basics - Anfänger-Themen 3
F Einzelne Werte aus einem Array vergleichen? Java Basics - Anfänger-Themen 8
H Input/Output JTextArea einzelne Zeile auslesen Java Basics - Anfänger-Themen 6
X String einzelne Buchstaben ersetzen Java Basics - Anfänger-Themen 4
M Einzelne Zeilen nach Zeichen auslesen Java Basics - Anfänger-Themen 4
T Erste Schritte einzelne Wörter aus textdatei lesen... Java Basics - Anfänger-Themen 4
M JTable einzelne Spalte rechtsbündig Java Basics - Anfänger-Themen 2
M JUnit - nur einzelne Methode testen? Java Basics - Anfänger-Themen 4
S Einzelne Werte von Array-Feld löschen Java Basics - Anfänger-Themen 15
N TextZeile in einzelne Strings teilen, die mit Komma getrennt sind Java Basics - Anfänger-Themen 4
A einzelne Zeichen aus String auslesen Java Basics - Anfänger-Themen 3
J Von einem String einzelne Wörter speichern Java Basics - Anfänger-Themen 6
R einzelne Bits prüfen Java Basics - Anfänger-Themen 12
H String zerlegen in einzelne Buchstaben (char)?? Java Basics - Anfänger-Themen 7
A Einzelne TeilStrings einfärben Java Basics - Anfänger-Themen 3
S mehrere einzelne klassen in eine datei packen Java Basics - Anfänger-Themen 4
K Datentypen Liste: Einzelne Einträge ändern Java Basics - Anfänger-Themen 2
D Einzelne Ziffern aus einem String Java Basics - Anfänger-Themen 10
B Was für Aufgaben haben die einzelne Entwurfsmuster? Java Basics - Anfänger-Themen 9
C Einzelne Werte eines Arrays ausgeben Java Basics - Anfänger-Themen 2
B Laufzeitverschlechterung durch Auslagerung in einzelne Threads Java Basics - Anfänger-Themen 8
MrMilti einzelne Methoden einer Klasse auslagern Java Basics - Anfänger-Themen 6
T Einzelne Ziffer zusammenfügen (ohne Strings oder Arrays) Java Basics - Anfänger-Themen 2
M einzelne Pixel setzen/auslesen Java Basics - Anfänger-Themen 2
N aus HTML einzelne Inhalte (z.B. Tabelleninhalte) auslesen Java Basics - Anfänger-Themen 10
A Nur einzelne Methode einer anderen Klasse starten Java Basics - Anfänger-Themen 2
G Einzelne Datei im jar verändern ? Java Basics - Anfänger-Themen 5
B Einzelne Zellen in JTable markieren Java Basics - Anfänger-Themen 2
C String.split("") einzelne Positionen abfragen Java Basics - Anfänger-Themen 10
ven000m Primzahl.class wie starte ich diese einzelne Datei? Java Basics - Anfänger-Themen 10
R einzelne Zelle einer JTable bearbeiten Java Basics - Anfänger-Themen 2
M Object zu Int Problem, obwohl einzelne Objecte Int sind =( Java Basics - Anfänger-Themen 2
J String - einzelne Zeichen sortieren Java Basics - Anfänger-Themen 14
G Einzelne Zeilen beschreiben Java Basics - Anfänger-Themen 4
E einzelne Zeile mithilfe Steams aus Textdatei überschreiben Java Basics - Anfänger-Themen 23
F einzelne Buchstaben in JTextField ändern Java Basics - Anfänger-Themen 11
S setCellRenderer für EINZELNE Zelle Java Basics - Anfänger-Themen 9
S Zugriff auf einzelne Buchstaben eines String Java Basics - Anfänger-Themen 16
J Jtable - wie einzelne zelle markieren Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben