# How to translate the center of an equirectangular projection?

Computer Graphics Asked by Lucio Coire Galibone on March 3, 2021

I’m trying to perfectly align two or more equirectangular photos of the same place taken from slightly different positions.
Using an example provided by openMVG I managed to get the relative position between the two shots, but I can’t figure out how to translate the center of the projection according to the data obtained.
I tried with Hugin without success, editing the camera position information (it doesn’t seem to be able to export the entire equirectangular photo) and I didn’t found any useful panotools. I found some literature about the problem but not any real implementation to adapt.

Could you advise me of a possible path to follow?

My requirement is to do it programmatically because I will have to apply it to thousands of photos.

Thanks a lot.

An equirectangular projection treats the x coordinate as the angle theta around the vertical axis going from 0 to 360 degrees. These angles match the longitudinal angles of a globe. The y coordinate is treated as the angle phi that represents the latitudes of a globe. They typically go from +90° at the zenith (or north pole) to -90° at the nadir (or south pole).

So to translate the center of projection of an image by some amount (x0, y0), you can simply add x0 to the x value of every coordinate (wrapping around to the other side at the edges). The y coordinate is similar - add y0 to every coordinate. However, instead of wrapping around, you need to reflect the value. So if your new coordinate is less than 0, simply take the absolute value. If it's greater than the height, take the difference between the new value and the height of the image and subtract that from the height of the image. If it was less than 0 or greater than height then you need to also add half the width to the x coordinate.

So putting it in pseudocode:

newY = oldY + translateY;
if (newY < 0)
{
newY = fabs(newY);
translateX = fmod((translateX + (width / 2.0)), width);
}
else if (newY >= height)
{
newY = height - (newY - height);
translateX = fmod((translateX + (width / 2.0)), width);
}
newX = oldX + translateX;
if (newX < 0)
{
newX = width + newX;
}
else if (newX >= width)
{
newX = newX - width;
}


Answered by user1118321 on March 3, 2021

## Related Questions

### Is there an algorithm to bold an outline font?

2  Asked on December 23, 2021

### alternative to spherical harmonics to model radiance aproximation, optimized for real-time evaluation

0  Asked on December 14, 2021

### Transfer the texture between two different sets of uv

1  Asked on December 9, 2021

### How to retrieve data from Compute Shader to CPU?

0  Asked on November 15, 2021 by ethan-ma

### unwanted patterns in simplex noise

1  Asked on November 13, 2021 by sam-apostel

### Procedural generation of biological models

1  Asked on November 13, 2021 by daniel-cooke

### What method is used for baking grayscale curvature maps

1  Asked on November 10, 2021 by jummit

### Why are texture coordinates often called UVs?

2  Asked on August 27, 2021 by samanthaj

### Dynamic Ray-Triangle Intersection

1  Asked on August 27, 2021 by cemklkn

### Reducing artificial rings in mean curvature of mesh

1  Asked on August 27, 2021

### Fast and exact Geodesics on meshes, Backtracking confusion

1  Asked on August 27, 2021

### How to scale signed distance field fonts properly?

1  Asked on August 27, 2021 by endanke

### The ploygon width parallel to the x axis as a function of the y ordonate?

0  Asked on August 27, 2021 by hafid-boukhoulda

### Find the formulas of the middle point algorithm for drawing the parabola?

0  Asked on August 27, 2021 by mrjab

### Crystal ball rotation – I don’t get why the code works

0  Asked on August 27, 2021 by user13665

### Draw Line on Arbitrary Surface

0  Asked on August 27, 2021 by valentin-molina

### How to raytrace Bezier surfaces?

5  Asked on August 27, 2021 by luser-droog