Hallo zusammen!
ich hab ein problem. Ich will eine Strecken-Editor bauen. Dieser zeichnet zwar nur Linien und Kreissegmente, aber genau das ist mein Problem. Wenn ich eine "Kurve" zeichene und dann eine Gerade hinzufüge passen diese nicht zusammen. Sie sind verschoben. Ich probier bei diesem Problem schon mind. 2 Wochen die verschiedensten möglichkeiten aus.
Vielleicht habt ihr ja einen Vorschlag.
Hier erst mal die Zeichen Klasse. Ist von JPanel abgeleitet.
Und die StdTrackTypes:
Vielen Dank schon mal für eure Hilfe
ich hab ein problem. Ich will eine Strecken-Editor bauen. Dieser zeichnet zwar nur Linien und Kreissegmente, aber genau das ist mein Problem. Wenn ich eine "Kurve" zeichene und dann eine Gerade hinzufüge passen diese nicht zusammen. Sie sind verschoben. Ich probier bei diesem Problem schon mind. 2 Wochen die verschiedensten möglichkeiten aus.
Vielleicht habt ihr ja einen Vorschlag.
Hier erst mal die Zeichen Klasse. Ist von JPanel abgeleitet.
Java:
package util;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import trackParts.StdTrackTypes;
@SuppressWarnings("serial")
public class TrackDrawPanel extends JPanel implements MouseListener{
static Integer startCoordinates[] = {410,384}; //x,y
static List<Integer[][]> coordinates;
static int deg = 90;
//private static int curDeg=0;
static int deltaXges=0;
static int deltaYges=0;
public TrackDrawPanel(){
coordinates = new ArrayList<Integer[][]>();
coordinates = new ArrayList<Integer[][]>();
if(coordinates.size()==0){
Integer[][]xy = {{startCoordinates[0],startCoordinates[1]},{startCoordinates[0], startCoordinates[1]+(int)StdTrackTypes.getWidth()}};
coordinates.add(xy);
}
this.addMouseListener(this);
}
/**
* Calculates the Y-Coordinate of the end points of a curve
* @param deg The extent angle
* @param radius The radius of the curve
* @return It returns the y-value in pixel
*/
static int calcDeltaY(double deg, double radius){
double alpha = (Math.PI)/180*deg;
double c = radius;
double b = radius;
double a = Math.sqrt(Math.pow(b, 2)+Math.pow(c, 2)- 2*b*c*Math.cos(alpha));
double beta = Math.acos((Math.pow(b, 2) - Math.pow(c, 2) - Math.pow(a, 2)) / (-2 * c * a));
//System.out.println("a: "+a);
double hc = a*Math.sin(beta);
return (int)Math.round(hc);
}
/**
* Calculates the X-Coordinate of the end points of a curve
* @param deg The extent angle
* @param radius The radius of the curve
* @return It returns the x-value in pixel
*/
static int calcDeltaX(double deg, double radius){
double alpha = (Math.PI)/180*deg;
double c = radius;
double b = radius;
double a = Math.sqrt(Math.pow(b, 2)+Math.pow(c, 2)- 2*b*c*Math.cos(alpha));
double beta = Math.acos((Math.pow(b, 2) - Math.pow(c, 2) - Math.pow(a, 2)) / (-2 * c * a));
System.out.println("beta: "+beta);
double hc = a*Math.sin(beta);
int x = (int)Math.round((Math.sqrt(Math.pow(a,2)-Math.pow(hc, 2))));
return x;
}
static int angleCalc(boolean x){
if(deg>=0 && deg<90){
if(x){
return -deltaXges;
}else{
return deltaYges;
}
}else if(deg>=90 && deg<180){
if(x){
return -deltaXges;
}else{
return deltaYges;
}
}else if(deg>=180 && deg<270){
if(x){
return -deltaXges;
}else{
return deltaYges;
}
}else if(deg>=270 && deg<=360){
if(x){
return -deltaXges;
}else{
return deltaYges;
}
}
return 0;
}
/**
* This method draws a filled curve.
* @param g
* @param degree The extent angle.
* @param radius The radius of the cure
*/
public static void drawCurve(Graphics g, double degree, double radius){
if(coordinates.size()==0){
Integer[][]xy = {{startCoordinates[0],startCoordinates[1]},{startCoordinates[0]+(int)StdTrackTypes.getWidth(), startCoordinates[1]}};
coordinates.add(xy);
}
System.out.println("Vor kurve:");
System.out.println("X: "+coordinates.get(coordinates.size()-1)[0][0]+" Y: "+coordinates.get(coordinates.size()-1)[0][1]);
System.out.println("X1: "+coordinates.get(coordinates.size()-1)[1][0]+" Y1: "+coordinates.get(coordinates.size()-1)[1][1]);
//curDeg=(int)degree;
Integer[][]xy=null;
g.fillArc(coordinates.get(coordinates.size()-1)[0][0]-(int)(radius)+angleCalc(true), coordinates.get(coordinates.size()-1)[0][1]-angleCalc(false), 2*(int)(radius), (int) (2*(radius)), deg, (int)degree);
g.setColor(Color.RED);
g.fillArc(coordinates.get(coordinates.size()-1)[0][0]-(int)radius+(int)StdTrackTypes.getWidth()+angleCalc(true), coordinates.get(coordinates.size()-1)[0][1]+(int)StdTrackTypes.getWidth()-angleCalc(false), 2*(int)(radius-(int)StdTrackTypes.getWidth()), 2*(int)(radius-(int)StdTrackTypes.getWidth()), deg, (int)degree);
deg =(int)(deg+degree>360?(deg+degree-360):deg+degree);
// int deltaX = calcDeltaX(degree, radius);
// int deltaY = calcDeltaY(degree, radius);
// int deltaX1 = calcDeltaX(degree, radius-StdTrackTypes.getWidth());
// int deltaY1 = calcDeltaY(degree, radius-StdTrackTypes.getWidth());
int deltaX = calcDeltaX(deg-90, radius);
int deltaY = calcDeltaY(deg-90, radius);
int deltaX1 = calcDeltaX(deg-90, radius-StdTrackTypes.getWidth());
int deltaY1 = calcDeltaY(deg-90, radius-StdTrackTypes.getWidth());
// if(deg>=0 && deg<=90){
//
// }else if(deg>90 && deg<=180){
//
// }else if(deg>180 && deg<=270){
//
// }else if(deg>270 && deg<=360){
//
// }
if(deg>=0 && deg<=90){
if(deg>45){
deltaXges -= deltaX;
deltaYges -= deltaY;
}else{
deltaXges -= deltaY;
deltaYges -= deltaX;
}
xy = new Integer[][]{{coordinates.get(coordinates.size()-1)[0][0]-(deg>45?deltaX:deltaY),coordinates.get(coordinates.size()-1)[0][1]-(deg>45?deltaY:deltaX)},{coordinates.get(coordinates.size()-1)[1][0]-(deg>45?deltaX1:deltaY1),coordinates.get(coordinates.size()-1)[1][1]-(deg>45?deltaY1:deltaX1)}};
}else if(deg>90 && deg<=180){
if(deg<135){
deltaXges -= deltaY;
deltaYges += deltaX;
}else{
deltaXges -= deltaX;
deltaYges += deltaY;
}
xy = new Integer[][]{{coordinates.get(coordinates.size()-1)[0][0]-(deg<135?deltaY:deltaX),coordinates.get(coordinates.size()-1)[0][1]+(deg<135?deltaX:deltaY)},{coordinates.get(coordinates.size()-1)[1][0]-(deg<135?deltaY1:deltaX1),coordinates.get(coordinates.size()-1)[1][1]+(deg<135?deltaX1:deltaY1)}};
}else if(deg>180 && deg<=270){
if(deg>225){
deltaXges += deltaX;
deltaYges += deltaY;
}else{
deltaXges += deltaY;
deltaYges += deltaX;
}
xy = new Integer[][]{{coordinates.get(coordinates.size()-1)[0][0]+(deg>225?deltaX:deltaY),coordinates.get(coordinates.size()-1)[0][1]+(deg>225?deltaY:deltaX)},{coordinates.get(coordinates.size()-1)[1][0]+(deg>225?deltaX1:deltaY1),coordinates.get(coordinates.size()-1)[1][1]+(deg>225?deltaY1:deltaX1)}};
}else if(deg>=270 && deg<=360){
if(deg<315){
deltaXges += deltaX;
deltaYges -= deltaY;
}else{
deltaXges += deltaY;
deltaYges -= deltaX;
}
xy = new Integer[][]{{coordinates.get(coordinates.size()-1)[0][0]+(deg<315?deltaX:deltaY),coordinates.get(coordinates.size()-1)[0][1]-(deg<315?deltaY:deltaX)},{coordinates.get(coordinates.size()-1)[1][0]+(deg<315?deltaX1:deltaY1),coordinates.get(coordinates.size()-1)[1][1]-(deg<315?deltaY1:deltaX1)}};
}
coordinates.add(xy);
System.out.println("nach kurve");
System.out.println("DX: "+deltaX+" DY: "+deltaY+" DX1: "+deltaX1+" DY1: "+deltaY1+" Deg: "+deg);
System.out.println("X: "+coordinates.get(coordinates.size()-1)[0][0]+" Y: "+coordinates.get(coordinates.size()-1)[0][1]);
System.out.println("X1: "+coordinates.get(coordinates.size()-1)[1][0]+" Y1: "+coordinates.get(coordinates.size()-1)[1][1]);
}
/**
* This method draws a straight.
* @param g
* @param length The length of a straight
*/
public static void drawStraight(Graphics g, int length){
g.setColor(Color.GREEN);
if(coordinates.size()==0){
Integer[][]xy = {{startCoordinates[0],startCoordinates[1]},{startCoordinates[0]+(int)StdTrackTypes.getWidth(), startCoordinates[1]}};
coordinates.add(xy);
}
System.out.println("X: "+coordinates.get(coordinates.size()-1)[0][0]+" Y: "+coordinates.get(coordinates.size()-1)[0][1]);
System.out.println("X1: "+coordinates.get(coordinates.size()-1)[1][0]+" Y1: "+coordinates.get(coordinates.size()-1)[1][1]);
if(deg==360 || deg == 0){ // Alle horizontale und vertikale Geraden
g.fillRect(coordinates.get(coordinates.size()-1)[0][0], coordinates.get(coordinates.size()-1)[0][1], (int)StdTrackTypes.getWidth(), -length);
Integer[][]xy = {{coordinates.get(coordinates.size()-1)[0][0],coordinates.get(coordinates.size()-1)[0][1]-length},{coordinates.get(coordinates.size()-1)[0][0]-(int)StdTrackTypes.getWidth(),coordinates.get(coordinates.size()-1)[0][1]-length}};
coordinates.add(xy);
}else if(deg==270){
g.fillRect(coordinates.get(coordinates.size()-1)[0][0], coordinates.get(coordinates.size()-1)[0][1], length, (int)StdTrackTypes.getWidth());
Integer[][]xy = {{coordinates.get(coordinates.size()-1)[0][0]+length,coordinates.get(coordinates.size()-1)[0][1]},{coordinates.get(coordinates.size()-1)[0][0]+length,coordinates.get(coordinates.size()-1)[0][1]-((int)StdTrackTypes.getWidth())}};
coordinates.add(xy);
}else if(deg == 180){
g.fillRect(coordinates.get(coordinates.size()-1)[0][0], coordinates.get(coordinates.size()-1)[0][1], (int)StdTrackTypes.getWidth(), length);
Integer[][]xy = {{coordinates.get(coordinates.size()-1)[0][0],coordinates.get(coordinates.size()-1)[0][1]+length},{coordinates.get(coordinates.size()-1)[0][0]+(int)StdTrackTypes.getWidth(),coordinates.get(coordinates.size()-1)[0][1]+length}};
coordinates.add(xy);
}else if(deg == 90){
g.fillRect(coordinates.get(coordinates.size()-1)[0][0], coordinates.get(coordinates.size()-1)[0][1], -length, (int)StdTrackTypes.getWidth());
Integer[][]xy = {{coordinates.get(coordinates.size()-1)[0][0]-length,coordinates.get(coordinates.size()-1)[0][1]},{coordinates.get(coordinates.size()-1)[0][0]-length,coordinates.get(coordinates.size()-1)[0][1]+(int)StdTrackTypes.getWidth()}};
coordinates.add(xy);
}else{ // Alle anderen Winkel
int x = (int)(length * Math.cos(Math.PI/180*(deg-90)));
int y = (int)(length * Math.sin(Math.PI/180*(deg-90)));
int xpoints[] = null;
int ypoints[] = null;
// Aufbauschema
// x1y1-----x4y4
// | |
// x2y2-----x3y3
if(deg>0 && deg < 90){ //OK
xpoints = new int[]{coordinates.get(coordinates.size()-1)[0][0],coordinates.get(coordinates.size()-1)[1][0],coordinates.get(coordinates.size()-1)[1][0]-(x<0?-x:x),coordinates.get(coordinates.size()-1)[0][0]-(x<0?-x:x)};
ypoints = new int []{coordinates.get(coordinates.size()-1)[0][1],coordinates.get(coordinates.size()-1)[1][1],coordinates.get(coordinates.size()-1)[1][1]-(y<0?-y:y),coordinates.get(coordinates.size()-1)[0][1]-(y<0?-y:y)};
}else if(deg>90 && deg < 180){ //OK
xpoints = new int[]{coordinates.get(coordinates.size()-1)[0][0],coordinates.get(coordinates.size()-1)[1][0],coordinates.get(coordinates.size()-1)[1][0]-(x<0?-x:x),coordinates.get(coordinates.size()-1)[0][0]-(x<0?-x:x)};
ypoints = new int []{coordinates.get(coordinates.size()-1)[0][1],coordinates.get(coordinates.size()-1)[1][1],coordinates.get(coordinates.size()-1)[1][1]+(y<0?-y:y),coordinates.get(coordinates.size()-1)[0][1]+(y<0?-y:y)};
}else if(deg>180 && deg < 270){ //OK
xpoints = new int[]{coordinates.get(coordinates.size()-1)[0][0],coordinates.get(coordinates.size()-1)[1][0],coordinates.get(coordinates.size()-1)[1][0]+(x<0?-x:x),coordinates.get(coordinates.size()-1)[0][0]+(x<0?-x:x)};
ypoints = new int []{coordinates.get(coordinates.size()-1)[0][1],coordinates.get(coordinates.size()-1)[1][1],coordinates.get(coordinates.size()-1)[1][1]+(y<0?-y:y),coordinates.get(coordinates.size()-1)[0][1]+(y<0?-y:y)};
}else if(deg>270 && deg < 360){//OK
xpoints = new int[]{coordinates.get(coordinates.size()-1)[0][0],coordinates.get(coordinates.size()-1)[1][0],coordinates.get(coordinates.size()-1)[1][0]+(x<0?-x:x),coordinates.get(coordinates.size()-1)[0][0]+(x<0?-x:x)};
ypoints = new int []{coordinates.get(coordinates.size()-1)[0][1],coordinates.get(coordinates.size()-1)[1][1],coordinates.get(coordinates.size()-1)[1][1]-(y<0?-y:y),coordinates.get(coordinates.size()-1)[0][1]-(y<0?-y:y)};
}
g.fillPolygon(xpoints, ypoints, 4);
Integer[][]xy = {{xpoints[3],ypoints[3]},{xpoints[2],ypoints[2]}};
coordinates.add(xy);
}
}
// protected void paintComponent(Graphics g){
// super.paintComponent(g);
// Graphics2D g2d = (Graphics2D)g;
// //drawCurve(g2d, 30, 20);
// }
public static void setToZero() {
deg=90;
deltaXges=0;
deltaYges=0;
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("XPos: "+e.getX()+" YPos: "+e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
Java:
public class StdTrackTypes {
private static float width = 19.8f; //cm
public static float getWidth(){
return width;
}
}
Vielen Dank schon mal für eure Hilfe
Zuletzt bearbeitet von einem Moderator: