Немного графической математики

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Немного графической математики

Сообщение MIT » 17.12.2008 (Ср) 22:42

Есть прямоугольник и есть картинка. Картинку надо вписать в прямоугольник.
Примерно вот так
Изображение

Как?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Немного графической математики

Сообщение Williams » 17.12.2008 (Ср) 23:27

Для отрисовки картинок существует метод .DrawImage. Расчитать положение, думаю, будет несложно.
И вы думаете, что вас оставят в живых после прочтения этого поста?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Немного графической математики

Сообщение MIT » 17.12.2008 (Ср) 23:40

Как нарисовать я знаю. Вопрос в дроугом - в математике.
Например есть прямоугольник 700х300 и картинка 1280х2670. Надо просчитать размер картинки. Руками с пол-пинка не получается, но я знаю, что в .net`е это где-то есть (пример когда-то видел, где - не помню :( )
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Немного графической математики

Сообщение iGrok » 18.12.2008 (Чт) 0:31

MIT писал(а):Как нарисовать я знаю. Вопрос в дроугом - в математике.
Например есть прямоугольник 700х300 и картинка 1280х2670. Надо просчитать размер картинки. Руками с пол-пинка не получается, но я знаю, что в .net`е это где-то есть (пример когда-то видел, где - не помню :( )

А чего именно не получается?
Если руками и "в лоб": смотришь, какое из измерений картинки больше. Уменьшаешь его до нужного размера. Сравниваешь второе измерение. Если оно больше, чем нужно - делаешь пересчёт ещё раз. Всё.

UPD:
А вообще, чтобы не "в лоб" - вот тебе математика:
Код: Выделить всё
Function GetAspect(pw As Long, ph As Long, nw As Long, nh As Long) As Single
Dim wr As Single, hr As Single

    wr = nw / pw
    hr = nh / ph

    GetAspect = IIf(wr < hr, wr, hr)
    Debug.Print "NW: " & GetAspect * pw & vbCrLf & "NH: " & GetAspect * ph
End Function

Это на VB6, но переписать не проблема, да? ,-)
pw, ph - w и h картинки
nw, nh - w и h бокса, куда надо вписать

Работает как в "минус", так и в "плюс".
С центровкой картинки, думаю, сам разберёшься. )
label:
cli
jmp label

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Немного графической математики

Сообщение MIT » 18.12.2008 (Чт) 15:50

Переписать-то не проблема... Вот только толку от твоей функции не очень много (имхо по данной теме)
Примерно таким кодом можно измерить нужные параметры (писал ооооооочень давно, и, почему-то мне кажется, что тут есть ошибки)
Код: Выделить всё
   Private Function Scale(ByVal inImage As Image, ByVal w2 As Integer, ByVal h2 As Integer) As ...
        Dim h1 As Integer = inImage.Height
        Dim w1 As Integer = inImage.Width
        Dim r, r1, r2 As Single

                r1 = h1 / w1 : r2 = h2 / w2

                If r1 > 1 Then
                    If r2 < 1 Then
                        r = h1 / h2
                        w2 = w1 / r
                    ElseIf r2 > 1 Then
                        If r1 > r2 Then
                            r = w1 / w2
                            h2 = h1 / r
                        ElseIf r1 < r2 Then
                            r = h1 / h2
                            w2 = w1 / r
                            'ElseIf r1 = r2 Then 'не используется, т.к. если соотношения одинаковые, то масштабировать не надо
                        End If
                    ElseIf r2 = 1 Then
                        w2 = w1 / (h1 / h2)
                    End If
                ElseIf r1 < 1 Then
                    If r2 > 1 Then
                        r = w1 / w2
                        h2 = h1 / r
                    ElseIf r2 < 1 Then
                        If r1 > r2 Then
                            r = h1 / h2
                            w2 = w1 / r
                        ElseIf r1 < r2 Then
                            r = w1 / w2
                            h2 = h1 / r
                            'ElseIf r1 = r2 Then 'не используется, т.к. если соотношения одинаковые, то масштабировать не надо
                        End If
                    ElseIf r2 = 1 Then
                        h2 = h1 / (w1 / w2)
                    End If
                ElseIf r1 = 1 Then
                    If r2 < 1 Then
                        w2 = h2
                    ElseIf r2 > 1 Then
                        h2 = w2
                        'ElseIf r2 = 1 Then 'не используется, т.к. масштабировать квадрат в квадрат не надо
                    End If
                End If
    End Function

Но я точно знаю, что в .NET уже есть подобная функция, а велосипедоизобретательством заниматься неохото

p.s.
iGrok писал(а):,-)
Это типа новый смайлик - подмигивающий :cyclops:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Немного графической математики

Сообщение iGrok » 18.12.2008 (Чт) 16:07

MIT писал(а):p.s.
iGrok писал(а):,-)
Это типа новый смайлик - подмигивающий :cyclops: [/size]

Именно. =)

MIT писал(а):Переписать-то не проблема... Вот только толку от твоей функции не очень много (имхо по данной теме)

Гм. А ты хоть пробовал её применить? Или она тебе слишком простой показалась, чтобы даже проверять? =)

Вот результататы проверки:
Код: Выделить всё
Картинка: w300, h500. Вписать в: w100, h200.
Моя ф-ция: w=100,000002980232; h=166,66667163372
Твоя: w=60; h=100

Картинка: w1280, h2670. Вписать в: w700, h300.
Моя: w=143,82022857666; h=300,000008046627
Твоя: w=300 h=626

И?
label:
cli
jmp label

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Немного графической математики

Сообщение MIT » 18.12.2008 (Чт) 17:04

Чето ты как-то не правильно мою функцию грузил

Код: Выделить всё
Rect: w=300 h=300 Pic=1024x1028>> myScale: 299x300
Rect: w=300 h=300 Pic=1024x1028>> GetAspect: 299x300
Rect: w=300 h=300 Pic=1424x1028>> myScale: 300x217
Rect: w=300 h=300 Pic=1424x1028>> GetAspect: 300x217
Rect: w=1024 h=300 Pic=1424x1028>> myScale: 416x300
Rect: w=1024 h=300 Pic=1424x1028>> GetAspect: 416x300
Rect: w=1024 h=6533 Pic=1424x1028>> myScale: 1024x739
Rect: w=1024 h=6533 Pic=1424x1028>> GetAspect: 1024x739
Rect: w=1024 h=6533 Pic=1424x1424>> myScale: 1024x1024
Rect: w=1024 h=6533 Pic=1424x1424>> GetAspect: 1024x1024
Rect: w=1424 h=1424 Pic=432x123>> myScale: 1424x405
Rect: w=1424 h=1424 Pic=432x123>> GetAspect: 1424x405
Rect: w=100 h=200 Pic=300x500>> myScale: 120x200 'вот она и ошибочка, я знал, что чувство меня не обманывает...
Rect: w=100 h=200 Pic=300x500>> GetAspect: 100x167
Rect: w=700 h=300 Pic=1280x2670>> myScale: 144x300
Rect: w=700 h=300 Pic=1280x2670>> GetAspect: 144x300


И тем не мение, твоя функция мне больше понравилась (я и вправду не воспринял ее всерьез, т.к. с виду она ниче вроде и не делает)
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Немного графической математики

Сообщение iGrok » 18.12.2008 (Чт) 18:28

MIT писал(а):Чето ты как-то не правильно мою функцию грузил

Гм. Ну может быть. Я в ней особо разбираться не стал - запутанно оно как-то. )
Поэтому проверял "в лоб". Видимо, где-то ошибся. =)
MIT писал(а):И тем не мение, твоя функция мне больше понравилась (я и вправду не воспринял ее всерьез, т.к. с виду она ниче вроде и не делает)

А чего она должна делать? Просто смотрит, во сколько раз нужно уменьшить(увеличить) картинку, чтобы она влезла в заданный прямоугольник.
Сравнивает, по какому из изерений (w/h) отношение размеров картинки и бокса меньше, и выдаёт это число. Всё. )

З.Ы. Ну только проверку на pw, ph <> 0 туда неплохо бы добавить.. )
label:
cli
jmp label

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Немного графической математики

Сообщение MIT » 18.12.2008 (Чт) 19:38

Ну и ладно, ну и хорошо. Спасибо за помощь.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Mail.ru [бот] и гости: 95

    TopList