Создание линейного градиента в 2D массиве

Ваша проблема в том, что ваш хранит строку category.tagCategoryName:





В ng-options у вас есть category as category.tagCategoryName for category in categories , который говорит: «Сохраняйте объект категории в моей области и используйте tagCategoryName в качестве отображаемого имени для каждой категории в категориях»

Для ваших радиостанций у вас установлено ng-value в качестве строки category.tagCategoryName так вот что привязано к вашей сфере. Итак, выбор использовал объект, радио использовал строку. Я исправил это, обновив радио, чтобы просто использовать category в качестве значения:


Вот рабочий планер .

5
задан Glorfindel 28 February 2019 в 14:00
поделиться

3 ответа

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

  1. Определите линейную функцию (как y = x + 1) с доменом (т.е. x) являющийся от цвета, с которого Вы хотите запуститься к цвету Ваш хотеть закончиться. Можно думать об этом с точки зрения диапазона в Ox0 к OxFFFFFF (для цвета на 24 бита). Если Вы хотите обработать вещи как яркость, необходимо будет сделать некоторые приемы с диапазоном (т.е. значение y).
  2. Затем необходимо отобразить вектор через матрицу, которую Вы имеете, поскольку это определяет направление, в котором изменят цвета. Кроме того, значения цвета, определенные Вашей линейной функцией, будут присвоены в каждой точке вдоль вектора. Запуск и конечная точка вектора также определяют минуту и макс. домена в 1. Можно думать о векторе как об одной строке градиента.
  3. Для каждой ячейки в матрице цветам можно присвоить значение от вектора, где перпендикулярная строка от ячейки пересекает вектор. См. схему ниже, где c является положением ячейки и. точка пересечения. Если Вы притворяетесь что цвет в. является Красным, затем это - то, что Вы присвоите ячейке.
             |
             c
             |
             |
    Vect:____.______________
             |
             |

3
ответ дан 18 December 2019 в 09:10
поделиться

Я просто отправлю свое решение.

int ColourAt( int x, int y )
{
  float imageX = (float)x / (float)BUFFER_WIDTH;
  float imageY = (float)y / (float)BUFFER_WIDTH;

  float xS = xStart / (float)BUFFER_WIDTH;
  float yS = yStart / (float)BUFFER_WIDTH;
  float xE = xEnd / (float)BUFFER_WIDTH;
  float yE = yEnd / (float)BUFFER_WIDTH;
  float xD = xE - xS;
  float yD = yE - yS;

  float mod = 1.0f / ( xD * xD + yD * yD );

  float gradPos = ( ( imageX - xS ) * xD + ( imageY - yS ) * yD ) * mod;

  float mag = gradPos > 0 ? gradPos < 1.0f ? gradPos : 1.0f : 0.0f;

  int colour = (int)( 255 * mag );
  colour |= ( colour << 16 ) + ( colour << 8 );
  return colour;
}

Для взлетов скорости кэшируйте полученные значения "направления" (подсказка: предварительно умножьтесь mag).

1
ответ дан 18 December 2019 в 09:10
поделиться

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

Математически, то, что я имею в виду:

  1. Скажите, что Ваша начальная точка (x1, y1), и Ваша конечная точка (x2, y2)
  2. Вычислить A = (x2 - x1) и B = (y2 - y1)
  3. Вычислить C1 = A * x1 + B * y1 для начальной точки и C2 = A * x2 + B * y2 для конечной точки (C2 должно быть больше, чем C1)
  4. Для каждой точки в изображении вычислить C = A * x + B * y
  5. Если C <= C1, используйте начальный цвет; если C >= C2, используйте конечный цвет; иначе используйте взвешенное среднее:

    (start_color * (C2 - C) + end_color * (C - C1))/(C2 - C1)

Я сделал некоторые быстрые тесты, чтобы проверить, что это в основном работало.

14
ответ дан 18 December 2019 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: