13,199,852 members (69,796 online)
Add your own
alternative version

#### Stats

120.4K views
2.3K downloads
88 bookmarked
Posted 23 Jul 2007

# Mapping Images on Spherical Surfaces Using C#

, 15 Jul 2016
 Rate this:
Please Sign up or sign in to vote.
Mapping images on spherical surfaces using C#

## Introduction

This article describes how to map a flat 2D image (JPG, BMP, or GIF) on a sphere by using basic algebra.

The process is very simple where the x axis of the image will be mapped on sphere longitudes and the y axis of the image will be mapped on sphere latitudes.

The process of mapping is similar to proportion equations x-x0/y-y0 = px-x0/py-y0

```public static double MapCoordinate(double i1, double i2, double w1,
double w2, double p)
{
return ((p - i1) / (i2 - i1)) * (w2 - w1) + w1;
}```

Original image

Resulting image

## Background

### A Sphere Can Be Represented by Spherical Coordinates in R3

• radius
• phi (latitude angle)
• theta (longitude angle)

#### Image 2

• Where radius is a constant, phi=[-PI/2,PI/2], and theta=[0,2*PI]

### To Find the Cartesian Coordinates from Spherical Coordinates

• x = radius * sin(phi) * cos(theta)
• y = radius * sin(phi) * sin(theta)
• z = radius * cos(theta)
```double phi0 = 0.0;
double phi1 = Math.PI;
double theta0 = 0.0;
double theta1 = 2.0*Math.PI;```

## The Code

At first we code the image loading

```System.Drawing.Image image1 = new Bitmap(Server.MapPath(
"./images/worldmap4.gif"));
Bitmap imgBitmap = new Bitmap(image1);```

Now we make a loop through the 2 dimensions of the image, map phi and theta angles from image coordinates, get the cartesian 3D coordinates from phi and theta, provide some rotation to the obtained 3D points and plot them with respective image color:

```for (int i = 0; i < imgBitmap.Width; i++)
{
for (int j = 0; j < imgBitmap.Height; j++)
{
// map the angles from image coordinates
double theta = Algebra.MapCoordinate(0.0, imgBitmap.Width - 1,
theta1, theta0, i);
double phi = Algebra.MapCoordinate( 0.0, imgBitmap.Height - 1,phi0,
phi1, j);
// find the cartesian coordinates
double x = radius * Math.Sin(phi) * Math.Cos(theta);
double y = radius * Math.Sin(phi) * Math.Sin(theta);
double z = radius * Math.Cos(phi);
// apply rotation around X and Y axis to reposition the sphere
RotX(1.5, ref y, ref z);
RotY(-2.5, ref x, ref z);
// plot only positive points
if (z > 0)
{
Color color = imgBitmap.GetPixel(i, j);
Brush brs = new SolidBrush(color);
int ix = (int)x + 100;
int iy = (int)y + 100;
graphics.FillRectangle(brs, ix, iy, 1, 1);
brs.Dispose();
}
}
}```

## The Rotation Functions [almost forgot]

Actually I made a 3D Math class, but here you will need only these functions

```public static void RotX(double angle, ref double y, ref double z)
{
double y1 = y * System.Math.Cos(angle) - z * System.Math.Sin(angle);
double z1 = y * System.Math.Sin(angle) + z * System.Math.Cos(angle);
y = y1;
z = z1;
}
public static void RotY(double angle, ref double x, ref double z)
{
double x1 = x * System.Math.Cos(angle) - z * System.Math.Sin(angle);
double z1 = x * System.Math.Sin(angle) + z * System.Math.Cos(angle);
x = x1;
z = z1;
}
public static void RotZ(double angle, ref double x, ref double y)
{
double x1 = x * System.Math.Cos(angle) - y * System.Math.Sin(angle);
double y1 = x * System.Math.Sin(angle) + y * System.Math.Cos(angle);
x = x1;
y = y1;
}```

See sample

## License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)

## About the Author

 Engineer Brazil
Senior Analyst

Linkedin Profile

## You may also be interested in...

 Pro Pro

## Comments and Discussions

 First PrevNext
 How do you avoid clashes with remapped pixels? JWhattam11-Nov-15 12:47 JWhattam 11-Nov-15 12:47
 Can not find the complete ource code mans.098724-Jan-13 5:02 mans.0987 24-Jan-13 5:02
 My vote of 5 manoj kumar choubey26-Feb-12 21:44 manoj kumar choubey 26-Feb-12 21:44
 Any ideas to make it faster? Tiramisung1-Apr-10 16:16 Tiramisung 1-Apr-10 16:16
 Re: Any ideas to make it faster? andalmeida2-Apr-10 3:55 andalmeida 2-Apr-10 3:55
 Re: Any ideas to make it faster? Tiramisung4-Apr-10 22:07 Tiramisung 4-Apr-10 22:07
 Re: Any ideas to make it faster? simonxy17-Aug-15 23:55 simonxy 17-Aug-15 23:55
 Re: Any ideas to make it faster? CodeWraith29-Jun-17 2:56 CodeWraith 29-Jun-17 2:56
 I really upset! Mr. Cencious12-Nov-07 23:28 Mr. Cencious 12-Nov-07 23:28
 Re: I really upset! andalmeida13-Nov-07 0:56 andalmeida 13-Nov-07 0:56
 Re: I really upset! Mr. Cencious15-Nov-07 16:15 Mr. Cencious 15-Nov-07 16:15
 Re: I really upset! Mr. Cencious29-Nov-07 20:41 Mr. Cencious 29-Nov-07 20:41
 Rotation seeblunt11-Aug-07 17:36 seeblunt 11-Aug-07 17:36
 Re: Rotation seeblunt11-Aug-07 18:02 seeblunt 11-Aug-07 18:02
 Re: Rotation andalmeida12-Aug-07 14:04 andalmeida 12-Aug-07 14:04
 Mapping an image Cylindrical Surface zhongyisun10-Aug-07 6:27 zhongyisun 10-Aug-07 6:27
 Re: Mapping an image Cylindrical Surface andalmeida10-Aug-07 7:24 andalmeida 10-Aug-07 7:24
 Re: Mapping an image Cylindrical Surface zhongyisun10-Aug-07 7:45 zhongyisun 10-Aug-07 7:45
 Curve tracing algorithm GD602-Aug-07 12:09 GD60 2-Aug-07 12:09
 Re: Curve tracing algorithm andalmeida3-Aug-07 2:50 andalmeida 3-Aug-07 2:50
 Re: Curve tracing algorithm GD605-Aug-07 11:03 GD60 5-Aug-07 11:03
 Why? Paul Selormey23-Jul-07 20:41 Paul Selormey 23-Jul-07 20:41
 Re: Why? andalmeida24-Jul-07 2:39 andalmeida 24-Jul-07 2:39
 Re: Why? andalmeida25-Jul-07 5:57 andalmeida 25-Jul-07 5:57
 About disposing, i thought it was released by garbage collection after loosing scope?!? Thanks again Anderson J. Almeida Systems Analyst SimSysBr
 Re: Why? Paul Selormey25-Jul-07 6:24 Paul Selormey 25-Jul-07 6:24
 Last Visit: 31-Dec-99 18:00     Last Update: 22-Oct-17 19:15 Refresh 12 Next »

General    News    Suggestion    Question    Bug    Answer    Joke    Praise    Rant    Admin

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.171020.1 | Last Updated 15 Jul 2016
Article Copyright 2007 by andalmeida
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid