Как бы я представлял HSL и цвет RGB как класс в C #? - PullRequest
0 голосов
/ 23 января 2011

Как мне написать класс на C #, который представляет цвет HSL и цвет RGB?

Можно ли добавить метод, который распечатывает каждый из атрибутов класса, после того, как он у меня есть?Я слышал о ToString(), но я не уверен, как его использовать.

Некоторые примеры кода были бы очень полезны, так как я студент и пытаюсь научиться использовать C #.Спасибо!

1 Ответ

2 голосов
/ 24 января 2011

Люди раздражаются, когда вы публикуете «вопросы», в которых просят других написать код для вас.Многие вопросы от новых пользователей , кажется, просят об этом, и ваш даже делает явно .Надеемся, что это объясняет некоторые негативные реакции, с которыми вы столкнулись у других пользователей: либо в голосовании, либо в закрытии голосования, либо даже в удалении ваших вопросов.Я надеюсь, что это не дало вам такого негативного опыта, что вас отогнали.В будущем вы обнаружите, что люди гораздо охотнее вам помогут, если вы покажете некоторые доказательства того, что пытались помочь себе в первую очередь.Покажите нам некоторый код, который вы написали (но не работает), или предложите несколько возможных способов, которыми вы пытались решить проблему самостоятельно.Большинство вопросов не являются «слишком тривиальными», а скорее не настоящими.Мы не служба написания кода, но мы все равно рады помочь.

При этом я постараюсь продолжать отвечать на вопрос, как я это делал в комментарии.Хотя бы потому, что мне нравятся вопросы кодирования, касающиеся преобразования цветов и цветового пространства.Вопрос о том, как преобразовать цветовые пространства, уже задавался и отвечался несколько раз здесь, на SO.Например, я (и несколько других) предоставил алгоритм (на нескольких разных языках) здесь .Преобразовать любой из них в любой язык, который вы выберете, должно быть просто.

Что касается того, «как мне написать класс для представления значений в этих цветовых пространствах», это довольно просто.Поиск Google также показал бы несколько результатов людей, которые уже сделали то же самое.Лично я рекомендую создать структуру , а не класс, потому что это очень легкий объект и значения цвета неизменны (то есть они не меняются).Это идеально подходит для структуры, и если вам нужно больше объяснений различий, вы можете найти , что вопрос уже уже задан и здесь также ответил .

Но, что бы вы ни выбрали, конечный результат выглядит очень похоже.Я предполагаю, что если это для класса программирования, вас уже научили всему, что вам нужно знать, чтобы сделать это самостоятельно.Это значит, что вы уже должны были узнать о закрытых полях (переменных-членах), открытых свойствах и методах.Вы начнете с создания структуры с 3 закрытыми полями для представления каждого из значений цвета;Оттенок (H), Насыщенность (S) и Легкость (L).Вероятно, каждый из них должен иметь тип Integer, поскольку отдельные значения цвета представляют собой целые числа от 0 до 100 или от 0 до 360. Если вы заботитесь о максимальной точности, вы можете сохранить их как тип Decimal и обработать преобразование вInteger в общественных объектах, которые выставляют их миру, но я сомневаюсь, что это необходимо здесь.В любом случае вам нужно будет создать те общедоступные свойства, которые откроют ваши личные поля миру.Это базовая концепция объектно-ориентированного программирования, и она не должна быть новой для вас.(Если это так, вам действительно нужно остановиться и получить книгу, которая объясняет вам ООП. Не передавайте Go, не собирайте $ 200.) Эти публичные свойства должны быть типа Integer, их должно быть 3 длякаждое из значений отдельных компонентов цвета, и они должны (по крайней мере, если вы создаете неизменную структуру) быть доступными только для чтения (включая только получатель, а не установщик).Как то так:

/// <summary>
/// Represents an HSL color, composed of individual
/// Hue, Saturation, and Lightness attributes.
/// </summary>
public struct HSLColor
{
    private int _hue;
    private int _saturation;
    private int _lightness;

    /// <summary>
    /// The hue attribute of the color.
    /// (This is a value, in degrees, from 0 to 360.)
    /// </summary>
    public int Hue
    {
        get { return _hue; }
    }

    /// <summary>
    /// The saturation attribute of the color.
    /// (This is a percentage between 0 and 100.)
    /// </summary>
    public int Saturation
    {
        get { return _saturation; }
    }

    /// <summary>
    /// The lightness attribute of the color.
    /// (This is a percentage between 0 and 100.)
    /// </summary>
    public int Lightness
    {
        get { return _lightness; }
    }
}

Наконец, вы говорите, что вам нужно переопределить метод ToString. Как вы уже должны были узнать, этот метод предоставляется каждым классом в .NET Framework, потому что он унаследован от базового Object. Конечно, он помечен как virtual, что позволяет вам переопределить его и предоставить собственную реализацию. Самое сложное - выяснить, как должно выглядеть возвращаемое значение. Вы можете выбрать представление цвета в виде триады, показывающей три значения отдельных компонентов. В любом случае вам необходимо использовать метод String.Format , который позволяет создавать строку, включающую «элементы формата», которые заменяются значением соответствующего объекта. Например, вот как я это делаю:

/// <summary>
/// Returns the "(HH, SS, LL)" representation of this HSLColor structure.
/// </summary>
public override string ToString()
{
    return string.Format("({0}, {1}, {2})",
                         this.Hue,
                         this.Saturation,
                         this.Lightness);
}

Этого должно быть достаточно, чтобы начать. Я очень рекомендую вам не просто копировать и вставлять код, указанный здесь, в качестве вашего задания. Вы ничему не учитесь таким образом. Запустите вашу IDE, напишите код самостоятельно и попробуйте несколько различных вариантов. Убедитесь, что вы понимаете, как это работает, что я сделал, и как вы можете сделать это снова самостоятельно. Желаем удачи!

...