public override Color GetPixel(int x, int y) { double theta = (double)x / m_Size.Width * DMS.TAU; //longitude double phi = (double)y / m_Size.Height * DMS.HALFTAU; //angle down from north pole (latitude-ish) Point2D pt = new Point2D(theta, phi); //"unroll" by adding TAU * number of turns to theta, (and then back it off one) while( DMS.TAU * pt.Y > m_x * pt.X ) { pt.X += DMS.TAU; } pt.X -= DMS.TAU; //undo our spiral by rotating it clockwise pt.Theta -= m_alpha; //scale it so that we're referencing the stretched textStrip in it's native resolution pt.Scale(m_stretchedSize.Width / (m_n * m_y)); //unstretch it double horiz = pt.X * 2.0 / m_stretchedSize.Width; // 0 ... 2 horiz -= 1.0; // -1 ... 1 horiz *= m_maxStretched; // -m_maxStretched ... m_maxStretched horiz = unstretch(horiz); // -m_maxUnstretched ... m_maxUnstretched horiz /= m_maxUnstretched; // -1 ... 1 horiz += 1.0; // 0 ... 2 horiz *= 0.5 * m_textStripeSize.Width; // 0 ... textwidth pt.X = horiz; //wind our strip back up so we can reference the right pixel in the source while (pt.X >= m_Source.Width) { pt.X -= m_Source.Width; pt.Y += m_textStripeSize.Height; } if (pt.Y >= m_Source.Height || pt.Y < 0.0 || pt.X < 0.0 ) return m_Blank; return m_Source.GetPixel((int)pt.X, (int)pt.Y); }
public Color GetSpherePixel(Point3D point) { if (mSourceType == DMSImageType.Equirectangular) { //latitude and longitude are pulled straight from spherical coordinates of the 3d pooint double longitude = point.Theta / DMS.TAU; double latitude = point.Phi / DMS.HALFTAU; //but really 0 is at the north pole. if (longitude < 0.0 ) longitude += 1.0; Point2D EquirectangularLocation = new Point2D( longitude, latitude ); return GetPixel(EquirectangularLocation); } else { // we can get the location on a mirror ball image from the spherical coordinates by taking the sin of phi. Point2D MirrorBallLocation = Point2D.FromPolar(Math.Sin(point.Phi/2.0), point.Theta); //the coordinates are from -1 to 1, we need to convert them to 0 to 1 MirrorBallLocation += new Point2D(1, 1); MirrorBallLocation.Scale(0.5); return GetPixel(MirrorBallLocation); } }