Вспомогательные функции RotateFlipType? - PullRequest
0 голосов
/ 25 января 2012

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

Например, в любой момент времени я хочу сохранить одно перечисление RotateFlipType, предоставляя пользователю доступ к кнопкам, позволяющим переворачивать и поворачивать один щелчок за раз. Мне нужно сохранить это позже, когда мне нужно применить RotateFlipType к данным.

Так что в основном мне нужно хранить все отдельно для нескольких переменных. Или мне нужна логика, такая как:

private RotateFlipType ApplyHorizontalFlip(RotateFlipType oldFlip)
{
    switch (oldFlip)
    {
        case RotateFlipType.Rotate180FlipNone:
            return RotateFlipType.RotateNoneFlipNone;

        case RotateFlipType.Rotate180FlipX:
            return RotateFlipType.RotateNoneFlipX;

        case RotateFlipType.Rotate180FlipXY:
            return RotateFlipType.RotateNoneFlipXY;

        case RotateFlipType.Rotate180FlipY:
            return RotateFlipType.RotateNoneFlipY;

        case RotateFlipType.Rotate270FlipNone:
            return RotateFlipType.Rotate90FlipNone;

        // etc...
    }
}

Есть ли какие-нибудь вспомогательные методы, встроенные в фреймворк, или о которых кто-нибудь знает? В основном, чтобы взять любой существующий RotateFlipType и изменить его, поворачивая или переворачивая, чтобы дать новое значение.

1 Ответ

0 голосов
/ 27 января 2012

Мой подход - хранить флип и вращение отдельно до момента рендеринга. Я использую RotateFlipType для обратного значения и число для степени. Я использую эти методы, чтобы объединить их в соответствующее значение RotateFlipType.

Я бы предложил использовать свой собственный enum вместо RotateFlipType, как я это делал здесь, особенно если это выставлено как внешний API.

    private double normalizeTo90Intervals(double d){
        d = d % 360; //Coalesce multiples
        if (d < 0) d += 360; //Force positive
        //Use manual rounding
        if (d >= 315 && d < 360) return 0;
        if (d >= 0 && d < 45) return 0;
        if (d >=45 && d < 135) return 90;
        if (d >= 135 && d < 225) return 180;
        if (d >= 225 && d < 315) return 270;
        return 0; //to make compiler happy
    }

    private RotateFlipType combineFlipAndRotate(RotateFlipType flip, double angle) {
        angle = normalizeTo90Intervals(angle);
        if (flip == 0) return (RotateFlipType)(int)(angle / 90);
        else if (flip == (RotateFlipType)4) return (RotateFlipType)(int)(4 + (angle / 90));
        else if (flip == (RotateFlipType)6) {
            if (angle == 0) return (RotateFlipType)6;
            if (angle == 90) return (RotateFlipType)7;
            if (angle == 180) return (RotateFlipType)4;
            if (angle == 270) return (RotateFlipType)5;
        } else if (flip == (RotateFlipType)2) {
            if (angle == 0) return (RotateFlipType)2;
            if (angle == 90) return (RotateFlipType)3;
            if (angle == 180) return (RotateFlipType)0;
            if (angle == 270) return (RotateFlipType)1;
        }

        throw new ArgumentException("Valid flip values are RotateNoneFlipNone, RotateNoneFlipX, RotateNoneFlipY, and RotateNoneFlipXY. Rotation must be specified with Rotate or srcRotate instead. Received: " + flip.ToString());
    }

К вашему сведению, вы слышали о http://imageresizing.net/?

...