Hallo.
Ich bastel ja gerade an einem kleinen zeichen programm, aber irgendwie bugt der zeichnenalgorithmus manchmal … ein bisschen.
Der sieht so aus:
code
[spoiler]
double m = 0;
int width = draggedX - mouseX;
int height = draggedY - mouseY;
if(draggedX - mouseX != 0){
m = (double) (draggedY - mouseY) / (double) (draggedX - mouseX);
}
if(width > 0){
for(int i = 0; i < width; i++) {
double x = mouseX + i;
double y = mouseY + (m * i);
g.fillOval((int) x, (int) y, 5, 5);
}
}
else if(width < 0){
for(int i = -width; i > 0; i--) {
double x = mouseX + i;
double y = mouseY + (m * i);
g.fillOval((int) x, (int) y, 5, 5);
}
}
else{
if(height > 0){
for(int i = 0; i < height; i++){
g.fillOval(mouseX, (int) i + mouseY, 5, 5);
}
}
else if(height < 0){
for(int i = -height; i > 0; i--){
g.fillOval(mouseX, (int) i + mouseY, 5, 5);
}
}
}
[/spoiler]
Ich kanns nicht genau beschreiben, aber naja, es werden manche stellen einfach übersprungen und manchmal wird irgendwo gezeichnet wo es nicht sein sollte.
einer eine idee?
*** edit ***
Wers ausprobieren will, kompletter code in einer klasse:
code
[spoiler]
package de.skysoldier.paint;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
class Gui {
JFrame frame;
DrawPane drawPane;
JPanel menuCont;
JPanel layerBarCont;
JPanel toolsCont;
JPanel infoCont;
public Gui(DrawPane drawPane){
build(drawPane);
}
public void build(DrawPane drawPane){
frame = new JFrame();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
drawPane = new DrawPane();
this.drawPane = drawPane;
this.menuCont = buildMenu();
this.layerBarCont = buildLayerBar();
this.toolsCont = buildTools();
this.infoCont = buildInfo();
frame.add(menuCont, BorderLayout.NORTH);
frame.add(layerBarCont, BorderLayout.WEST);
frame.add(toolsCont, BorderLayout.EAST);
frame.add(infoCont, BorderLayout.SOUTH);
frame.add(drawPane, BorderLayout.CENTER);
frame.setVisible(true);
drawPane.init();
}
private JPanel buildMenu(){
menuCont = new JPanel();
menuCont.setBackground(Color.BLACK);
menuCont.setPreferredSize(new Dimension(0, 30));
return menuCont;
}
private JPanel buildLayerBar(){
layerBarCont = new JPanel();
layerBarCont.setBackground(Color.GRAY);
layerBarCont.setPreferredSize(new Dimension(150, 0));
return layerBarCont;
}
private JPanel buildTools(){
toolsCont = new JPanel();
toolsCont.setBackground(Color.GRAY);
toolsCont.setPreferredSize(new Dimension(150, 0));
return toolsCont;
}
private JPanel buildInfo(){
infoCont = new JPanel();
infoCont.setBackground(Color.BLACK);
infoCont.setPreferredSize(new Dimension(0, 20));
return infoCont;
}
}
class DrawPane extends JPanel {
private boolean loaded;
private int draggedX;
private int draggedY;
private int mouseX;
private int mouseY;
private States state;
private BufferedImage contentImg;
public DrawPane(){
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(contentImg, 0, 0, this);
}
private MouseMotionListener mouseListener = new MouseMotionListener(){
public void mouseDragged(MouseEvent e) {
if(loaded){
draggedX = e.getX();
draggedY = e.getY();
if(state == States.PEN){
Graphics2D g = (Graphics2D) contentImg.getGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.BLACK);
double m = 0;
int width = draggedX - mouseX;
int height = draggedY - mouseY;
if(draggedX - mouseX != 0){
m = (double) (draggedY - mouseY) / (double) (draggedX - mouseX);
}
if(width > 0){
for(int i = 0; i < width; i++) {
double x = mouseX + i;
double y = mouseY + (m * i);
g.fillOval((int) x, (int) y, 5, 5);
}
}
else if(width < 0){
for(int i = -width; i > 0; i--) {
double x = mouseX + i;
double y = mouseY + (m * i);
g.fillOval((int) x, (int) y, 5, 5);
}
}
else{
if(height > 0){
for(int i = 0; i < height; i++){
g.fillOval(mouseX, (int) i + mouseY, 5, 5);
}
}
else if(height < 0){
for(int i = -height; i > 0; i--){
g.fillOval(mouseX, (int) i + mouseY, 5, 5);
}
}
else{
g.fillOval(mouseX, mouseY, 5, 5);
}
}
repaint();
mouseMoved(e);
}
}
}
public void mouseMoved(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
}
};
public void init(){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
create();
}
});
}
public void create(){
state = States.PEN;
contentImg = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
loaded = true;
addMouseMotionListener(mouseListener);
}
public enum States {
PEN
}
}
class Paint {
DrawPane drawPane;
public Paint(){
new Gui(drawPane);
}
}
public class Hole {
public static void main(String[] args) {
new Paint();
}
}
[/spoiler]