От прямой до изогнутой - PullRequest
1 голос
/ 03 мая 2011

Я пытаюсь придумать методику составления карты высот для метеорного кратера. Я пытаюсь сохранить его небольшим и простым на данный момент, и у меня есть простой алгоритм, в котором отмечен центр кратера, а в пределах его радиуса пиксели вокруг него окрашены в зависимости от того, насколько близко они находятся к центру.

Проблема с этим методом в том, что он производит V-образные кратеры, мне нужны более U-образные результаты. Я не знаком с использованием синусоидальных волн и чувствую, что интерполяция не будет работать очень быстро, учитывая, сколько пикселей может быть внутри радиуса метеора.

Есть предложения?

1 Ответ

2 голосов
/ 03 мая 2011

Я предполагаю, что у вас есть текстура или другой формат изображения, который можно индексировать по ширине и высоте (x, y), и что кратер также указан в x, y с x, y внутри текстуры, это приведет к созданию алгоритма как это.

Texture2D texture = ...;
Vector2 craterPosition = new Vector2(50,50);
double maxDistance = Math.Sqrt(Math.Pow(texture.Width,2) + Math.Pow(texture.Height,2));
for(int x = 0; x < texture.Width; x++)
{
    for(int y = 0; y < texture.Height; y++)
    {
        double distance = Math.Sqrt(Math.Pow(x - craterPosition.x, 2) + Math.Pow(y - craterPosition.y, 2));
        //the lower distance is, the more intense the impact of the crater should be
        //I don't know your color scheme, but let's assume that R=0.0f is the lowest point and R = 1.0f is the highest
        distance /= maxDistance;
        double height = (Math.Cos(distance * Math.Pi + Math.Pi) + 1.0) / 2.0;
        texture[x,y] = new Color((float)height,0,0,1);        
    }
}

Самая важная строка здесь, вероятно,

double height = (Math.Cos(distance * Math.Pi + Math.Pi) + 1.0) / 2.0;

Взгляните на косинусную кривую http://upload.wikimedia.org/wikipedia/commons/thumb/b/b6/Cos.svg/500px-Cos.svg.png у нее приятное плавное округлое округление от Pi до TwoPi. Поскольку наша переменная расстояния масштабируется от 0 до 1, мы используем расстояние * Pi + Pi. Но это даст нам результат от -1 до 1. Таким образом, мы добавляем 1 к конечному результату, а затем делим на 2, чтобы получить плавный результат для высоты между 0 и 1.

Надеюсь, это поможет вам.

...