<commit_before>package model.leveleditor;

import model.Matrix;
import model.drawables.Point;

//TODO Kommentar
/**
 * 
 * @author lhembrock
 *
 */
public class Coordinates {
	
	// Ursprüngliche Position des Punktes
	private final double x;
	private final double y;
	
	// Position des Punktes 
	private double posx;
	private double posy;
	
	// Winkel, um den der Ursprüngliche Punkt gedreht wurde
	// in Gradmaß, maximal 360°
	private int angle;
	
	// Faktor, um den skaliert wird
	private static int factor = 10;
	
	/**
	 * Konstruktor für einen zweidimesionalen Punkt
	 * @param x x-Koordinate
	 * @param y y-Koordinate
	 */
	public Coordinates(double x, double y){
		this.x = x;
		this.posx = x;
		
		this.y = y;
		this.posy = y;
		
		this.angle = 0;
	}
	
	/**
	 * Copy-Konstruktor
	 */
	public Coordinates(Coordinates toCopy) {
		
		this.x = toCopy.getX();
		this.posx = toCopy.getPosx();
		
		this.y = toCopy.getPosy();
		this.posy = toCopy.getPosy();
		
		this.angle = toCopy.getAngle();
	}
	/**
	 * Gibt die aktuellen Koordinaten umgerechnet in int und skaliert zurück
	 * @param factor Faktor, um den skaliert wird
	 * @return int-Koordinaten
	 */
	public Point getScaledIntCoordinates() {
		// Basis Trafo der Koordinatensysteme
		int x = (int) ((factor * this.posx) + 0.5);
		int y = (int) ((factor * this.posy) + 0.5);
				
		return new Point(x,y);
	}
	
	/**
	 * Nimmt einen Punkt mit int-Koordinaten und setzt damit die Position neu
	 * @param point Neue Position
	 */
	public void setScaledIntCoordinates(Point point) {
		
		double x = point.x / factor;
		double y = point.y / factor;
		
		this.posx = x;
		this.posy = y;
		
	}
	
	/**
	 * Umrechnung von Punkt zu Vektor
	 * @return berechneter Vektor
	 */
	public Coordinates getVector() {
		
		Coordinates v = new Coordinates(0, 0);
		
		v.setPosx(getX());
		v.setPosy(getY());
		
		return v;
	}
	<commit_msg>added the ability to scale correctly by matrix in Coordinates, implementation in Room and Way needed<commit_after>package model.leveleditor;

import model.Matrix;
import model.drawables.Point;

//TODO Kommentar
/**
 * 
 * @author lhembrock
 *
 */
public class Coordinates {
	
	// Ursprüngliche Position des Punktes
	private final double x;
	private final double y;
	
	// Position des Punktes 
	private double posx;
	private double posy;
	
	// Winkel, um den der Ursprüngliche Punkt gedreht wurde
	// in Gradmaß, maximal 360°
	private int angle;
	
	// Faktor, um den skaliert wird
	private static int factor = 10;
	
	/**
	 * Konstruktor für einen zweidimesionalen Punkt
	 * @param x x-Koordinate
	 * @param y y-Koordinate
	 */
	public Coordinates(double x, double y){
		this.x = x;
		this.posx = x;
		
		this.y = y;
		this.posy = y;
		
		this.angle = 0;
	}
	
	/**
	 * Copy-Konstruktor
	 */
	public Coordinates(Coordinates toCopy) {
		
		this.x = toCopy.getX();
		this.posx = toCopy.getPosx();
		
		this.y = toCopy.getPosy();
		this.posy = toCopy.getPosy();
		
		this.angle = toCopy.getAngle();
	}
	/**
	 * Gibt die aktuellen Koordinaten umgerechnet in int und skaliert zurück
	 * @param factor Faktor, um den skaliert wird
	 * @return int-Koordinaten
	 */
	public Point getScaledIntCoordinates() {
		// Basis Trafo der Koordinatensysteme
		int x = (int) ((factor * this.posx) + 0.5);
		int y = (int) ((factor * this.posy) + 0.5);
				
		return new Point(x,y);
	}
	
	public Point getScaledIntCoordinates(Coordinates p) {
		// Basis Trafo der Koordinatensysteme
		double[][] translate = {{1, 0, -p.getPosx()}, 
				{0, 1, -p.getPosy()},{0,0,1}};
		
		Matrix translateTo = new Matrix(translate);
		
		translate[0][2] = p.getPosx();
		translate[1][3] = p.getPosy();
		
		Matrix translateFrom = new Matrix(translate);
		
		double[][] scale = {{5, 0, 0}, 
				{0, 5, 0},{0,0,1}};
		
		Matrix scaling = new Matrix(scale);
		
		double[][] arrPoint = {{this.posx}, 
				{this.posy},{1}};
		
		Matrix matPoint = new Matrix(arrPoint);
		
		matPoint = translateTo.multiply(matPoint);
		matPoint = scaling.multiply(matPoint);
		matPoint = translateFrom.multiply(matPoint);
		
		
		Point point = new Point((int)matPoint.getValue(0, 0),(int) matPoint.getValue(1, 0));
		return point;
	}
	
	
	/**
	 * Nimmt einen Punkt mit int-Koordinaten und setzt damit die Position neu
	 * @param point Neue Position
	 */
	public void setScaledIntCoordinates(Point point) {
		
		double x = point.x / factor;
		double y = point.y / factor;
		
		this.posx = x;
		this.posy = y;
		
	}
	
	/**
	 * Umrechnung von Punkt zu Vektor
	 * @return berechneter Vektor
	 */
	public Coordinates getVector() {
		
		Coordinates v = new Coordinates(0, 0);
		
		v.setPosx(getX());
		v.setPosy(getY());
		
		return v;
	}
	
{'fraction_non_alphanumeric': 0.12532299741602068, 'fraction_numerical': 0.010551248923341947, 'mean_word_length': 3.0077653149266608, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4759853', 'n_tokens_mistral': 1915, 'n_tokens_neox': 1651, 'n_words': 460}