C# Обертывание двумерного массива в сферу

Я пишу процедурный генератор планет, и у меня есть ландшафт, работающий с 2D-массивом. Последнее, что мне нужно сделать, это иметь возможность «обернуть» или преобразовать массив в проекцию земного шара.

Он должен быть только в 2D, чтобы можно было игнорировать одно полушарие. В настоящее время массив представляет собой аспект 2:1.

Сгенерированный массив рельефа размером 512x256

Желаемый результат

Спасибо.


person EVG Labs    schedule 04.08.2016    source источник
comment
Может быть, вы хотите взглянуть на этот вопрос? stackoverflow.com/questions/12732590/. Я думаю, это зависит от того, какую проекцию вы хотите.   -  person Sören Titze    schedule 04.08.2016


Ответы (1)


Ключевая идея здесь состоит в том, чтобы отобразить ось x изображения на долготе сферы, а ось y изображения будет отображена на широте сферы.

Ниже приведен код из CodeProject, благодаря andalmeida:

Здесь идет сопоставление координат:

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

Загрузите изображение:

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

Функции вращения:

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;
     }

во время цикла по 2 измерениям изображения, сопоставьте углы фи и тета из координат изображения, получите декартовы 3D-координаты из фи и тета, придайте некоторое вращение полученным 3D-точкам и нанесите их на соответствующий цвет изображения:

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();
              }
          }
     }
person Рахул Маквана    schedule 04.08.2016
comment
Пожалуйста, предоставьте больше информации. Ответы только по ссылкам ненадежны - если URL-адрес становится мертвым, сообщение больше не дает ответа. - person Pikalek; 05.08.2016
comment
@Pikalek Я согласен с тобой, вот. - person Рахул Маквана; 05.08.2016