Kleinster Abstand berechnen (prozedural)

Merick

Mitglied
Hallo liebe Java'ler!
Das problem aus meinem anderen Thema habe ich objekt orientiert gelöst. Aber das möchte mein Betreuer nicht so haben. Ich müsste machen als ob ich in "Basic" oder ähnliche programmieren würde und einfache Datentype benutzen (als prozedural). Im Anhang ist eine Skizze zu sehen.

Zu dem Problem: Ein Objekt O steht auf eine Linie (AB, BC, CD oder DA) in Bestimmten Position x.
wir häten etwas wie O1.AB (O1 steht auf AB)
O1.x (O1 steht auf Position x auf AB)

Ich soll dazu eine Funktiondefinieren, die die Entfernung im Uhrzeigersinn und umgekehr die Entfernung zum Ziel berechnen und mir die beide Entfernungen zurückgibt.

Hat jemand eine Idee, wie ich es machen kann? welchen Datentyp könnte AB, BC, CD, DA, O haben.
Können sie mir bitte helfen. Es schein (laut mein Beteruer simple zu sein) aber ich sehe es nicht so. Darum brauche ich Ihre Hilfe.
Merick
 

Anhänge

  • Zeichnung.JPG
    Zeichnung.JPG
    10,2 KB · Aufrufe: 53
Merick hat gesagt.:
Aber das möchte mein Betreuer nicht so haben.
aus purer Neugier: Warum? Java ist nunmal eine OOP-Sprache und keine prozedurale Sprache :bahnhof:

bleibt halt noch die Frage was mit einfachen Datentypen gemeint ist. Nur primitive Datentypen und Arrays oder auch einfache Wrapper-Klassen?

wahrscheinlich will er sowas:
Java:
static int[] lineAB = {0,0,10,0};
static int[] lineBC = {10,0,10,10};
//usw.
static int x1 = 2;
static int x2 = 7;

static int[] rechneMirDieBeidenEntfernungenAus(int[] startLine, int startX, int[] endLine, int endX){
  //sehr schöne berechnung die wunderbar lesbar ist *hust*
  return new int[]{ergebnis1, ergebnis2};
}
aber wer liest solchen code nicht gerne ist doch logisch das lineAB[0] auf die erste x-Koordinate zeigt.... :autsch:
 
aus purer Neugier: Warum? Java ist nunmal eine OOP-Sprache und keine prozedurale Sprache :bahnhof:

bleibt halt noch die Frage was mit einfachen Datentypen gemeint ist. Nur primitive Datentypen und Arrays oder auch einfache Wrapper-Klassen?

wahrscheinlich will er sowas:
Java:
static int[] lineAB = {0,0,10,0};
static int[] lineBC = {10,0,10,10};
//usw.
static int x1 = 2;
static int x2 = 7;

static int[] rechneMirDieBeidenEntfernungenAus(int[] startLine, int startX, int[] endLine, int endX){
  //sehr schöne berechnung die wunderbar lesbar ist *hust*
  return new int[]{ergebnis1, ergebnis2};
}
aber wer liest solchen code nicht gerne ist doch logisch das lineAB[0] auf die erste x-Koordinate zeigt.... :autsch:
Für den Betreuer ist die OOP zu lang und komplizeirt für so einen "kleinen" problem. Ich soll arbeiten als wie es keine OOP gebe. Mein problem hierbeiist erst, dass ich nich weiß in welche Datentyp ich die Variablen deklarieren soll. wie ich zu Zuordnung von einem Objekt zu einem Gerade machen kann? ich stopert auf solche sache und muss morgen das Ergebnis vorstellen. Bitte eine kleine Programmcode zur Funktion wäre mir sehr hilfreich.

Merick
 
zeig mal deine OOP-Lösung

hier ist die Klasse Objekt wo ich die berechnung der Abstände mache. An dieser Stelle berechne ich den Abstand vom IstPosition zur ZielPosition.
Code:
public class Objekt 
{
	// Attribute der Klasse Objekt
	private int rgbId;
	private Position istPosition;
	private Position zielPosition;
	private int direction;            
	
	// Initialiesirung
	public Objekt(){
		this.rgbId = 0;
		this.istPosition = null;
		this.zielPosition = null;
		this.direction = 0;
	}
	
	// Methoden für Konstruktoren
	public void setRgbId(int rgbId)
	{
		this.rgbId = rgbId;
	}
	
	public int getRgbId(){
		return this.rgbId;
	}
	
	public void setIstPostion(Position p)
	{
		this.istPosition = p;
			
	}
	
	public Position getIstPosition(){
		return this.istPosition;
	}
	
	public void setZielPostion(Position p)
	{
		this.zielPosition = p;
		
	}
	
	public Position getZielPosition(){
		return this.zielPosition;
	}
	
	public void setDirection(int dir)
	{
		this.direction = dir;
	}
	
	
	public void move(){
		Position ziel = this.zielPosition;
		Position ist = this.istPosition;
		
		if (ziel.getOnRegal().getRegalId() != ist.getOnRegal().getRegalId() || ziel.getX() != ist.getX()){
		
			if(ziel.getOnRegal().getRegalId() == ist.getOnRegal().getRegalAtLeft().getRegalId())
			{
				zielOnLeft();
			}
			
			if(ziel.getOnRegal().getRegalId() == ist.getOnRegal().getRegalAtRight().getRegalId())
			{
				zielOnRight();
			}
			
			
			if(ziel.getOnRegal().getRegalId() == ist.getOnRegal().getRegalAtLeft().getRegalAtLeft().getRegalId())
			{
				int leftDist = ist.getX() + ziel.getOnRegal().getRegalLength()-ziel.getX();
				int rightDist = ziel.getX() + ist.getOnRegal().getRegalLength()-ist.getX();
				if(leftDist < rightDist)
					zielOnLeft();
				else
					zielOnRight();
			}
			
			if(ziel.getOnRegal().getRegalId() == ist.getOnRegal().getRegalId())
			{
				onSameRegal();
			}
		}
	}
	
	public void zielOnLeft(){
		Position ziel = this.zielPosition;
		Position ist = this.istPosition;
		
		if (ist.getX() > 1)
			ist.setX(ist.getX()-1);
		else if (ist.getX() == 1)
		{
			ist.setOnRegal(ist.getOnRegal().getRegalAtLeft());
			ist.setX(ist.getOnRegal().getRegalLength());
		}
		movedMessage();
	}
	
	public void zielOnRight(){
		Position ziel = this.zielPosition;
		Position ist = this.istPosition;
		
		if(ist.getX() < ist.getOnRegal().getRegalLength())
			ist.setX(ist.getX()+1);
		else if(ist.getX() == ist.getOnRegal().getRegalLength())
		{
			ist.setOnRegal(ist.getOnRegal().getRegalAtRight());
			ist.setX(1);
		}
		movedMessage();
	}
	
	public void onSameRegal(){
		
		Position ziel = this.zielPosition;
		Position ist = this.istPosition;
		
		if (ist.getX() > ziel.getX())
			ist.setX(ist.getX()-1);
		else
			ist.setX(ist.getX()+1);
		movedMessage();
	}
	
	public void movedMessage(){
		System.out.println("Objekt"+getRgbId()+" on Regal"+istPosition.getOnRegal().getRegalId()
				+" at "+istPosition.getX());
	}
	
	public int calculateDist(Objekt r){
		int distance = 0;
		Position ziel = r.istPosition;
		Position ist = this.istPosition;
		
		if(ziel.getOnRegal().getRegalId() == ist.getOnRegal().getRegalAtLeft().getRegalId())
		{
			distance = ist.getOnRegal().getRegalLength()-ist.getX()+ziel.getX();
		}
		
		if(ziel.getOnRegal().getRegalId() == ist.getOnRegal().getRegalAtRight().getRegalId())
		{
			distance = ziel.getOnRegal().getRegalLength()-ziel.getX()+ist.getX();
		}
		
		
		if(ziel.getOnRegal().getRegalId() == ist.getOnRegal().getRegalAtLeft().getRegalAtLeft().getRegalId())
		{
			int leftDist = ist.getX() + ziel.getOnRegal().getRegalLength()-ziel.getX();
			int rightDist = ziel.getX() + ist.getOnRegal().getRegalLength()-ist.getX();
			if(leftDist < rightDist)
				distance = ist.getOnRegal().getRegalLength()-ist.getX()+ziel.getX()+ist.getOnRegal().getRegalAtLeft().getRegalLength();
			else
				distance = ziel.getOnRegal().getRegalLength()-ziel.getX()+ist.getX()+ist.getOnRegal().getRegalAtRight().getRegalLength();
		}
		
		if(ziel.getOnRegal().getRegalId() == ist.getOnRegal().getRegalId())
		{
			distance = Math.abs(ist.getX()-ziel.getX());
		}
		
		return distance;
	}
	
	public boolean onZiel(){
		Position ziel = this.zielPosition;
		Position ist = this.istPosition;
		if (ziel.getOnRegal().getRegalId() == ist.getOnRegal().getRegalId() && ziel.getX() == ist.getX())
			return true;
		
		return false;
	}
	
}
 
Merick hat gesagt.:
Für den Betreuer ist die OOP zu lang und komplizeirt für so einen "kleinen" problem.
frag ihn mal wie er das findet (es ist eindeutig prozedural....nur halt ein wenig krank 😀)

Java:
public class WegBerechnung {

	static int[] lineAB = {0,0,15,0}; //{x1,y1,x2,y2}
	static int[] lineBC = {15,0,15,10};
	static int[] lineCD = {15,10,0,10};
	static int[] lineDA = {0,10,0,0};

	static int width = lineAB[2]-lineAB[0];
	static int height = lineBC[3]-lineBC[1];
	
	public static void main(String[] args) {
		int[] result = calculate(lineAB, 4, lineCD, 7);
		System.out.println(Math.min(result[0], result[1]));
	}
	
	public static int[] calculate(int[] line1, int s1, int[] line2, int s2){
		int x1 = line1[0]==line1[2]? line1[0] : s1;
		int y1 = line1[1]==line1[3]? line1[1] : s1;
		int x2 = line2[0]==line2[2]? line2[0] : s2;
		int y2 = line2[1]==line2[3]? line2[1] : s2;
		return new int[]{calculate(x1,y1,x2,y2,true),calculate(x1,y1,x2,y2,false)};
	}
	
	private static int calculate(int x1, int y1, int x2, int y2, boolean clockWise){
		int cw = clockWise? 1 : -1;
		if(x1 == x2 && y1 == y2) return 0;
		if(y1>0 && y1<height)
			return calculate(x1,y1+cw*(x1==0?-1:1),x2,y2,clockWise)+1;
		else if(x1>0 && x1<width)
			return calculate(x1+cw*(y1==0?1:-1),y1,x2,y2,clockWise)+1;
		else if(x1==0 && y1==height || x1==width && y1==0)
			return calculate(x1+(clockWise?0:(y1==0?-1:1)),y1+(clockWise?(x1==0?-1:1):0),x2,y2,clockWise)+1;
		else
			return calculate(x1+(clockWise?(y1==0?1:-1):0),y1+(clockWise?0:(x1==0?1:-1)),x2,y2,clockWise)+1;	
	}
}

naja aber hier ma dein code einfach ohne Objekte (außer Array...):
Java:
public class WegBerechnung {

	static int[] lineAB = {0,0,15,0}; //{x1,y1,x2,y2}
	static int[] lineBC = {15,0,15,10};
	static int[] lineCD = {15,10,0,10};
	static int[] lineDA = {0,10,0,0};

	static int width = lineAB[2]-lineAB[0];
	static int height = lineBC[3]-lineBC[1];

	
	static int otherCalculation(int[] istRegal, int istX, int[] zielRegal, int zielX){
		int distance = 0;
		
		if(zielRegal == getRegalAtLeft(istRegal))
		{
			distance = getLength(istRegal)-istX+zielX;
		}
		
		if(zielRegal == getRegalAtRight(istRegal))
		{
			distance = getLength(zielRegal)-zielX+istX;
		}
		
		if(zielRegal == getRegalAtLeft(getRegalAtLeft(istRegal)))
		{
			int leftDist = istX + getLength(zielRegal)-zielX;
			int rightDist = zielX + getLength(istRegal)-istX;
			if(leftDist < rightDist)
				distance = getLength(istRegal)-istX+zielX+getLength(getRegalAtLeft(istRegal));
			else
				distance = getLength(zielRegal)-zielX+istX+getLength(getRegalAtRight(istRegal));
		}
		
		if(zielRegal == istRegal)
		{
			distance = Math.abs(istX-zielX);
		}
		
		return distance;

	}

	private static int getLength(int[] line) {
		if(line[0]==line[2])return height;
		else return width;
	}

	private static int[] getRegalAtLeft(int[] line) {
		if(line == lineAB)return lineBC;
		else if(line == lineBC)return lineCD;
		else if(line == lineCD)return lineDA;
		else return lineAB;
	}

	private static int[] getRegalAtRight(int[] line) {
		return getRegalAtLeft(getRegalAtLeft(getRegalAtLeft(line)));
	}
}

edit: hmm... hätte das vllt mal etwas früher machen können. hoffentlich siehst du das noch.
 
Zuletzt bearbeitet:
Hallo ein Keks!
vielen Dank. Ich hoffe, dass er morgen einverstanden ist. Ich hätte nicht wie du gelöst. Ich wäre sogar nicht zu dieser Idee gekommen. Ich war OOP und konnte nix prozedurales. nochmal vielen Dank.
Ich habe noch eine kleine Frage, falls du noch heute oder auch morgen liest: Wie kann ich diese Prozerure zufällig machen? Also, wenn ich die Positionen (Ist- und ZielPosition) zufällig ausgewählt werden sollen.
Ich danke nochmal.

Merick
 
Ich war OOP und konnte nix prozedurales.
kann ich gut nachvollziehen^^ musste mich auch ganz schön überwinden keine Objekte zu benutzen xD

auf die schnelle hingeschrieben:
Java:
static void randomCalculation(){
  Random random = new Random();
  int[] istRegal= getLine(random.nextInt(4));
  int[] zielRegal= getLine(random.nextInt(4));
  int istX = random.nextInt(getLength(istRegal));
  int zeilX = random.nextInt(getLength(zielRegal));
  int dis = otherCalculation(istRegal, istX, zielRegal, zielX);
  //schöne ausgabe des ganzen^^
}

static int[] getLine(int i){
  switch(i){
   case 0: return lineAB;
   case 1: return lineBC;
   case 2: return lineCD;
   case 3: return lineDA;
   default: return null;
  }
}

//für die ausgabe^^
static String getName(int[] regal){
  if(regal == lineAB) return "lineAB";
  else if(regal == lineBC) return "lineBC";
  else if(regal == lineCD) return "lineCD";
  else return "lineDA";
}
 

Neue Themen


Zurück
Oben