content: package edu.stanford.rsl.tutorial.ringArtifactCorrection;
  
  import edu.stanford.rsl.conrad.data.numeric.Grid2D;
  import edu.stanford.rsl.conrad.data.numeric.InterpolationOperators;
  
  /*
   * Helper class to converter from/to cartesian and polar coordinates. 
   */
  
  public class PolarConverter {
  	int widthCartesian, heightCartesian, widthPolar, heightPolar;
  	double centerX, centerY;
  	
  	/*
  	 * Main conversion method to go from cartesian to polar coordinates
  	 */
  	public Grid2D convertToPolar(Grid2D cartesian) {
  		this.setPolarGridSize(cartesian);
  		Grid2D polar = new Grid2D(widthPolar, heightPolar);
  		for (int x=0; x<widthPolar; x++) {
  			for (int y=0; y<heightPolar; y++) {
  				double radius = x;
  				double theta = y/360.0 * Math.PI * 2;
  				double realX = getXFromPolar(radius, theta) + centerX;
  				double realY = getYFromPolar(radius, theta) + centerY;
  				float value = InterpolationOperators.interpolateLinear(cartesian, realX, realY);
  				polar.putPixelValue(x, y, value);
  				
  			}
  		}
  		return polar;
  	}
  	
  	/*
  	 * Main conversion method to go from polar to cartesian coordinates
  	 */
  	public Grid2D convertToCartesian(Grid2D polar) {
  		this.setCartesianGridSize(polar);
  		Grid2D cartesian = new Grid2D(widthCartesian, heightCartesian);
  		for (int x=0; x<widthCartesian; x++) {
  			for (int y=0; y<heightCartesian; y++) {
  				double realX = x - centerX;
  				double realY = y - centerY;
  				double radius = this.getRadiusFromCartesian(realX, realY);
  				double theta = this.getAngleFromCartesian(realX, realY);
  				realX = radius;
  				realY = theta * (heightPolar/360.0);
  				float value = InterpolationOperators.interpolateLinear(polar, realX, realY);
  				cartesian.putPixelValue(x, y, value);
  			}
  		}
  		return cartesian;
  	}
  	
  	/*
  	 * Helper method to set up the grid for cartesian -> polar conversion.
  	 */
  	private void setPolarGridSize(Grid2D cartesian) {
  		widthCartesian = cartesian.getWidth();
  		heightCartesian = cartesian.getHeight();
  		centerX = widthCartesian / 2.0f;
  		centerY = heightCartesian / 2.0f;
  		heightPolar = 360; // use y-axis for angles
  		widthPolar = widthCartesian;
  	}
  	
  	/*
  	 * Helper method to set up the grid for polar -> cartesian conversion.
  	 */
  	private void setCartesianGridSize(Grid2D polar) {
  		widthPolar = polar.getWidth();
  		heightPolar = polar.getHeight();
  		widthCartesian = widthPolar;
  		heightCartesian = widthPolar;
  		centerX = widthCartesian / 2.0f;
  		centerY = heightCartesian / 2.0f;
  	}
  	
  	/*
  	 * Calculate cartesian x coordinate from polar radius and angle(theta).
  	 */
  	private double getXFromPolar(double r, double theta) {
  		return r*Math.cos(theta);
  	}
  	
  	/*
  	 * Calculate cartesian y coordinate from polar radius and angle(theta).
  	 */
  	private double getYFromPolar(double r, double theta) {
  		return r*Math.sin(theta);
  	}
  	
  	/*
  	 * Calculate polar radius coordinate from cartesian x and y.
  	 */
  	private double getRadiusFromCartesian(double x, double y) {
  		return Math.sqrt((x*x)+(y*y));
  	}
  	
  	/*
  	 * Calculate polar angle (theta) coordinate from cartesian x and y.
  	 */
  	private double getAngleFromCartesian(double x, double y) {
  		double angle = Math.toDegrees(Math.atan2(y, x));
  		if (angle < 0) {
  			angle += 359; //correction to give angle between 0 and 360 deg
  		}
  		return angle;
  	}
  	
  
  }
  /*
   * Copyright (C) 2010-2015 Florian Gabsteiger
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */
  