Kartläggning bilder på sfäriska ytor med C #

introduktion
I den här artikeln beskrivs hur du ansluter en platt 2D-bild (JPG, BMP eller GIF) på en sfär med hjälp av grundläggande algebra.

Processen är mycket enkel där x-axeln av bilden kommer att kartläggas på sfär longituder och y-axeln av bilden kommer att kartläggas på sfär breddgrader.

Processen för kartläggning liknar andel ekvationer x-x0/y-y0 = px-x0/py-y0

public static dubbel MapCoordinate (dubbel i1, i2 dubbel, dubbel w1,
double w2, dubbla p)
{
avkastning ((p – i1) / (i2 – i1)) * (w2 – w1) + w1;
}
Ursprunglig bild

Resulterande bilden

bakgrund
en sfär kan representeras av sfäriska koordinater i K3
• radie
• phi (latitud vinkel)
• theta (longitud vinkel)
bild 2
• När radie är en konstant, phi = [-PI / 2, PI / 2], och theta = [0,2 * PI]

att hitta de kartesiska koordinaterna från sfäriska koordinater
• x = radie * sin (phi) * cos (theta)
• y = radie * sin (phi) * sin (theta)
• z = radien * cos (theta)
dubbel phi0 = 0,0;
dubbel fi1 = Math.PI;
dubbel theta0 = 0,0;
dubbel theta1 = 2,0 * Math.PI; Koden
Vid första vi koda bilden lastning

System.Drawing.Image Bild1 = new Bitmap (Server.MapPath (
“./images/worldmap4.gif”));
Bitmap imgBitmap = new Bitmap (bild1), Nu gör vi en slinga genom de 2 måtten på bilden, kartan phi och thetavinklar från bildkoordinater, få den cartesianska 3D koordinaterna från phi och theta, ge viss rotation på de erhållna 3D-punkter och plotta dem med respektive bild färg:

for (int i = 0; I
{
for (int j = 0; j 0)
{
Color color = imgBitmap.GetPixel (i, j);
Borsta brs = ny SolidBrush (färg);
int ix = (int) x + 100;
int iy = (int) y + 100;
graphics.FillRectangle (brs, ix, iy, 1, 1);
brs.Dispose ();
}
}
} Rotationen funktioner [nästan glömt]
Egentligen gjorde jag en 3D Math klass, men här behöver du bara dessa funktioner

public void RotX (dubbla vinkeln, ref double y, ref double z)
{
double y1 = y * System.Math.Cos (vinkel) – z * System.Math.Sin (vinkel);
dubbel z1 = y * System.Math.Sin (vinkel) + z * System.Math.Cos (vinkel);
y = y1;
z = z1;
}
public void Roty (dubbla vinkeln, ref double x, ref double z)
{
double x1 = x * System.Math.Cos (vinkel) – z * System.Math.Sin (vinkel);
dubbel z1 = x * System.Math.Sin (vinkel) + z * System.Math.Cos (vinkel);
x = x1;
z = z1;
}
public static void Rotz (dubbla vinkeln, ref double x, ref double y)
{
double x1 = x * System.Math.Cos (vinkel) – y * System.Math.Sin (vinkel);
dubbel y1 = x * System.Math.Sin (vinkel) + y * System.Math.Cos (vinkel);
x = x1;
y = y1;
}

anderson almeida
http://v2.tihunter.com