/*
 * GnomonicImageProjection.java  1.0  98/06/03  Carl Burke
 *
 * Provides a gnomonic projection of data on a sphere.
 *
 * Copyright (c) 1998 Carl Burke.
 *
 * Derived from code in planet.c Copyright 1998 Torben AE. Mogensen
 */

public class GnomonicImageProjection extends ImageProjection
{
    public GnomonicImageProjection(int w, int h, SolidNoiseGenerator sng)
    {
	super(w, h, sng);
    }
    double ymin;
    double ymax;
    public void renderTerrain()
    {
  double x,y,z,x1,y1,z1,zz,theta1,theta2;
  int i,j;

  ymin = 2.0;
  ymax = -2.0;
  SNG.setScaling(scale, Width, Height);
  for (j = 0; j < Height; j++) {
    for (i = 0; i < Width ; i++) {
      x = (2.0*i-Width)/Height/scale;
      y = (2.0*j-Height)/Height/scale;
      zz = Math.sqrt(1.0/(1.0+x*x+y*y));
      x = x*zz;
      y = y*zz;
      z = Math.sqrt(1.0-x*x-y*y);
      x1 = clo*x+slo*sla*y+slo*cla*z;
      y1 = cla*y-sla*z;
      z1 = -slo*x+clo*sla*y+clo*cla*z;
      if (y1 < ymin) ymin = y1;
      if (y1 > ymax) ymax = y1;
      pixels[j*Width+i] = SNG.color(x1,y1,z1);
    }
  }
}
    public void renderLatitudes()
    {
	double x,y,z,x1,y1,z1,zz,theta1,theta2;
	int i,j,k;

	for (theta1 = 0.0; theta1>-90.0; theta1-=hgrid);
	for (theta1 = theta1; theta1<90.0; theta1+=hgrid) {
	  y = Math.sin(DEG2RAD*theta1);
	  if (ymin <= y && y <= ymax) {
	    zz = Math.sqrt(1-y*y);
	    for (theta2=-Math.PI; theta2